From b0eb1ae9859d648206bd6b4b884018803d3cb053 Mon Sep 17 00:00:00 2001 From: CrazyJasonwell Date: Fri, 18 Jul 2025 06:44:04 +0800 Subject: [PATCH] vault backup: 2025-07-18 06:44:04 --- .obsidian/community-plugins.json | 6 +- .../plugins/hidden-folder-obsidian/data.json | 4 + .../obsidian-apple-reminders-plugin/main.js | 18866 ++++++++++++++++ .../plugins/recent-files-obsidian/data.json | 8 +- .obsidian/plugins/rss-reader/data.json | 1996 +- .obsidian/workspace.json | 18 +- 01-工作日记/2025-07-18.md | 5 + {60-DevonThink => 60-Imports}/一个测试.md | 0 8 files changed, 20176 insertions(+), 727 deletions(-) create mode 100644 .obsidian/plugins/hidden-folder-obsidian/data.json create mode 100644 .obsidian/plugins/obsidian-apple-reminders-plugin/main.js rename {60-DevonThink => 60-Imports}/一个测试.md (100%) diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 857cba89..6de9bccb 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -2,7 +2,6 @@ "dataview", "obsidian-git", "calendar", - "obsidian-mind-map", "obsidian-dictionary-plugin", "obsidian-image-auto-upload-plugin", "obsidian-excalidraw-plugin", @@ -24,7 +23,6 @@ "editing-toolbar", "rss-reader", "memos-ai-sync", - "memos-sync", "translate", "obsidian-douban-plugin", "obsidian-icon-folder", @@ -41,5 +39,7 @@ "cubox-sync", "obsidian-annotator", "oz-image-plugin", - "file-tree-alternative" + "file-tree-alternative", + "obsidian-apple-reminders-plugin", + "hidden-folder-obsidian" ] \ No newline at end of file diff --git a/.obsidian/plugins/hidden-folder-obsidian/data.json b/.obsidian/plugins/hidden-folder-obsidian/data.json new file mode 100644 index 00000000..064ddd1c --- /dev/null +++ b/.obsidian/plugins/hidden-folder-obsidian/data.json @@ -0,0 +1,4 @@ +{ + "folders": "", + "enable": false +} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-apple-reminders-plugin/main.js b/.obsidian/plugins/obsidian-apple-reminders-plugin/main.js new file mode 100644 index 00000000..f874f723 --- /dev/null +++ b/.obsidian/plugins/obsidian-apple-reminders-plugin/main.js @@ -0,0 +1,18866 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __defProps = Object.defineProperties; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a3, b2) => { + for (var prop in b2 || (b2 = {})) + if (__hasOwnProp.call(b2, prop)) + __defNormalProp(a3, prop, b2[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b2)) { + if (__propIsEnum.call(b2, prop)) + __defNormalProp(a3, prop, b2[prop]); + } + return a3; +}; +var __spreadProps = (a3, b2) => __defProps(a3, __getOwnPropDescs(b2)); +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __decorateClass = (decorators, target, key, kind) => { + var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target; + for (var i4 = decorators.length - 1, decorator; i4 >= 0; i4--) + if (decorator = decorators[i4]) + result = (kind ? decorator(target, key, result) : decorator(result)) || result; + if (kind && result) + __defProp(target, key, result); + return result; +}; +var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e7) { + reject(e7); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e7) { + reject(e7); + } + }; + var step = (x2) => x2.done ? resolve(x2.value) : Promise.resolve(x2.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; + +// node_modules/buffers/index.js +var require_buffers = __commonJS({ + "node_modules/buffers/index.js"(exports, module2) { + module2.exports = Buffers; + function Buffers(bufs) { + if (!(this instanceof Buffers)) + return new Buffers(bufs); + this.buffers = bufs || []; + this.length = this.buffers.reduce(function(size, buf) { + return size + buf.length; + }, 0); + } + Buffers.prototype.push = function() { + for (var i4 = 0; i4 < arguments.length; i4++) { + if (!Buffer.isBuffer(arguments[i4])) { + throw new TypeError("Tried to push a non-buffer"); + } + } + for (var i4 = 0; i4 < arguments.length; i4++) { + var buf = arguments[i4]; + this.buffers.push(buf); + this.length += buf.length; + } + return this.length; + }; + Buffers.prototype.unshift = function() { + for (var i4 = 0; i4 < arguments.length; i4++) { + if (!Buffer.isBuffer(arguments[i4])) { + throw new TypeError("Tried to unshift a non-buffer"); + } + } + for (var i4 = 0; i4 < arguments.length; i4++) { + var buf = arguments[i4]; + this.buffers.unshift(buf); + this.length += buf.length; + } + return this.length; + }; + Buffers.prototype.copy = function(dst, dStart, start, end) { + return this.slice(start, end).copy(dst, dStart, 0, end - start); + }; + Buffers.prototype.splice = function(i4, howMany) { + var buffers = this.buffers; + var index = i4 >= 0 ? i4 : this.length - i4; + var reps = [].slice.call(arguments, 2); + if (howMany === void 0) { + howMany = this.length - index; + } else if (howMany > this.length - index) { + howMany = this.length - index; + } + for (var i4 = 0; i4 < reps.length; i4++) { + this.length += reps[i4].length; + } + var removed = new Buffers(); + var bytes = 0; + var startBytes = 0; + for (var ii = 0; ii < buffers.length && startBytes + buffers[ii].length < index; ii++) { + startBytes += buffers[ii].length; + } + if (index - startBytes > 0) { + var start = index - startBytes; + if (start + howMany < buffers[ii].length) { + removed.push(buffers[ii].slice(start, start + howMany)); + var orig = buffers[ii]; + var buf0 = new Buffer(start); + for (var i4 = 0; i4 < start; i4++) { + buf0[i4] = orig[i4]; + } + var buf1 = new Buffer(orig.length - start - howMany); + for (var i4 = start + howMany; i4 < orig.length; i4++) { + buf1[i4 - howMany - start] = orig[i4]; + } + if (reps.length > 0) { + var reps_ = reps.slice(); + reps_.unshift(buf0); + reps_.push(buf1); + buffers.splice.apply(buffers, [ii, 1].concat(reps_)); + ii += reps_.length; + reps = []; + } else { + buffers.splice(ii, 1, buf0, buf1); + ii += 2; + } + } else { + removed.push(buffers[ii].slice(start)); + buffers[ii] = buffers[ii].slice(0, start); + ii++; + } + } + if (reps.length > 0) { + buffers.splice.apply(buffers, [ii, 0].concat(reps)); + ii += reps.length; + } + while (removed.length < howMany) { + var buf = buffers[ii]; + var len = buf.length; + var take = Math.min(len, howMany - removed.length); + if (take === len) { + removed.push(buf); + buffers.splice(ii, 1); + } else { + removed.push(buf.slice(0, take)); + buffers[ii] = buffers[ii].slice(take); + } + } + this.length -= removed.length; + return removed; + }; + Buffers.prototype.slice = function(i4, j) { + var buffers = this.buffers; + if (j === void 0) + j = this.length; + if (i4 === void 0) + i4 = 0; + if (j > this.length) + j = this.length; + var startBytes = 0; + for (var si = 0; si < buffers.length && startBytes + buffers[si].length <= i4; si++) { + startBytes += buffers[si].length; + } + var target = new Buffer(j - i4); + var ti = 0; + for (var ii = si; ti < j - i4 && ii < buffers.length; ii++) { + var len = buffers[ii].length; + var start = ti === 0 ? i4 - startBytes : 0; + var end = ti + len >= j - i4 ? Math.min(start + (j - i4) - ti, len) : len; + buffers[ii].copy(target, ti, start, end); + ti += end - start; + } + return target; + }; + Buffers.prototype.pos = function(i4) { + if (i4 < 0 || i4 >= this.length) + throw new Error("oob"); + var l5 = i4, bi = 0, bu = null; + for (; ; ) { + bu = this.buffers[bi]; + if (l5 < bu.length) { + return { buf: bi, offset: l5 }; + } else { + l5 -= bu.length; + } + bi++; + } + }; + Buffers.prototype.get = function get(i4) { + var pos = this.pos(i4); + return this.buffers[pos.buf].get(pos.offset); + }; + Buffers.prototype.set = function set2(i4, b2) { + var pos = this.pos(i4); + return this.buffers[pos.buf].set(pos.offset, b2); + }; + Buffers.prototype.indexOf = function(needle, offset) { + if (typeof needle === "string") { + needle = new Buffer(needle); + } else if (needle instanceof Buffer) { + } else { + throw new Error("Invalid type for a search string"); + } + if (!needle.length) { + return 0; + } + if (!this.length) { + return -1; + } + var i4 = 0, j = 0, match = 0, mstart, pos = 0; + if (offset) { + var p2 = this.pos(offset); + i4 = p2.buf; + j = p2.offset; + pos = offset; + } + for (; ; ) { + while (j >= this.buffers[i4].length) { + j = 0; + i4++; + if (i4 >= this.buffers.length) { + return -1; + } + } + var char = this.buffers[i4][j]; + if (char == needle[match]) { + if (match == 0) { + mstart = { + i: i4, + j, + pos + }; + } + match++; + if (match == needle.length) { + return mstart.pos; + } + } else if (match != 0) { + i4 = mstart.i; + j = mstart.j; + pos = mstart.pos; + match = 0; + } + j++; + pos++; + } + }; + Buffers.prototype.toBuffer = function() { + return this.slice(); + }; + Buffers.prototype.toString = function(encoding, start, end) { + return this.slice(start, end).toString(encoding); + }; + } +}); + +// node_modules/node-osascript/lib/osa-parser.js +var require_osa_parser = __commonJS({ + "node_modules/node-osascript/lib/osa-parser.js"(exports, module2) { + "use strict"; + function peg$subclass(child, parent) { + function ctor() { + this.constructor = child; + } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + } + function peg$SyntaxError(message, expected, found, location) { + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, peg$SyntaxError); + } + } + peg$subclass(peg$SyntaxError, Error); + peg$SyntaxError.buildMessage = function(expected, found) { + var DESCRIBE_EXPECTATION_FNS = { + literal: function(expectation) { + return '"' + literalEscape(expectation.text) + '"'; + }, + "class": function(expectation) { + var escapedParts = "", i4; + for (i4 = 0; i4 < expectation.parts.length; i4++) { + escapedParts += expectation.parts[i4] instanceof Array ? classEscape(expectation.parts[i4][0]) + "-" + classEscape(expectation.parts[i4][1]) : classEscape(expectation.parts[i4]); + } + return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; + }, + any: function(expectation) { + return "any character"; + }, + end: function(expectation) { + return "end of input"; + }, + other: function(expectation) { + return expectation.description; + } + }; + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + function literalEscape(s5) { + return s5.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function(ch) { + return "\\x0" + hex(ch); + }).replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { + return "\\x" + hex(ch); + }); + } + function classEscape(s5) { + return s5.replace(/\\/g, "\\\\").replace(/\]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function(ch) { + return "\\x0" + hex(ch); + }).replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { + return "\\x" + hex(ch); + }); + } + function describeExpectation(expectation) { + return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); + } + function describeExpected(expected2) { + var descriptions = new Array(expected2.length), i4, j; + for (i4 = 0; i4 < expected2.length; i4++) { + descriptions[i4] = describeExpectation(expected2[i4]); + } + descriptions.sort(); + if (descriptions.length > 0) { + for (i4 = 1, j = 1; i4 < descriptions.length; i4++) { + if (descriptions[i4 - 1] !== descriptions[i4]) { + descriptions[j] = descriptions[i4]; + j++; + } + } + descriptions.length = j; + } + switch (descriptions.length) { + case 1: + return descriptions[0]; + case 2: + return descriptions[0] + " or " + descriptions[1]; + default: + return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1]; + } + } + function describeFound(found2) { + return found2 ? '"' + literalEscape(found2) + '"' : "end of input"; + } + return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; + }; + function peg$parse(input, options) { + options = options !== void 0 ? options : {}; + var peg$FAILED = {}, peg$startRuleFunctions = { osascript: peg$parseosascript }, peg$startRuleFunction = peg$parseosascript, peg$c0 = function(value) { + return value; + }, peg$c1 = "{", peg$c2 = peg$literalExpectation("{", false), peg$c3 = "}", peg$c4 = peg$literalExpectation("}", false), peg$c5 = ":", peg$c6 = peg$literalExpectation(":", false), peg$c7 = ",", peg$c8 = peg$literalExpectation(",", false), peg$c9 = peg$otherExpectation("whitespace"), peg$c10 = /^[ \t\n\r]/, peg$c11 = peg$classExpectation([" ", " ", "\n", "\r"], false, false), peg$c12 = "false", peg$c13 = peg$literalExpectation("false", false), peg$c14 = function() { + return false; + }, peg$c15 = "true", peg$c16 = peg$literalExpectation("true", false), peg$c17 = function() { + return true; + }, peg$c18 = peg$anyExpectation(), peg$c19 = function(chars) { + return chars.length > 0 ? chars.join("") : null; + }, peg$c20 = function(first, m2) { + return m2; + }, peg$c21 = function(first, rest) { + var result = {}, i4; + result[first.name] = first.value; + for (i4 = 0; i4 < rest.length; i4++) { + result[rest[i4].name] = rest[i4].value; + } + return result; + }, peg$c22 = function(members) { + return members !== null ? members : {}; + }, peg$c23 = function(name, value) { + return { name, value }; + }, peg$c24 = /^[ a-z0-9\-]/i, peg$c25 = peg$classExpectation([" ", ["a", "z"], ["0", "9"], "-"], false, true), peg$c26 = function(chars) { + return chars.join("").trim(); + }, peg$c27 = function(first, v2) { + return v2; + }, peg$c28 = function(first, rest) { + return [first].concat(rest); + }, peg$c29 = function(values) { + return values !== null ? values : []; + }, peg$c30 = peg$otherExpectation("number"), peg$c31 = function() { + return parseFloat(text()); + }, peg$c32 = ".", peg$c33 = peg$literalExpectation(".", false), peg$c34 = /^[1-9]/, peg$c35 = peg$classExpectation([["1", "9"]], false, false), peg$c36 = /^[eE]/, peg$c37 = peg$classExpectation(["e", "E"], false, false), peg$c38 = "-", peg$c39 = peg$literalExpectation("-", false), peg$c40 = "+", peg$c41 = peg$literalExpectation("+", false), peg$c42 = "0", peg$c43 = peg$literalExpectation("0", false), peg$c44 = peg$otherExpectation("string"), peg$c45 = function(chars) { + return chars.join(""); + }, peg$c46 = "\n", peg$c47 = peg$literalExpectation("\n", false), peg$c48 = " ", peg$c49 = peg$literalExpectation(" ", false), peg$c50 = '"', peg$c51 = peg$literalExpectation('"', false), peg$c52 = "\\", peg$c53 = peg$literalExpectation("\\", false), peg$c54 = "/", peg$c55 = peg$literalExpectation("/", false), peg$c56 = "b", peg$c57 = peg$literalExpectation("b", false), peg$c58 = function() { + return "\b"; + }, peg$c59 = "f", peg$c60 = peg$literalExpectation("f", false), peg$c61 = function() { + return "\f"; + }, peg$c62 = "n", peg$c63 = peg$literalExpectation("n", false), peg$c64 = function() { + return "\n"; + }, peg$c65 = "r", peg$c66 = peg$literalExpectation("r", false), peg$c67 = function() { + return "\r"; + }, peg$c68 = "t", peg$c69 = peg$literalExpectation("t", false), peg$c70 = function() { + return " "; + }, peg$c71 = "u", peg$c72 = peg$literalExpectation("u", false), peg$c73 = function(digits) { + return String.fromCharCode(parseInt(digits, 16)); + }, peg$c74 = function(sequence) { + return sequence; + }, peg$c75 = /^[^\0-\x1F"\\]/, peg$c76 = peg$classExpectation([["\0", ""], '"', "\\"], true, false), peg$c77 = peg$otherExpectation("unquoted string"), peg$c78 = function(first_char, chars) { + return first_char + chars.join(""); + }, peg$c79 = /^[a-z ]/, peg$c80 = peg$classExpectation([["a", "z"], " "], false, false), peg$c81 = /^[^,}]/, peg$c82 = peg$classExpectation([",", "}"], true, false), peg$c83 = peg$otherExpectation("date"), peg$c84 = "date", peg$c85 = peg$literalExpectation("date", false), peg$c86 = function(date) { + var dateObject = new Date(date); + return !isNaN(dateObject.getTime()) ? dateObject : date; + }, peg$c87 = /^[0-9]/, peg$c88 = peg$classExpectation([["0", "9"]], false, false), peg$c89 = /^[0-9a-f]/i, peg$c90 = peg$classExpectation([["0", "9"], ["a", "f"]], false, true), peg$currPos = 0, peg$savedPos = 0, peg$posDetailsCache = [{ line: 1, column: 1 }], peg$maxFailPos = 0, peg$maxFailExpected = [], peg$silentFails = 0, peg$result; + if ("startRule" in options) { + if (!(options.startRule in peg$startRuleFunctions)) { + throw new Error(`Can't start parsing from rule "` + options.startRule + '".'); + } + peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; + } + function text() { + return input.substring(peg$savedPos, peg$currPos); + } + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } + function expected(description, location2) { + location2 = location2 !== void 0 ? location2 : peg$computeLocation(peg$savedPos, peg$currPos); + throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location2); + } + function error(message, location2) { + location2 = location2 !== void 0 ? location2 : peg$computeLocation(peg$savedPos, peg$currPos); + throw peg$buildSimpleError(message, location2); + } + function peg$literalExpectation(text2, ignoreCase) { + return { type: "literal", text: text2, ignoreCase }; + } + function peg$classExpectation(parts, inverted, ignoreCase) { + return { type: "class", parts, inverted, ignoreCase }; + } + function peg$anyExpectation() { + return { type: "any" }; + } + function peg$endExpectation() { + return { type: "end" }; + } + function peg$otherExpectation(description) { + return { type: "other", description }; + } + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos], p2; + if (details) { + return details; + } else { + p2 = pos - 1; + while (!peg$posDetailsCache[p2]) { + p2--; + } + details = peg$posDetailsCache[p2]; + details = { + line: details.line, + column: details.column + }; + while (p2 < pos) { + if (input.charCodeAt(p2) === 10) { + details.line++; + details.column = 1; + } else { + details.column++; + } + p2++; + } + peg$posDetailsCache[pos] = details; + return details; + } + } + function peg$computeLocation(startPos, endPos) { + var startPosDetails = peg$computePosDetails(startPos), endPosDetails = peg$computePosDetails(endPos); + return { + start: { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }, + end: { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column + } + }; + } + function peg$fail(expected2) { + if (peg$currPos < peg$maxFailPos) { + return; + } + if (peg$currPos > peg$maxFailPos) { + peg$maxFailPos = peg$currPos; + peg$maxFailExpected = []; + } + peg$maxFailExpected.push(expected2); + } + function peg$buildSimpleError(message, location2) { + return new peg$SyntaxError(message, null, null, location2); + } + function peg$buildStructuredError(expected2, found, location2) { + return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected2, found), expected2, found, location2); + } + function peg$parseosascript() { + var s0, s1, s22, s32; + s0 = peg$currPos; + s1 = peg$parsews(); + if (s1 !== peg$FAILED) { + s22 = peg$parsevalue(); + if (s22 !== peg$FAILED) { + s32 = peg$parsews(); + if (s32 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c0(s22); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parsebegin_object() { + var s0, s1, s22, s32; + s0 = peg$currPos; + s1 = peg$parsews(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 123) { + s22 = peg$c1; + peg$currPos++; + } else { + s22 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c2); + } + } + if (s22 !== peg$FAILED) { + s32 = peg$parsews(); + if (s32 !== peg$FAILED) { + s1 = [s1, s22, s32]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parseend_object() { + var s0, s1, s22, s32; + s0 = peg$currPos; + s1 = peg$parsews(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s22 = peg$c3; + peg$currPos++; + } else { + s22 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c4); + } + } + if (s22 !== peg$FAILED) { + s32 = peg$parsews(); + if (s32 !== peg$FAILED) { + s1 = [s1, s22, s32]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parsename_separator() { + var s0, s1, s22, s32; + s0 = peg$currPos; + s1 = peg$parsews(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 58) { + s22 = peg$c5; + peg$currPos++; + } else { + s22 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c6); + } + } + if (s22 !== peg$FAILED) { + s32 = peg$parsews(); + if (s32 !== peg$FAILED) { + s1 = [s1, s22, s32]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parsevalue_separator() { + var s0, s1, s22, s32; + s0 = peg$currPos; + s1 = peg$parsews(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s22 = peg$c7; + peg$currPos++; + } else { + s22 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c8); + } + } + if (s22 !== peg$FAILED) { + s32 = peg$parsews(); + if (s32 !== peg$FAILED) { + s1 = [s1, s22, s32]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parsews() { + var s0, s1; + peg$silentFails++; + s0 = []; + if (peg$c10.test(input.charAt(peg$currPos))) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c11); + } + } + while (s1 !== peg$FAILED) { + s0.push(s1); + if (peg$c10.test(input.charAt(peg$currPos))) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c11); + } + } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c9); + } + } + return s0; + } + function peg$parsevalue() { + var s0; + s0 = peg$parsefalse(); + if (s0 === peg$FAILED) { + s0 = peg$parsetrue(); + if (s0 === peg$FAILED) { + s0 = peg$parseobject(); + if (s0 === peg$FAILED) { + s0 = peg$parsearray(); + if (s0 === peg$FAILED) { + s0 = peg$parsenumber(); + if (s0 === peg$FAILED) { + s0 = peg$parsestring(); + if (s0 === peg$FAILED) { + s0 = peg$parsedate(); + if (s0 === peg$FAILED) { + s0 = peg$parseunquoted_string(); + if (s0 === peg$FAILED) { + s0 = peg$parseraw(); + } + } + } + } + } + } + } + } + return s0; + } + function peg$parsefalse() { + var s0, s1; + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c12) { + s1 = peg$c12; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c13); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c14(); + } + s0 = s1; + return s0; + } + function peg$parsetrue() { + var s0, s1; + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c15) { + s1 = peg$c15; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c16); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c17(); + } + s0 = s1; + return s0; + } + function peg$parseraw() { + var s0, s1, s22, s32; + s0 = peg$currPos; + s1 = peg$parsews(); + if (s1 !== peg$FAILED) { + s22 = []; + if (input.length > peg$currPos) { + s32 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s32 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c18); + } + } + while (s32 !== peg$FAILED) { + s22.push(s32); + if (input.length > peg$currPos) { + s32 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s32 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c18); + } + } + } + if (s22 !== peg$FAILED) { + s32 = peg$parsews(); + if (s32 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c19(s22); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parseobject() { + var s0, s1, s22, s32, s42, s5, s6, s7; + s0 = peg$currPos; + s1 = peg$parsebegin_object(); + if (s1 !== peg$FAILED) { + s22 = peg$currPos; + s32 = peg$parsemember(); + if (s32 !== peg$FAILED) { + s42 = []; + s5 = peg$currPos; + s6 = peg$parsevalue_separator(); + if (s6 !== peg$FAILED) { + s7 = peg$parsemember(); + if (s7 !== peg$FAILED) { + peg$savedPos = s5; + s6 = peg$c20(s32, s7); + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + while (s5 !== peg$FAILED) { + s42.push(s5); + s5 = peg$currPos; + s6 = peg$parsevalue_separator(); + if (s6 !== peg$FAILED) { + s7 = peg$parsemember(); + if (s7 !== peg$FAILED) { + peg$savedPos = s5; + s6 = peg$c20(s32, s7); + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } + if (s42 !== peg$FAILED) { + peg$savedPos = s22; + s32 = peg$c21(s32, s42); + s22 = s32; + } else { + peg$currPos = s22; + s22 = peg$FAILED; + } + } else { + peg$currPos = s22; + s22 = peg$FAILED; + } + if (s22 === peg$FAILED) { + s22 = null; + } + if (s22 !== peg$FAILED) { + s32 = peg$parseend_object(); + if (s32 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c22(s22); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parsemember() { + var s0, s1, s22, s32; + s0 = peg$currPos; + s1 = peg$parsekey(); + if (s1 !== peg$FAILED) { + s22 = peg$parsename_separator(); + if (s22 !== peg$FAILED) { + s32 = peg$parsevalue(); + if (s32 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c23(s1, s32); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parsekey() { + var s0, s1, s22; + s0 = peg$currPos; + s1 = []; + if (peg$c24.test(input.charAt(peg$currPos))) { + s22 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s22 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c25); + } + } + if (s22 !== peg$FAILED) { + while (s22 !== peg$FAILED) { + s1.push(s22); + if (peg$c24.test(input.charAt(peg$currPos))) { + s22 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s22 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c25); + } + } + } + } else { + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c26(s1); + } + s0 = s1; + return s0; + } + function peg$parsearray() { + var s0, s1, s22, s32, s42, s5, s6, s7; + s0 = peg$currPos; + s1 = peg$parsebegin_object(); + if (s1 !== peg$FAILED) { + s22 = peg$currPos; + s32 = peg$parsevalue(); + if (s32 !== peg$FAILED) { + s42 = []; + s5 = peg$currPos; + s6 = peg$parsevalue_separator(); + if (s6 !== peg$FAILED) { + s7 = peg$parsevalue(); + if (s7 !== peg$FAILED) { + peg$savedPos = s5; + s6 = peg$c27(s32, s7); + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + while (s5 !== peg$FAILED) { + s42.push(s5); + s5 = peg$currPos; + s6 = peg$parsevalue_separator(); + if (s6 !== peg$FAILED) { + s7 = peg$parsevalue(); + if (s7 !== peg$FAILED) { + peg$savedPos = s5; + s6 = peg$c27(s32, s7); + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } + if (s42 !== peg$FAILED) { + peg$savedPos = s22; + s32 = peg$c28(s32, s42); + s22 = s32; + } else { + peg$currPos = s22; + s22 = peg$FAILED; + } + } else { + peg$currPos = s22; + s22 = peg$FAILED; + } + if (s22 === peg$FAILED) { + s22 = null; + } + if (s22 !== peg$FAILED) { + s32 = peg$parseend_object(); + if (s32 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c29(s22); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parsenumber() { + var s0, s1, s22, s32, s42; + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parseminus(); + if (s1 === peg$FAILED) { + s1 = null; + } + if (s1 !== peg$FAILED) { + s22 = peg$parseint(); + if (s22 !== peg$FAILED) { + s32 = peg$parsefrac(); + if (s32 === peg$FAILED) { + s32 = null; + } + if (s32 !== peg$FAILED) { + s42 = peg$parseexp(); + if (s42 === peg$FAILED) { + s42 = null; + } + if (s42 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c31(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c30); + } + } + return s0; + } + function peg$parsedecimal_point() { + var s0; + if (input.charCodeAt(peg$currPos) === 46) { + s0 = peg$c32; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c33); + } + } + return s0; + } + function peg$parsedigit1_9() { + var s0; + if (peg$c34.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c35); + } + } + return s0; + } + function peg$parsee() { + var s0; + if (peg$c36.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c37); + } + } + return s0; + } + function peg$parseexp() { + var s0, s1, s22, s32, s42; + s0 = peg$currPos; + s1 = peg$parsee(); + if (s1 !== peg$FAILED) { + s22 = peg$parseminus(); + if (s22 === peg$FAILED) { + s22 = peg$parseplus(); + } + if (s22 === peg$FAILED) { + s22 = null; + } + if (s22 !== peg$FAILED) { + s32 = []; + s42 = peg$parseDIGIT(); + if (s42 !== peg$FAILED) { + while (s42 !== peg$FAILED) { + s32.push(s42); + s42 = peg$parseDIGIT(); + } + } else { + s32 = peg$FAILED; + } + if (s32 !== peg$FAILED) { + s1 = [s1, s22, s32]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parsefrac() { + var s0, s1, s22, s32; + s0 = peg$currPos; + s1 = peg$parsedecimal_point(); + if (s1 !== peg$FAILED) { + s22 = []; + s32 = peg$parseDIGIT(); + if (s32 !== peg$FAILED) { + while (s32 !== peg$FAILED) { + s22.push(s32); + s32 = peg$parseDIGIT(); + } + } else { + s22 = peg$FAILED; + } + if (s22 !== peg$FAILED) { + s1 = [s1, s22]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + return s0; + } + function peg$parseint() { + var s0, s1, s22, s32; + s0 = peg$parsezero(); + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsedigit1_9(); + if (s1 !== peg$FAILED) { + s22 = []; + s32 = peg$parseDIGIT(); + while (s32 !== peg$FAILED) { + s22.push(s32); + s32 = peg$parseDIGIT(); + } + if (s22 !== peg$FAILED) { + s1 = [s1, s22]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + return s0; + } + function peg$parseminus() { + var s0; + if (input.charCodeAt(peg$currPos) === 45) { + s0 = peg$c38; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c39); + } + } + return s0; + } + function peg$parseplus() { + var s0; + if (input.charCodeAt(peg$currPos) === 43) { + s0 = peg$c40; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c41); + } + } + return s0; + } + function peg$parsezero() { + var s0; + if (input.charCodeAt(peg$currPos) === 48) { + s0 = peg$c42; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c43); + } + } + return s0; + } + function peg$parsestring() { + var s0, s1, s22, s32; + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parsequotation_mark(); + if (s1 !== peg$FAILED) { + s22 = []; + s32 = peg$parsechar(); + while (s32 !== peg$FAILED) { + s22.push(s32); + s32 = peg$parsechar(); + } + if (s22 !== peg$FAILED) { + s32 = peg$parsequotation_mark(); + if (s32 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c45(s22); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c44); + } + } + return s0; + } + function peg$parsechar() { + var s0, s1, s22, s32, s42, s5, s6, s7, s8, s9; + s0 = peg$parseunescaped(); + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 10) { + s0 = peg$c46; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c47); + } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 9) { + s0 = peg$c48; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c49); + } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseescape(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 34) { + s22 = peg$c50; + peg$currPos++; + } else { + s22 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c51); + } + } + if (s22 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s22 = peg$c52; + peg$currPos++; + } else { + s22 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c53); + } + } + if (s22 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 47) { + s22 = peg$c54; + peg$currPos++; + } else { + s22 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c55); + } + } + if (s22 === peg$FAILED) { + s22 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 98) { + s32 = peg$c56; + peg$currPos++; + } else { + s32 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c57); + } + } + if (s32 !== peg$FAILED) { + peg$savedPos = s22; + s32 = peg$c58(); + } + s22 = s32; + if (s22 === peg$FAILED) { + s22 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 102) { + s32 = peg$c59; + peg$currPos++; + } else { + s32 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c60); + } + } + if (s32 !== peg$FAILED) { + peg$savedPos = s22; + s32 = peg$c61(); + } + s22 = s32; + if (s22 === peg$FAILED) { + s22 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 110) { + s32 = peg$c62; + peg$currPos++; + } else { + s32 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c63); + } + } + if (s32 !== peg$FAILED) { + peg$savedPos = s22; + s32 = peg$c64(); + } + s22 = s32; + if (s22 === peg$FAILED) { + s22 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 114) { + s32 = peg$c65; + peg$currPos++; + } else { + s32 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c66); + } + } + if (s32 !== peg$FAILED) { + peg$savedPos = s22; + s32 = peg$c67(); + } + s22 = s32; + if (s22 === peg$FAILED) { + s22 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 116) { + s32 = peg$c68; + peg$currPos++; + } else { + s32 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c69); + } + } + if (s32 !== peg$FAILED) { + peg$savedPos = s22; + s32 = peg$c70(); + } + s22 = s32; + if (s22 === peg$FAILED) { + s22 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 117) { + s32 = peg$c71; + peg$currPos++; + } else { + s32 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c72); + } + } + if (s32 !== peg$FAILED) { + s42 = peg$currPos; + s5 = peg$currPos; + s6 = peg$parseHEXDIG(); + if (s6 !== peg$FAILED) { + s7 = peg$parseHEXDIG(); + if (s7 !== peg$FAILED) { + s8 = peg$parseHEXDIG(); + if (s8 !== peg$FAILED) { + s9 = peg$parseHEXDIG(); + if (s9 !== peg$FAILED) { + s6 = [s6, s7, s8, s9]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + if (s5 !== peg$FAILED) { + s42 = input.substring(s42, peg$currPos); + } else { + s42 = s5; + } + if (s42 !== peg$FAILED) { + peg$savedPos = s22; + s32 = peg$c73(s42); + s22 = s32; + } else { + peg$currPos = s22; + s22 = peg$FAILED; + } + } else { + peg$currPos = s22; + s22 = peg$FAILED; + } + } + } + } + } + } + } + } + } + if (s22 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c74(s22); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + return s0; + } + function peg$parseescape() { + var s0; + if (input.charCodeAt(peg$currPos) === 92) { + s0 = peg$c52; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c53); + } + } + return s0; + } + function peg$parsequotation_mark() { + var s0; + if (input.charCodeAt(peg$currPos) === 34) { + s0 = peg$c50; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c51); + } + } + return s0; + } + function peg$parseunescaped() { + var s0; + if (peg$c75.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c76); + } + } + return s0; + } + function peg$parseunquoted_string() { + var s0, s1, s22, s32; + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parsefirst_unquoted_char(); + if (s1 !== peg$FAILED) { + s22 = []; + s32 = peg$parseunquoted_char(); + while (s32 !== peg$FAILED) { + s22.push(s32); + s32 = peg$parseunquoted_char(); + } + if (s22 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c78(s1, s22); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c77); + } + } + return s0; + } + function peg$parsefirst_unquoted_char() { + var s0; + if (peg$c79.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c80); + } + } + return s0; + } + function peg$parseunquoted_char() { + var s0; + if (peg$c81.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c82); + } + } + return s0; + } + function peg$parsedate() { + var s0, s1, s22, s32; + peg$silentFails++; + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c84) { + s1 = peg$c84; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c85); + } + } + if (s1 !== peg$FAILED) { + s22 = peg$parsews(); + if (s22 !== peg$FAILED) { + s32 = peg$parsestring(); + if (s32 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c86(s32); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c83); + } + } + return s0; + } + function peg$parseDIGIT() { + var s0; + if (peg$c87.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c88); + } + } + return s0; + } + function peg$parseHEXDIG() { + var s0; + if (peg$c89.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c90); + } + } + return s0; + } + peg$result = peg$startRuleFunction(); + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$fail(peg$endExpectation()); + } + throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)); + } + } + module2.exports = { + SyntaxError: peg$SyntaxError, + parse: peg$parse + }; + } +}); + +// node_modules/node-osascript/lib/osa-vargen.js +var require_osa_vargen = __commonJS({ + "node_modules/node-osascript/lib/osa-vargen.js"(exports, module2) { + function serializeObject(value) { + if (value === null) { + return ""; + } + var result; + var typeOf = typeof value; + if (typeOf === "object" && value !== null) { + result = "{"; + if (Array.isArray(value)) { + value.forEach(function(arrayValue, i4) { + if (i4 !== 0) { + result += ","; + } + result += serializeObject(arrayValue); + }); + } else { + Object.keys(value).forEach(function(key, i4) { + if (i4 !== 0) { + result += ","; + } + result += key + ":" + serializeObject(value[key]); + }); + } + result += "}"; + } else if (typeOf === "string") { + result = '"' + value + '"'; + } else if (value === void 0) { + result = "null"; + } + return result || value; + } + module2.exports = { + serializeObject, + generate: function(object) { + var aScript = ""; + Object.keys(object).forEach(function(key) { + aScript += "set " + key + " to " + serializeObject(object[key]) + "\n"; + }); + return aScript; + } + }; + } +}); + +// node_modules/node-osascript/lib/index.js +var require_lib = __commonJS({ + "node_modules/node-osascript/lib/index.js"(exports, module2) { + var spawn = require("child_process").spawn; + var dirname = require("path").dirname; + var readFileSync = require("fs").readFileSync; + var Buffers = require_buffers(); + var parse3 = require_osa_parser().parse; + var varGenerator = require_osa_vargen().generate; + var bufferStream = function(stream) { + var buffer = new Buffers(); + stream.on("data", function(chunk) { + buffer.push(chunk); + }); + return buffer; + }; + var execute = function(path, script, vars, cb) { + if (cb === void 0) { + cb = vars; + } + var opts; + if (typeof path === "undefined") { + opts = {}; + } else { + opts = { cwd: dirname(path) }; + } + var cp = spawn("osascript", ["-ss", "-"], opts); + var outBuffer = bufferStream(cp.stdout); + var errBuffer = bufferStream(cp.stderr); + cp.on("close", function(code) { + var error; + var result; + if (code) { + error = new Error(errBuffer.toString()); + } else { + try { + result = parse3(outBuffer.toString()); + } catch (err) { + error = err; + } + } + if (cb) { + cb(error, result, outBuffer); + } + }); + if (!script) { + script = readFileSync(path); + } + if (vars) { + script = varGenerator(vars) + "\n" + script; + } + cp.stdin.write(script); + cp.stdin.end(); + return cp; + }; + module2.exports = { + execute: function(script, vars, cb) { + return execute(void 0, script, vars, cb); + }, + executeFile: function(path, vars, cb) { + return execute(path, void 0, vars, cb); + } + }; + } +}); + +// node_modules/chrono-node/dist/utils/pattern.js +var require_pattern = __commonJS({ + "node_modules/chrono-node/dist/utils/pattern.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.matchAnyPattern = exports.extractTerms = exports.repeatedTimeunitPattern = void 0; + function repeatedTimeunitPattern(prefix, singleTimeunitPattern) { + const singleTimeunitPatternNoCapture = singleTimeunitPattern.replace(/\((?!\?)/g, "(?:"); + return `${prefix}${singleTimeunitPatternNoCapture}\\s{0,5}(?:,?\\s{0,5}${singleTimeunitPatternNoCapture}){0,10}`; + } + exports.repeatedTimeunitPattern = repeatedTimeunitPattern; + function extractTerms(dictionary) { + let keys; + if (dictionary instanceof Array) { + keys = [...dictionary]; + } else if (dictionary instanceof Map) { + keys = Array.from(dictionary.keys()); + } else { + keys = Object.keys(dictionary); + } + return keys; + } + exports.extractTerms = extractTerms; + function matchAnyPattern(dictionary) { + const joinedTerms = extractTerms(dictionary).sort((a3, b2) => b2.length - a3.length).join("|").replace(/\./g, "\\."); + return `(?:${joinedTerms})`; + } + exports.matchAnyPattern = matchAnyPattern; + } +}); + +// node_modules/dayjs/dayjs.min.js +var require_dayjs_min = __commonJS({ + "node_modules/dayjs/dayjs.min.js"(exports, module2) { + !function(t3, e7) { + typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = e7() : typeof define == "function" && define.amd ? define(e7) : (t3 = typeof globalThis != "undefined" ? globalThis : t3 || self).dayjs = e7(); + }(exports, function() { + "use strict"; + var t3 = 1e3, e7 = 6e4, n6 = 36e5, r4 = "millisecond", i4 = "second", s5 = "minute", u2 = "hour", a3 = "day", o6 = "week", f2 = "month", h3 = "quarter", c3 = "year", d3 = "date", $2 = "Invalid Date", l5 = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y2 = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M2 = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_") }, m2 = function(t4, e8, n7) { + var r5 = String(t4); + return !r5 || r5.length >= e8 ? t4 : "" + Array(e8 + 1 - r5.length).join(n7) + t4; + }, g2 = { s: m2, z: function(t4) { + var e8 = -t4.utcOffset(), n7 = Math.abs(e8), r5 = Math.floor(n7 / 60), i5 = n7 % 60; + return (e8 <= 0 ? "+" : "-") + m2(r5, 2, "0") + ":" + m2(i5, 2, "0"); + }, m: function t4(e8, n7) { + if (e8.date() < n7.date()) + return -t4(n7, e8); + var r5 = 12 * (n7.year() - e8.year()) + (n7.month() - e8.month()), i5 = e8.clone().add(r5, f2), s6 = n7 - i5 < 0, u3 = e8.clone().add(r5 + (s6 ? -1 : 1), f2); + return +(-(r5 + (n7 - i5) / (s6 ? i5 - u3 : u3 - i5)) || 0); + }, a: function(t4) { + return t4 < 0 ? Math.ceil(t4) || 0 : Math.floor(t4); + }, p: function(t4) { + return { M: f2, y: c3, w: o6, d: a3, D: d3, h: u2, m: s5, s: i4, ms: r4, Q: h3 }[t4] || String(t4 || "").toLowerCase().replace(/s$/, ""); + }, u: function(t4) { + return t4 === void 0; + } }, v2 = "en", D = {}; + D[v2] = M2; + var p2 = function(t4) { + return t4 instanceof _2; + }, S3 = function t4(e8, n7, r5) { + var i5; + if (!e8) + return v2; + if (typeof e8 == "string") { + var s6 = e8.toLowerCase(); + D[s6] && (i5 = s6), n7 && (D[s6] = n7, i5 = s6); + var u3 = e8.split("-"); + if (!i5 && u3.length > 1) + return t4(u3[0]); + } else { + var a4 = e8.name; + D[a4] = e8, i5 = a4; + } + return !r5 && i5 && (v2 = i5), i5 || !r5 && v2; + }, w2 = function(t4, e8) { + if (p2(t4)) + return t4.clone(); + var n7 = typeof e8 == "object" ? e8 : {}; + return n7.date = t4, n7.args = arguments, new _2(n7); + }, O = g2; + O.l = S3, O.i = p2, O.w = function(t4, e8) { + return w2(t4, { locale: e8.$L, utc: e8.$u, x: e8.$x, $offset: e8.$offset }); + }; + var _2 = function() { + function M3(t4) { + this.$L = S3(t4.locale, null, true), this.parse(t4); + } + var m3 = M3.prototype; + return m3.parse = function(t4) { + this.$d = function(t5) { + var e8 = t5.date, n7 = t5.utc; + if (e8 === null) + return new Date(NaN); + if (O.u(e8)) + return new Date(); + if (e8 instanceof Date) + return new Date(e8); + if (typeof e8 == "string" && !/Z$/i.test(e8)) { + var r5 = e8.match(l5); + if (r5) { + var i5 = r5[2] - 1 || 0, s6 = (r5[7] || "0").substring(0, 3); + return n7 ? new Date(Date.UTC(r5[1], i5, r5[3] || 1, r5[4] || 0, r5[5] || 0, r5[6] || 0, s6)) : new Date(r5[1], i5, r5[3] || 1, r5[4] || 0, r5[5] || 0, r5[6] || 0, s6); + } + } + return new Date(e8); + }(t4), this.$x = t4.x || {}, this.init(); + }, m3.init = function() { + var t4 = this.$d; + this.$y = t4.getFullYear(), this.$M = t4.getMonth(), this.$D = t4.getDate(), this.$W = t4.getDay(), this.$H = t4.getHours(), this.$m = t4.getMinutes(), this.$s = t4.getSeconds(), this.$ms = t4.getMilliseconds(); + }, m3.$utils = function() { + return O; + }, m3.isValid = function() { + return !(this.$d.toString() === $2); + }, m3.isSame = function(t4, e8) { + var n7 = w2(t4); + return this.startOf(e8) <= n7 && n7 <= this.endOf(e8); + }, m3.isAfter = function(t4, e8) { + return w2(t4) < this.startOf(e8); + }, m3.isBefore = function(t4, e8) { + return this.endOf(e8) < w2(t4); + }, m3.$g = function(t4, e8, n7) { + return O.u(t4) ? this[e8] : this.set(n7, t4); + }, m3.unix = function() { + return Math.floor(this.valueOf() / 1e3); + }, m3.valueOf = function() { + return this.$d.getTime(); + }, m3.startOf = function(t4, e8) { + var n7 = this, r5 = !!O.u(e8) || e8, h4 = O.p(t4), $3 = function(t5, e9) { + var i5 = O.w(n7.$u ? Date.UTC(n7.$y, e9, t5) : new Date(n7.$y, e9, t5), n7); + return r5 ? i5 : i5.endOf(a3); + }, l6 = function(t5, e9) { + return O.w(n7.toDate()[t5].apply(n7.toDate("s"), (r5 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e9)), n7); + }, y3 = this.$W, M4 = this.$M, m4 = this.$D, g3 = "set" + (this.$u ? "UTC" : ""); + switch (h4) { + case c3: + return r5 ? $3(1, 0) : $3(31, 11); + case f2: + return r5 ? $3(1, M4) : $3(0, M4 + 1); + case o6: + var v3 = this.$locale().weekStart || 0, D2 = (y3 < v3 ? y3 + 7 : y3) - v3; + return $3(r5 ? m4 - D2 : m4 + (6 - D2), M4); + case a3: + case d3: + return l6(g3 + "Hours", 0); + case u2: + return l6(g3 + "Minutes", 1); + case s5: + return l6(g3 + "Seconds", 2); + case i4: + return l6(g3 + "Milliseconds", 3); + default: + return this.clone(); + } + }, m3.endOf = function(t4) { + return this.startOf(t4, false); + }, m3.$set = function(t4, e8) { + var n7, o7 = O.p(t4), h4 = "set" + (this.$u ? "UTC" : ""), $3 = (n7 = {}, n7[a3] = h4 + "Date", n7[d3] = h4 + "Date", n7[f2] = h4 + "Month", n7[c3] = h4 + "FullYear", n7[u2] = h4 + "Hours", n7[s5] = h4 + "Minutes", n7[i4] = h4 + "Seconds", n7[r4] = h4 + "Milliseconds", n7)[o7], l6 = o7 === a3 ? this.$D + (e8 - this.$W) : e8; + if (o7 === f2 || o7 === c3) { + var y3 = this.clone().set(d3, 1); + y3.$d[$3](l6), y3.init(), this.$d = y3.set(d3, Math.min(this.$D, y3.daysInMonth())).$d; + } else + $3 && this.$d[$3](l6); + return this.init(), this; + }, m3.set = function(t4, e8) { + return this.clone().$set(t4, e8); + }, m3.get = function(t4) { + return this[O.p(t4)](); + }, m3.add = function(r5, h4) { + var d4, $3 = this; + r5 = Number(r5); + var l6 = O.p(h4), y3 = function(t4) { + var e8 = w2($3); + return O.w(e8.date(e8.date() + Math.round(t4 * r5)), $3); + }; + if (l6 === f2) + return this.set(f2, this.$M + r5); + if (l6 === c3) + return this.set(c3, this.$y + r5); + if (l6 === a3) + return y3(1); + if (l6 === o6) + return y3(7); + var M4 = (d4 = {}, d4[s5] = e7, d4[u2] = n6, d4[i4] = t3, d4)[l6] || 1, m4 = this.$d.getTime() + r5 * M4; + return O.w(m4, this); + }, m3.subtract = function(t4, e8) { + return this.add(-1 * t4, e8); + }, m3.format = function(t4) { + var e8 = this, n7 = this.$locale(); + if (!this.isValid()) + return n7.invalidDate || $2; + var r5 = t4 || "YYYY-MM-DDTHH:mm:ssZ", i5 = O.z(this), s6 = this.$H, u3 = this.$m, a4 = this.$M, o7 = n7.weekdays, f3 = n7.months, h4 = function(t5, n8, i6, s7) { + return t5 && (t5[n8] || t5(e8, r5)) || i6[n8].slice(0, s7); + }, c4 = function(t5) { + return O.s(s6 % 12 || 12, t5, "0"); + }, d4 = n7.meridiem || function(t5, e9, n8) { + var r6 = t5 < 12 ? "AM" : "PM"; + return n8 ? r6.toLowerCase() : r6; + }, l6 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a4 + 1, MM: O.s(a4 + 1, 2, "0"), MMM: h4(n7.monthsShort, a4, f3, 3), MMMM: h4(f3, a4), D: this.$D, DD: O.s(this.$D, 2, "0"), d: String(this.$W), dd: h4(n7.weekdaysMin, this.$W, o7, 2), ddd: h4(n7.weekdaysShort, this.$W, o7, 3), dddd: o7[this.$W], H: String(s6), HH: O.s(s6, 2, "0"), h: c4(1), hh: c4(2), a: d4(s6, u3, true), A: d4(s6, u3, false), m: String(u3), mm: O.s(u3, 2, "0"), s: String(this.$s), ss: O.s(this.$s, 2, "0"), SSS: O.s(this.$ms, 3, "0"), Z: i5 }; + return r5.replace(y2, function(t5, e9) { + return e9 || l6[t5] || i5.replace(":", ""); + }); + }, m3.utcOffset = function() { + return 15 * -Math.round(this.$d.getTimezoneOffset() / 15); + }, m3.diff = function(r5, d4, $3) { + var l6, y3 = O.p(d4), M4 = w2(r5), m4 = (M4.utcOffset() - this.utcOffset()) * e7, g3 = this - M4, v3 = O.m(this, M4); + return v3 = (l6 = {}, l6[c3] = v3 / 12, l6[f2] = v3, l6[h3] = v3 / 3, l6[o6] = (g3 - m4) / 6048e5, l6[a3] = (g3 - m4) / 864e5, l6[u2] = g3 / n6, l6[s5] = g3 / e7, l6[i4] = g3 / t3, l6)[y3] || g3, $3 ? v3 : O.a(v3); + }, m3.daysInMonth = function() { + return this.endOf(f2).$D; + }, m3.$locale = function() { + return D[this.$L]; + }, m3.locale = function(t4, e8) { + if (!t4) + return this.$L; + var n7 = this.clone(), r5 = S3(t4, e8, true); + return r5 && (n7.$L = r5), n7; + }, m3.clone = function() { + return O.w(this.$d, this); + }, m3.toDate = function() { + return new Date(this.valueOf()); + }, m3.toJSON = function() { + return this.isValid() ? this.toISOString() : null; + }, m3.toISOString = function() { + return this.$d.toISOString(); + }, m3.toString = function() { + return this.$d.toUTCString(); + }, M3; + }(), T2 = _2.prototype; + return w2.prototype = T2, [["$ms", r4], ["$s", i4], ["$m", s5], ["$H", u2], ["$W", a3], ["$M", f2], ["$y", c3], ["$D", d3]].forEach(function(t4) { + T2[t4[1]] = function(e8) { + return this.$g(e8, t4[0], t4[1]); + }; + }), w2.extend = function(t4, e8) { + return t4.$i || (t4(e8, _2, w2), t4.$i = true), w2; + }, w2.locale = S3, w2.isDayjs = p2, w2.unix = function(t4) { + return w2(1e3 * t4); + }, w2.en = D[v2], w2.Ls = D, w2.p = {}, w2; + }); + } +}); + +// node_modules/chrono-node/dist/calculation/years.js +var require_years = __commonJS({ + "node_modules/chrono-node/dist/calculation/years.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.findYearClosestToRef = exports.findMostLikelyADYear = void 0; + var dayjs_1 = __importDefault2(require_dayjs_min()); + function findMostLikelyADYear(yearNumber) { + if (yearNumber < 100) { + if (yearNumber > 50) { + yearNumber = yearNumber + 1900; + } else { + yearNumber = yearNumber + 2e3; + } + } + return yearNumber; + } + exports.findMostLikelyADYear = findMostLikelyADYear; + function findYearClosestToRef(refDate, day, month) { + const refMoment = dayjs_1.default(refDate); + let dateMoment = refMoment; + dateMoment = dateMoment.month(month - 1); + dateMoment = dateMoment.date(day); + dateMoment = dateMoment.year(refMoment.year()); + const nextYear = dateMoment.add(1, "y"); + const lastYear = dateMoment.add(-1, "y"); + if (Math.abs(nextYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { + dateMoment = nextYear; + } else if (Math.abs(lastYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { + dateMoment = lastYear; + } + return dateMoment.year(); + } + exports.findYearClosestToRef = findYearClosestToRef; + } +}); + +// node_modules/chrono-node/dist/locales/en/constants.js +var require_constants = __commonJS({ + "node_modules/chrono-node/dist/locales/en/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.WEEKDAY_DICTIONARY = { + sunday: 0, + sun: 0, + "sun.": 0, + monday: 1, + mon: 1, + "mon.": 1, + tuesday: 2, + tue: 2, + "tue.": 2, + wednesday: 3, + wed: 3, + "wed.": 3, + thursday: 4, + thurs: 4, + "thurs.": 4, + thur: 4, + "thur.": 4, + thu: 4, + "thu.": 4, + friday: 5, + fri: 5, + "fri.": 5, + saturday: 6, + sat: 6, + "sat.": 6 + }; + exports.FULL_MONTH_NAME_DICTIONARY = { + january: 1, + february: 2, + march: 3, + april: 4, + may: 5, + june: 6, + july: 7, + august: 8, + september: 9, + october: 10, + november: 11, + december: 12 + }; + exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), { jan: 1, "jan.": 1, feb: 2, "feb.": 2, mar: 3, "mar.": 3, apr: 4, "apr.": 4, jun: 6, "jun.": 6, jul: 7, "jul.": 7, aug: 8, "aug.": 8, sep: 9, "sep.": 9, sept: 9, "sept.": 9, oct: 10, "oct.": 10, nov: 11, "nov.": 11, dec: 12, "dec.": 12 }); + exports.INTEGER_WORD_DICTIONARY = { + one: 1, + two: 2, + three: 3, + four: 4, + five: 5, + six: 6, + seven: 7, + eight: 8, + nine: 9, + ten: 10, + eleven: 11, + twelve: 12 + }; + exports.ORDINAL_WORD_DICTIONARY = { + first: 1, + second: 2, + third: 3, + fourth: 4, + fifth: 5, + sixth: 6, + seventh: 7, + eighth: 8, + ninth: 9, + tenth: 10, + eleventh: 11, + twelfth: 12, + thirteenth: 13, + fourteenth: 14, + fifteenth: 15, + sixteenth: 16, + seventeenth: 17, + eighteenth: 18, + nineteenth: 19, + twentieth: 20, + "twenty first": 21, + "twenty-first": 21, + "twenty second": 22, + "twenty-second": 22, + "twenty third": 23, + "twenty-third": 23, + "twenty fourth": 24, + "twenty-fourth": 24, + "twenty fifth": 25, + "twenty-fifth": 25, + "twenty sixth": 26, + "twenty-sixth": 26, + "twenty seventh": 27, + "twenty-seventh": 27, + "twenty eighth": 28, + "twenty-eighth": 28, + "twenty ninth": 29, + "twenty-ninth": 29, + "thirtieth": 30, + "thirty first": 31, + "thirty-first": 31 + }; + exports.TIME_UNIT_DICTIONARY = { + sec: "second", + second: "second", + seconds: "second", + min: "minute", + mins: "minute", + minute: "minute", + minutes: "minute", + h: "hour", + hr: "hour", + hrs: "hour", + hour: "hour", + hours: "hour", + day: "d", + days: "d", + week: "week", + weeks: "week", + month: "month", + months: "month", + qtr: "quarter", + quarter: "quarter", + quarters: "quarter", + y: "year", + yr: "year", + year: "year", + years: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s{0,2}an?)?|an?\\b(?:\\s{0,2}few)?|few|several|a?\\s{0,2}couple\\s{0,2}(?:of)?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "a" || num === "an") { + return 1; + } else if (num.match(/few/)) { + return 3; + } else if (num.match(/half/)) { + return 0.5; + } else if (num.match(/couple/)) { + return 2; + } else if (num.match(/several/)) { + return 7; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:st|nd|rd|th)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { + return exports.ORDINAL_WORD_DICTIONARY[num]; + } + num = num.replace(/(?:st|nd|rd|th)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s{0,2}(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9])`; + function parseYear(match) { + if (/BE/i.test(match)) { + match = match.replace(/BE/i, ""); + return parseInt(match) - 543; + } + if (/BCE?/i.test(match)) { + match = match.replace(/BCE?/i, ""); + return -parseInt(match); + } + if (/(AD|CE)/i.test(match)) { + match = match.replace(/(AD|CE)/i, ""); + return parseInt(match); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,3}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:about|around)\\s{0,3})?`, SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length).trim(); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/dayjs/plugin/quarterOfYear.js +var require_quarterOfYear = __commonJS({ + "node_modules/dayjs/plugin/quarterOfYear.js"(exports, module2) { + !function(t3, n6) { + typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = n6() : typeof define == "function" && define.amd ? define(n6) : (t3 = typeof globalThis != "undefined" ? globalThis : t3 || self).dayjs_plugin_quarterOfYear = n6(); + }(exports, function() { + "use strict"; + var t3 = "month", n6 = "quarter"; + return function(e7, i4) { + var r4 = i4.prototype; + r4.quarter = function(t4) { + return this.$utils().u(t4) ? Math.ceil((this.month() + 1) / 3) : this.month(this.month() % 3 + 3 * (t4 - 1)); + }; + var s5 = r4.add; + r4.add = function(e8, i5) { + return e8 = Number(e8), this.$utils().p(i5) === n6 ? this.add(3 * e8, t3) : s5.bind(this)(e8, i5); + }; + var u2 = r4.startOf; + r4.startOf = function(e8, i5) { + var r5 = this.$utils(), s6 = !!r5.u(i5) || i5; + if (r5.p(e8) === n6) { + var o6 = this.quarter() - 1; + return s6 ? this.month(3 * o6).startOf(t3).startOf("day") : this.month(3 * o6 + 2).endOf(t3).endOf("day"); + } + return u2.bind(this)(e8, i5); + }; + }; + }); + } +}); + +// node_modules/chrono-node/dist/utils/dayjs.js +var require_dayjs = __commonJS({ + "node_modules/chrono-node/dist/utils/dayjs.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.implySimilarTime = exports.assignSimilarTime = exports.assignSimilarDate = exports.assignTheNextDay = void 0; + var index_1 = require_dist(); + function assignTheNextDay(component, targetDayJs) { + targetDayJs = targetDayJs.add(1, "day"); + assignSimilarDate(component, targetDayJs); + implySimilarTime(component, targetDayJs); + } + exports.assignTheNextDay = assignTheNextDay; + function assignSimilarDate(component, targetDayJs) { + component.assign("day", targetDayJs.date()); + component.assign("month", targetDayJs.month() + 1); + component.assign("year", targetDayJs.year()); + } + exports.assignSimilarDate = assignSimilarDate; + function assignSimilarTime(component, targetDayJs) { + component.assign("hour", targetDayJs.hour()); + component.assign("minute", targetDayJs.minute()); + component.assign("second", targetDayJs.second()); + component.assign("millisecond", targetDayJs.millisecond()); + if (component.get("hour") < 12) { + component.assign("meridiem", index_1.Meridiem.AM); + } else { + component.assign("meridiem", index_1.Meridiem.PM); + } + } + exports.assignSimilarTime = assignSimilarTime; + function implySimilarTime(component, targetDayJs) { + component.imply("hour", targetDayJs.hour()); + component.imply("minute", targetDayJs.minute()); + component.imply("second", targetDayJs.second()); + component.imply("millisecond", targetDayJs.millisecond()); + } + exports.implySimilarTime = implySimilarTime; + } +}); + +// node_modules/chrono-node/dist/timezone.js +var require_timezone = __commonJS({ + "node_modules/chrono-node/dist/timezone.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.toTimezoneOffset = exports.TIMEZONE_ABBR_MAP = void 0; + exports.TIMEZONE_ABBR_MAP = { + ACDT: 630, + ACST: 570, + ADT: -180, + AEDT: 660, + AEST: 600, + AFT: 270, + AKDT: -480, + AKST: -540, + ALMT: 360, + AMST: -180, + AMT: -240, + ANAST: 720, + ANAT: 720, + AQTT: 300, + ART: -180, + AST: -240, + AWDT: 540, + AWST: 480, + AZOST: 0, + AZOT: -60, + AZST: 300, + AZT: 240, + BNT: 480, + BOT: -240, + BRST: -120, + BRT: -180, + BST: 60, + BTT: 360, + CAST: 480, + CAT: 120, + CCT: 390, + CDT: -300, + CEST: 120, + CET: 60, + CHADT: 825, + CHAST: 765, + CKT: -600, + CLST: -180, + CLT: -240, + COT: -300, + CST: -360, + CVT: -60, + CXT: 420, + ChST: 600, + DAVT: 420, + EASST: -300, + EAST: -360, + EAT: 180, + ECT: -300, + EDT: -240, + EEST: 180, + EET: 120, + EGST: 0, + EGT: -60, + EST: -300, + ET: -300, + FJST: 780, + FJT: 720, + FKST: -180, + FKT: -240, + FNT: -120, + GALT: -360, + GAMT: -540, + GET: 240, + GFT: -180, + GILT: 720, + GMT: 0, + GST: 240, + GYT: -240, + HAA: -180, + HAC: -300, + HADT: -540, + HAE: -240, + HAP: -420, + HAR: -360, + HAST: -600, + HAT: -90, + HAY: -480, + HKT: 480, + HLV: -210, + HNA: -240, + HNC: -360, + HNE: -300, + HNP: -480, + HNR: -420, + HNT: -150, + HNY: -540, + HOVT: 420, + ICT: 420, + IDT: 180, + IOT: 360, + IRDT: 270, + IRKST: 540, + IRKT: 540, + IRST: 210, + IST: 330, + JST: 540, + KGT: 360, + KRAST: 480, + KRAT: 480, + KST: 540, + KUYT: 240, + LHDT: 660, + LHST: 630, + LINT: 840, + MAGST: 720, + MAGT: 720, + MART: -510, + MAWT: 300, + MDT: -360, + MESZ: 120, + MEZ: 60, + MHT: 720, + MMT: 390, + MSD: 240, + MSK: 180, + MST: -420, + MUT: 240, + MVT: 300, + MYT: 480, + NCT: 660, + NDT: -90, + NFT: 690, + NOVST: 420, + NOVT: 360, + NPT: 345, + NST: -150, + NUT: -660, + NZDT: 780, + NZST: 720, + OMSST: 420, + OMST: 420, + PDT: -420, + PET: -300, + PETST: 720, + PETT: 720, + PGT: 600, + PHOT: 780, + PHT: 480, + PKT: 300, + PMDT: -120, + PMST: -180, + PONT: 660, + PST: -480, + PT: -480, + PWT: 540, + PYST: -180, + PYT: -240, + RET: 240, + SAMT: 240, + SAST: 120, + SBT: 660, + SCT: 240, + SGT: 480, + SRT: -180, + SST: -660, + TAHT: -600, + TFT: 300, + TJT: 300, + TKT: 780, + TLT: 540, + TMT: 300, + TVT: 720, + ULAT: 480, + UTC: 0, + UYST: -120, + UYT: -180, + UZT: 300, + VET: -210, + VLAST: 660, + VLAT: 660, + VUT: 660, + WAST: 120, + WAT: 60, + WEST: 60, + WESZ: 60, + WET: 0, + WEZ: 0, + WFT: 720, + WGST: -120, + WGT: -180, + WIB: 420, + WIT: 540, + WITA: 480, + WST: 780, + WT: 0, + YAKST: 600, + YAKT: 600, + YAPT: 600, + YEKST: 360, + YEKT: 360 + }; + function toTimezoneOffset(timezoneInput) { + var _a; + if (timezoneInput === null || timezoneInput === void 0) { + return null; + } + if (typeof timezoneInput === "number") { + return timezoneInput; + } + return (_a = exports.TIMEZONE_ABBR_MAP[timezoneInput]) !== null && _a !== void 0 ? _a : null; + } + exports.toTimezoneOffset = toTimezoneOffset; + } +}); + +// node_modules/chrono-node/dist/results.js +var require_results = __commonJS({ + "node_modules/chrono-node/dist/results.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ParsingResult = exports.ParsingComponents = exports.ReferenceWithTimezone = void 0; + var quarterOfYear_1 = __importDefault2(require_quarterOfYear()); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var timezone_1 = require_timezone(); + dayjs_1.default.extend(quarterOfYear_1.default); + var ReferenceWithTimezone = class { + constructor(input) { + var _a; + input = input !== null && input !== void 0 ? input : new Date(); + if (input instanceof Date) { + this.instant = input; + } else { + this.instant = (_a = input.instant) !== null && _a !== void 0 ? _a : new Date(); + this.timezoneOffset = timezone_1.toTimezoneOffset(input.timezone); + } + } + getDateWithAdjustedTimezone() { + return new Date(this.instant.getTime() + this.getSystemTimezoneAdjustmentMinute(this.instant) * 6e4); + } + getSystemTimezoneAdjustmentMinute(date, overrideTimezoneOffset) { + var _a; + if (!date || date.getTime() < 0) { + date = new Date(); + } + const currentTimezoneOffset = -date.getTimezoneOffset(); + const targetTimezoneOffset = (_a = overrideTimezoneOffset !== null && overrideTimezoneOffset !== void 0 ? overrideTimezoneOffset : this.timezoneOffset) !== null && _a !== void 0 ? _a : currentTimezoneOffset; + return currentTimezoneOffset - targetTimezoneOffset; + } + }; + exports.ReferenceWithTimezone = ReferenceWithTimezone; + var ParsingComponents = class { + constructor(reference, knownComponents) { + this.reference = reference; + this.knownValues = {}; + this.impliedValues = {}; + if (knownComponents) { + for (const key in knownComponents) { + this.knownValues[key] = knownComponents[key]; + } + } + const refDayJs = dayjs_1.default(reference.instant); + this.imply("day", refDayJs.date()); + this.imply("month", refDayJs.month() + 1); + this.imply("year", refDayJs.year()); + this.imply("hour", 12); + this.imply("minute", 0); + this.imply("second", 0); + this.imply("millisecond", 0); + } + get(component) { + if (component in this.knownValues) { + return this.knownValues[component]; + } + if (component in this.impliedValues) { + return this.impliedValues[component]; + } + return null; + } + isCertain(component) { + return component in this.knownValues; + } + getCertainComponents() { + return Object.keys(this.knownValues); + } + imply(component, value) { + if (component in this.knownValues) { + return this; + } + this.impliedValues[component] = value; + return this; + } + assign(component, value) { + this.knownValues[component] = value; + delete this.impliedValues[component]; + return this; + } + delete(component) { + delete this.knownValues[component]; + delete this.impliedValues[component]; + } + clone() { + const component = new ParsingComponents(this.reference); + component.knownValues = {}; + component.impliedValues = {}; + for (const key in this.knownValues) { + component.knownValues[key] = this.knownValues[key]; + } + for (const key in this.impliedValues) { + component.impliedValues[key] = this.impliedValues[key]; + } + return component; + } + isOnlyDate() { + return !this.isCertain("hour") && !this.isCertain("minute") && !this.isCertain("second"); + } + isOnlyTime() { + return !this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); + } + isOnlyWeekdayComponent() { + return this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); + } + isOnlyDayMonthComponent() { + return this.isCertain("day") && this.isCertain("month") && !this.isCertain("year"); + } + isValidDate() { + const date = this.dateWithoutTimezoneAdjustment(); + if (date.getFullYear() !== this.get("year")) + return false; + if (date.getMonth() !== this.get("month") - 1) + return false; + if (date.getDate() !== this.get("day")) + return false; + if (this.get("hour") != null && date.getHours() != this.get("hour")) + return false; + if (this.get("minute") != null && date.getMinutes() != this.get("minute")) + return false; + return true; + } + toString() { + return `[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(this.impliedValues)}}, reference: ${JSON.stringify(this.reference)}]`; + } + dayjs() { + return dayjs_1.default(this.date()); + } + date() { + const date = this.dateWithoutTimezoneAdjustment(); + const timezoneAdjustment = this.reference.getSystemTimezoneAdjustmentMinute(date, this.get("timezoneOffset")); + return new Date(date.getTime() + timezoneAdjustment * 6e4); + } + dateWithoutTimezoneAdjustment() { + const date = new Date(this.get("year"), this.get("month") - 1, this.get("day"), this.get("hour"), this.get("minute"), this.get("second"), this.get("millisecond")); + date.setFullYear(this.get("year")); + return date; + } + static createRelativeFromReference(reference, fragments) { + let date = dayjs_1.default(reference.instant); + for (const key in fragments) { + date = date.add(fragments[key], key); + } + const components = new ParsingComponents(reference); + if (fragments["hour"] || fragments["minute"] || fragments["second"]) { + dayjs_2.assignSimilarTime(components, date); + dayjs_2.assignSimilarDate(components, date); + if (reference.timezoneOffset !== null) { + components.assign("timezoneOffset", -reference.instant.getTimezoneOffset()); + } + } else { + dayjs_2.implySimilarTime(components, date); + if (reference.timezoneOffset !== null) { + components.imply("timezoneOffset", -reference.instant.getTimezoneOffset()); + } + if (fragments["d"]) { + components.assign("day", date.date()); + components.assign("month", date.month() + 1); + components.assign("year", date.year()); + } else { + if (fragments["week"]) { + components.imply("weekday", date.day()); + } + components.imply("day", date.date()); + if (fragments["month"]) { + components.assign("month", date.month() + 1); + components.assign("year", date.year()); + } else { + components.imply("month", date.month() + 1); + if (fragments["year"]) { + components.assign("year", date.year()); + } else { + components.imply("year", date.year()); + } + } + } + } + return components; + } + }; + exports.ParsingComponents = ParsingComponents; + var ParsingResult = class { + constructor(reference, index, text, start, end) { + this.reference = reference; + this.refDate = reference.instant; + this.index = index; + this.text = text; + this.start = start || new ParsingComponents(reference); + this.end = end; + } + clone() { + const result = new ParsingResult(this.reference, this.index, this.text); + result.start = this.start ? this.start.clone() : null; + result.end = this.end ? this.end.clone() : null; + return result; + } + date() { + return this.start.date(); + } + toString() { + return `[ParsingResult {index: ${this.index}, text: '${this.text}', ...}]`; + } + }; + exports.ParsingResult = ParsingResult; + } +}); + +// node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js +var require_AbstractParserWithWordBoundary = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.AbstractParserWithWordBoundaryChecking = void 0; + var AbstractParserWithWordBoundaryChecking = class { + constructor() { + this.cachedInnerPattern = null; + this.cachedPattern = null; + } + patternLeftBoundary() { + return `(\\W|^)`; + } + pattern(context2) { + const innerPattern = this.innerPattern(context2); + if (innerPattern == this.cachedInnerPattern) { + return this.cachedPattern; + } + this.cachedPattern = new RegExp(`${this.patternLeftBoundary()}${innerPattern.source}`, innerPattern.flags); + this.cachedInnerPattern = innerPattern; + return this.cachedPattern; + } + extract(context2, match) { + var _a; + const header = (_a = match[1]) !== null && _a !== void 0 ? _a : ""; + match.index = match.index + header.length; + match[0] = match[0].substring(header.length); + for (let i4 = 2; i4 < match.length; i4++) { + match[i4 - 1] = match[i4]; + } + return this.innerExtract(context2, match); + } + }; + exports.AbstractParserWithWordBoundaryChecking = AbstractParserWithWordBoundaryChecking; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js +var require_ENTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN_WITH_PREFIX = new RegExp(`(?:within|in|for)\\s*(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var PATTERN_WITHOUT_PREFIX = new RegExp(`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var ENTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return context2.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX; + } + innerExtract(context2, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + }; + exports.default = ENTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js +var require_ENMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants(); + var constants_2 = require_constants(); + var constants_3 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:on\\s{0,3})?(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:to|\\-|\\\u2013|until|through|till)?\\s{0,3}(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s{0,3}(?:of)?\\s{0,3})(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s{0,3})(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var ENMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = ENMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js +var require_ENMonthNameMiddleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants(); + var constants_2 = require_constants(); + var constants_3 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:-|/|\\s*,?\\s*)(${constants_2.ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*(?:(?:to|\\-)\\s*(${constants_2.ORDINAL_NUMBER_PATTERN})\\s*)?(?:(?:-|/|\\s*,?\\s*)(${constants_3.YEAR_PATTERN}))?(?=\\W|$)(?!\\:\\d)`, "i"); + var MONTH_NAME_GROUP = 1; + var DATE_GROUP = 2; + var DATE_TO_GROUP = 3; + var YEAR_GROUP = 4; + var ENMonthNameMiddleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + return null; + } + const components = context2.createParsingComponents({ + day, + month + }); + if (match[YEAR_GROUP]) { + const year = constants_3.parseYear(match[YEAR_GROUP]); + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, day, month); + components.imply("year", year); + } + if (!match[DATE_TO_GROUP]) { + return components; + } + const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + const result = context2.createParsingResult(match.index, match[0]); + result.start = components; + result.end = components.clone(); + result.end.assign("day", endDate); + return result; + } + }; + exports.default = ENMonthNameMiddleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js +var require_ENMonthNameParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var years_1 = require_years(); + var pattern_1 = require_pattern(); + var constants_2 = require_constants(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`((?:in)\\s*)?(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, "i"); + var PREFIX_GROUP = 1; + var MONTH_NAME_GROUP = 2; + var YEAR_GROUP = 3; + var ENMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const monthName = match[MONTH_NAME_GROUP].toLowerCase(); + if (match[0].length <= 3 && !constants_1.FULL_MONTH_NAME_DICTIONARY[monthName]) { + return null; + } + const result = context2.createParsingResult(match.index + (match[PREFIX_GROUP] || "").length, match.index + match[0].length); + result.start.imply("day", 1); + const month = constants_1.MONTH_DICTIONARY[monthName]; + result.start.assign("month", month); + if (match[YEAR_GROUP]) { + const year = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, 1, month); + result.start.imply("year", year); + } + return result; + } + }; + exports.default = ENMonthNameParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js +var require_ENCasualYearMonthDayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`, "i"); + var YEAR_NUMBER_GROUP = 1; + var MONTH_NAME_GROUP = 2; + var MONTH_NUMBER_GROUP = 3; + var DATE_NUMBER_GROUP = 4; + var ENCasualYearMonthDayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + if (month < 1 || month > 12) { + return null; + } + const year = parseInt(match[YEAR_NUMBER_GROUP]); + const day = parseInt(match[DATE_NUMBER_GROUP]); + return { + day, + month, + year + }; + } + }; + exports.default = ENCasualYearMonthDayParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js +var require_ENSlashMonthFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})", "i"); + var MONTH_GROUP = 1; + var YEAR_GROUP = 2; + var ENSlashMonthFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const year = parseInt(match[YEAR_GROUP]); + const month = parseInt(match[MONTH_GROUP]); + return context2.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); + } + }; + exports.default = ENSlashMonthFormatParser; + } +}); + +// node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js +var require_AbstractTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.AbstractTimeExpressionParser = void 0; + var index_1 = require_dist(); + function primaryTimePattern(leftBoundary, primaryPrefix, primarySuffix, flags) { + return new RegExp(`${leftBoundary}${primaryPrefix}(\\d{1,4})(?:(?:\\.|:|\uFF1A)(\\d{1,2})(?:(?::|\uFF1A)(\\d{2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${primarySuffix}`, flags); + } + function followingTimePatten(followingPhase, followingSuffix) { + return new RegExp(`^(${followingPhase})(\\d{1,4})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${followingSuffix}`, "i"); + } + var HOUR_GROUP = 2; + var MINUTE_GROUP = 3; + var SECOND_GROUP = 4; + var MILLI_SECOND_GROUP = 5; + var AM_PM_HOUR_GROUP = 6; + var AbstractTimeExpressionParser = class { + constructor(strictMode = false) { + this.cachedPrimaryPrefix = null; + this.cachedPrimarySuffix = null; + this.cachedPrimaryTimePattern = null; + this.cachedFollowingPhase = null; + this.cachedFollowingSuffix = null; + this.cachedFollowingTimePatten = null; + this.strictMode = strictMode; + } + patternFlags() { + return "i"; + } + primaryPatternLeftBoundary() { + return `(^|\\s|T|\\b)`; + } + primarySuffix() { + return `(?=\\W|$)`; + } + followingSuffix() { + return `(?=\\W|$)`; + } + pattern(context2) { + return this.getPrimaryTimePatternThroughCache(); + } + extract(context2, match) { + const startComponents = this.extractPrimaryTimeComponents(context2, match); + if (!startComponents) { + match.index += match[0].length; + return null; + } + const index = match.index + match[1].length; + const text = match[0].substring(match[1].length); + const result = context2.createParsingResult(index, text, startComponents); + match.index += match[0].length; + const remainingText = context2.text.substring(match.index); + const followingPattern = this.getFollowingTimePatternThroughCache(); + const followingMatch = followingPattern.exec(remainingText); + if (text.match(/^\d{3,4}/) && followingMatch && followingMatch[0].match(/^\s*([+-])\s*\d{2,4}$/)) { + return null; + } + if (!followingMatch || followingMatch[0].match(/^\s*([+-])\s*\d{3,4}$/)) { + return this.checkAndReturnWithoutFollowingPattern(result); + } + result.end = this.extractFollowingTimeComponents(context2, followingMatch, result); + if (result.end) { + result.text += followingMatch[0]; + } + return this.checkAndReturnWithFollowingPattern(result); + } + extractPrimaryTimeComponents(context2, match, strict = false) { + const components = context2.createParsingComponents(); + let minute = 0; + let meridiem = null; + let hour = parseInt(match[HOUR_GROUP]); + if (hour > 100) { + if (this.strictMode || match[MINUTE_GROUP] != null) { + return null; + } + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (hour > 24) { + return null; + } + if (match[MINUTE_GROUP] != null) { + if (match[MINUTE_GROUP].length == 1 && !match[AM_PM_HOUR_GROUP]) { + return null; + } + minute = parseInt(match[MINUTE_GROUP]); + } + if (minute >= 60) { + return null; + } + if (hour > 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + } + } + if (ampm == "p") { + meridiem = index_1.Meridiem.PM; + if (hour != 12) { + hour += 12; + } + } + } + components.assign("hour", hour); + components.assign("minute", minute); + if (meridiem !== null) { + components.assign("meridiem", meridiem); + } else { + if (hour < 12) { + components.imply("meridiem", index_1.Meridiem.AM); + } else { + components.imply("meridiem", index_1.Meridiem.PM); + } + } + if (match[MILLI_SECOND_GROUP] != null) { + const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); + if (millisecond >= 1e3) + return null; + components.assign("millisecond", millisecond); + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + components.assign("second", second); + } + return components; + } + extractFollowingTimeComponents(context2, match, result) { + const components = context2.createParsingComponents(); + if (match[MILLI_SECOND_GROUP] != null) { + const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); + if (millisecond >= 1e3) + return null; + components.assign("millisecond", millisecond); + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + components.assign("second", second); + } + let hour = parseInt(match[HOUR_GROUP]); + let minute = 0; + let meridiem = -1; + if (match[MINUTE_GROUP] != null) { + minute = parseInt(match[MINUTE_GROUP]); + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60 || hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) { + return null; + } + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + if (!components.isCertain("day")) { + components.imply("day", components.get("day") + 1); + } + } + } + if (ampm == "p") { + meridiem = index_1.Meridiem.PM; + if (hour != 12) + hour += 12; + } + if (!result.start.isCertain("meridiem")) { + if (meridiem == index_1.Meridiem.AM) { + result.start.imply("meridiem", index_1.Meridiem.AM); + if (result.start.get("hour") == 12) { + result.start.assign("hour", 0); + } + } else { + result.start.imply("meridiem", index_1.Meridiem.PM); + if (result.start.get("hour") != 12) { + result.start.assign("hour", result.start.get("hour") + 12); + } + } + } + } + components.assign("hour", hour); + components.assign("minute", minute); + if (meridiem >= 0) { + components.assign("meridiem", meridiem); + } else { + const startAtPM = result.start.isCertain("meridiem") && result.start.get("hour") > 12; + if (startAtPM) { + if (result.start.get("hour") - 12 > hour) { + components.imply("meridiem", index_1.Meridiem.AM); + } else if (hour <= 12) { + components.assign("hour", hour + 12); + components.assign("meridiem", index_1.Meridiem.PM); + } + } else if (hour > 12) { + components.imply("meridiem", index_1.Meridiem.PM); + } else if (hour <= 12) { + components.imply("meridiem", index_1.Meridiem.AM); + } + } + if (components.date().getTime() < result.start.date().getTime()) { + components.imply("day", components.get("day") + 1); + } + return components; + } + checkAndReturnWithoutFollowingPattern(result) { + if (result.text.match(/^\d$/)) { + return null; + } + if (result.text.match(/^\d\d\d+$/)) { + return null; + } + if (result.text.match(/\d[apAP]$/)) { + return null; + } + const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)$/); + if (endingWithNumbers) { + const endingNumbers = endingWithNumbers[1]; + if (this.strictMode) { + return null; + } + if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { + return null; + } + const endingNumberVal = parseInt(endingNumbers); + if (endingNumberVal > 24) { + return null; + } + } + return result; + } + checkAndReturnWithFollowingPattern(result) { + if (result.text.match(/^\d+-\d+$/)) { + return null; + } + const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)\s*-\s*(\d[\d.]+)$/); + if (endingWithNumbers) { + if (this.strictMode) { + return null; + } + const startingNumbers = endingWithNumbers[1]; + const endingNumbers = endingWithNumbers[2]; + if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { + return null; + } + const endingNumberVal = parseInt(endingNumbers); + const startingNumberVal = parseInt(startingNumbers); + if (endingNumberVal > 24 || startingNumberVal > 24) { + return null; + } + } + return result; + } + getPrimaryTimePatternThroughCache() { + const primaryPrefix = this.primaryPrefix(); + const primarySuffix = this.primarySuffix(); + if (this.cachedPrimaryPrefix === primaryPrefix && this.cachedPrimarySuffix === primarySuffix) { + return this.cachedPrimaryTimePattern; + } + this.cachedPrimaryTimePattern = primaryTimePattern(this.primaryPatternLeftBoundary(), primaryPrefix, primarySuffix, this.patternFlags()); + this.cachedPrimaryPrefix = primaryPrefix; + this.cachedPrimarySuffix = primarySuffix; + return this.cachedPrimaryTimePattern; + } + getFollowingTimePatternThroughCache() { + const followingPhase = this.followingPhase(); + const followingSuffix = this.followingSuffix(); + if (this.cachedFollowingPhase === followingPhase && this.cachedFollowingSuffix === followingSuffix) { + return this.cachedFollowingTimePatten; + } + this.cachedFollowingTimePatten = followingTimePatten(followingPhase, followingSuffix); + this.cachedFollowingPhase = followingPhase; + this.cachedFollowingSuffix = followingSuffix; + return this.cachedFollowingTimePatten; + } + }; + exports.AbstractTimeExpressionParser = AbstractTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js +var require_ENTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var ENTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + constructor(strictMode) { + super(strictMode); + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|to|\\?)\\s*"; + } + primaryPrefix() { + return "(?:(?:at|from)\\s*)??"; + } + primarySuffix() { + return "(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?!/)(?=\\W|$)"; + } + extractPrimaryTimeComponents(context2, match) { + const components = super.extractPrimaryTimeComponents(context2, match); + if (components) { + if (match[0].endsWith("night")) { + const hour = components.get("hour"); + if (hour >= 6 && hour < 12) { + components.assign("hour", components.get("hour") + 12); + components.assign("meridiem", index_1.Meridiem.PM); + } else if (hour < 6) { + components.assign("meridiem", index_1.Meridiem.AM); + } + } + if (match[0].endsWith("afternoon")) { + components.assign("meridiem", index_1.Meridiem.PM); + const hour = components.get("hour"); + if (hour >= 0 && hour <= 6) { + components.assign("hour", components.get("hour") + 12); + } + } + if (match[0].endsWith("morning")) { + components.assign("meridiem", index_1.Meridiem.AM); + const hour = components.get("hour"); + if (hour < 12) { + components.assign("hour", components.get("hour")); + } + } + } + return components; + } + }; + exports.default = ENTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/utils/timeunits.js +var require_timeunits = __commonJS({ + "node_modules/chrono-node/dist/utils/timeunits.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.addImpliedTimeUnits = exports.reverseTimeUnits = void 0; + function reverseTimeUnits(timeUnits) { + const reversed = {}; + for (const key in timeUnits) { + reversed[key] = -timeUnits[key]; + } + return reversed; + } + exports.reverseTimeUnits = reverseTimeUnits; + function addImpliedTimeUnits(components, timeUnits) { + const output = components.clone(); + let date = components.dayjs(); + for (const key in timeUnits) { + date = date.add(timeUnits[key], key); + } + if ("day" in timeUnits || "d" in timeUnits || "week" in timeUnits || "month" in timeUnits || "year" in timeUnits) { + output.imply("day", date.date()); + output.imply("month", date.month() + 1); + output.imply("year", date.year()); + } + if ("second" in timeUnits || "minute" in timeUnits || "hour" in timeUnits) { + output.imply("second", date.second()); + output.imply("minute", date.minute()); + output.imply("hour", date.hour()); + } + return output; + } + exports.addImpliedTimeUnits = addImpliedTimeUnits; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js +var require_ENTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}(?:ago|before|earlier)(?=(?:\\W|$))`, "i"); + var STRICT_PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}ago(?=(?:\\W|$))`, "i"); + var ENTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context2, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, outputTimeUnits); + } + }; + exports.default = ENTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js +var require_ENTimeUnitLaterFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}(?:later|after|from now|henceforth|forward|out)(?=(?:\\W|$))`, "i"); + var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|from now)(?=(?:\\W|$))", "i"); + var GROUP_NUM_TIMEUNITS = 1; + var ENTimeUnitLaterFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context2, match) { + const fragments = constants_1.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, fragments); + } + }; + exports.default = ENTimeUnitLaterFormatParser; + } +}); + +// node_modules/chrono-node/dist/common/abstractRefiners.js +var require_abstractRefiners = __commonJS({ + "node_modules/chrono-node/dist/common/abstractRefiners.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.MergingRefiner = exports.Filter = void 0; + var Filter = class { + refine(context2, results) { + return results.filter((r4) => this.isValid(context2, r4)); + } + }; + exports.Filter = Filter; + var MergingRefiner = class { + refine(context2, results) { + if (results.length < 2) { + return results; + } + const mergedResults = []; + let curResult = results[0]; + let nextResult = null; + for (let i4 = 1; i4 < results.length; i4++) { + nextResult = results[i4]; + const textBetween = context2.text.substring(curResult.index + curResult.text.length, nextResult.index); + if (!this.shouldMergeResults(textBetween, curResult, nextResult, context2)) { + mergedResults.push(curResult); + curResult = nextResult; + } else { + const left = curResult; + const right = nextResult; + const mergedResult = this.mergeResults(textBetween, left, right, context2); + context2.debug(() => { + console.log(`${this.constructor.name} merged ${left} and ${right} into ${mergedResult}`); + }); + curResult = mergedResult; + } + } + if (curResult != null) { + mergedResults.push(curResult); + } + return mergedResults; + } + }; + exports.MergingRefiner = MergingRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js +var require_AbstractMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var AbstractMergeDateRangeRefiner = class extends abstractRefiners_1.MergingRefiner { + shouldMergeResults(textBetween, currentResult, nextResult) { + return !currentResult.end && !nextResult.end && textBetween.match(this.patternBetween()) != null; + } + mergeResults(textBetween, fromResult, toResult) { + if (!fromResult.start.isOnlyWeekdayComponent() && !toResult.start.isOnlyWeekdayComponent()) { + toResult.start.getCertainComponents().forEach((key) => { + if (!fromResult.start.isCertain(key)) { + fromResult.start.assign(key, toResult.start.get(key)); + } + }); + fromResult.start.getCertainComponents().forEach((key) => { + if (!toResult.start.isCertain(key)) { + toResult.start.assign(key, fromResult.start.get(key)); + } + }); + } + if (fromResult.start.date().getTime() > toResult.start.date().getTime()) { + let fromMoment = fromResult.start.dayjs(); + let toMoment = toResult.start.dayjs(); + if (fromResult.start.isOnlyWeekdayComponent() && fromMoment.add(-7, "days").isBefore(toMoment)) { + fromMoment = fromMoment.add(-7, "days"); + fromResult.start.imply("day", fromMoment.date()); + fromResult.start.imply("month", fromMoment.month() + 1); + fromResult.start.imply("year", fromMoment.year()); + } else if (toResult.start.isOnlyWeekdayComponent() && toMoment.add(7, "days").isAfter(fromMoment)) { + toMoment = toMoment.add(7, "days"); + toResult.start.imply("day", toMoment.date()); + toResult.start.imply("month", toMoment.month() + 1); + toResult.start.imply("year", toMoment.year()); + } else { + [toResult, fromResult] = [fromResult, toResult]; + } + } + const result = fromResult.clone(); + result.start = fromResult.start; + result.end = toResult.start; + result.index = Math.min(fromResult.index, toResult.index); + if (fromResult.index < toResult.index) { + result.text = fromResult.text + textBetween + toResult.text; + } else { + result.text = toResult.text + textBetween + fromResult.text; + } + return result; + } + }; + exports.default = AbstractMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js +var require_ENMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var ENMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(to|-)\s*$/i; + } + }; + exports.default = ENMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/calculation/mergingCalculation.js +var require_mergingCalculation = __commonJS({ + "node_modules/chrono-node/dist/calculation/mergingCalculation.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.mergeDateTimeComponent = exports.mergeDateTimeResult = void 0; + var index_1 = require_dist(); + function mergeDateTimeResult(dateResult, timeResult) { + const result = dateResult.clone(); + const beginDate = dateResult.start; + const beginTime = timeResult.start; + result.start = mergeDateTimeComponent(beginDate, beginTime); + if (dateResult.end != null || timeResult.end != null) { + const endDate = dateResult.end == null ? dateResult.start : dateResult.end; + const endTime = timeResult.end == null ? timeResult.start : timeResult.end; + const endDateTime = mergeDateTimeComponent(endDate, endTime); + if (dateResult.end == null && endDateTime.date().getTime() < result.start.date().getTime()) { + if (endDateTime.isCertain("day")) { + endDateTime.assign("day", endDateTime.get("day") + 1); + } else { + endDateTime.imply("day", endDateTime.get("day") + 1); + } + } + result.end = endDateTime; + } + return result; + } + exports.mergeDateTimeResult = mergeDateTimeResult; + function mergeDateTimeComponent(dateComponent, timeComponent) { + const dateTimeComponent = dateComponent.clone(); + if (timeComponent.isCertain("hour")) { + dateTimeComponent.assign("hour", timeComponent.get("hour")); + dateTimeComponent.assign("minute", timeComponent.get("minute")); + if (timeComponent.isCertain("second")) { + dateTimeComponent.assign("second", timeComponent.get("second")); + if (timeComponent.isCertain("millisecond")) { + dateTimeComponent.assign("millisecond", timeComponent.get("millisecond")); + } else { + dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); + } + } else { + dateTimeComponent.imply("second", timeComponent.get("second")); + dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); + } + } else { + dateTimeComponent.imply("hour", timeComponent.get("hour")); + dateTimeComponent.imply("minute", timeComponent.get("minute")); + dateTimeComponent.imply("second", timeComponent.get("second")); + dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); + } + if (timeComponent.isCertain("timezoneOffset")) { + dateTimeComponent.assign("timezoneOffset", timeComponent.get("timezoneOffset")); + } + if (timeComponent.isCertain("meridiem")) { + dateTimeComponent.assign("meridiem", timeComponent.get("meridiem")); + } else if (timeComponent.get("meridiem") != null && dateTimeComponent.get("meridiem") == null) { + dateTimeComponent.imply("meridiem", timeComponent.get("meridiem")); + } + if (dateTimeComponent.get("meridiem") == index_1.Meridiem.PM && dateTimeComponent.get("hour") < 12) { + if (timeComponent.isCertain("hour")) { + dateTimeComponent.assign("hour", dateTimeComponent.get("hour") + 12); + } else { + dateTimeComponent.imply("hour", dateTimeComponent.get("hour") + 12); + } + } + return dateTimeComponent; + } + exports.mergeDateTimeComponent = mergeDateTimeComponent; + } +}); + +// node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js +var require_AbstractMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var mergingCalculation_1 = require_mergingCalculation(); + var ENMergeDateTimeRefiner = class extends abstractRefiners_1.MergingRefiner { + shouldMergeResults(textBetween, currentResult, nextResult) { + return (currentResult.start.isOnlyDate() && nextResult.start.isOnlyTime() || nextResult.start.isOnlyDate() && currentResult.start.isOnlyTime()) && textBetween.match(this.patternBetween()) != null; + } + mergeResults(textBetween, currentResult, nextResult) { + const result = currentResult.start.isOnlyDate() ? mergingCalculation_1.mergeDateTimeResult(currentResult, nextResult) : mergingCalculation_1.mergeDateTimeResult(nextResult, currentResult); + result.index = currentResult.index; + result.text = currentResult.text + textBetween + nextResult.text; + return result; + } + }; + exports.default = ENMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js +var require_ENMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var ENMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$"); + } + }; + exports.default = ENMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js +var require_ExtractTimezoneAbbrRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var TIMEZONE_NAME_PATTERN = new RegExp("^\\s*,?\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)", "i"); + var DEFAULT_TIMEZONE_ABBR_MAP = { + ACDT: 630, + ACST: 570, + ADT: -180, + AEDT: 660, + AEST: 600, + AFT: 270, + AKDT: -480, + AKST: -540, + ALMT: 360, + AMST: -180, + AMT: -240, + ANAST: 720, + ANAT: 720, + AQTT: 300, + ART: -180, + AST: -240, + AWDT: 540, + AWST: 480, + AZOST: 0, + AZOT: -60, + AZST: 300, + AZT: 240, + BNT: 480, + BOT: -240, + BRST: -120, + BRT: -180, + BST: 60, + BTT: 360, + CAST: 480, + CAT: 120, + CCT: 390, + CDT: -300, + CEST: 120, + CET: 60, + CHADT: 825, + CHAST: 765, + CKT: -600, + CLST: -180, + CLT: -240, + COT: -300, + CST: -360, + CVT: -60, + CXT: 420, + ChST: 600, + DAVT: 420, + EASST: -300, + EAST: -360, + EAT: 180, + ECT: -300, + EDT: -240, + EEST: 180, + EET: 120, + EGST: 0, + EGT: -60, + EST: -300, + ET: -300, + FJST: 780, + FJT: 720, + FKST: -180, + FKT: -240, + FNT: -120, + GALT: -360, + GAMT: -540, + GET: 240, + GFT: -180, + GILT: 720, + GMT: 0, + GST: 240, + GYT: -240, + HAA: -180, + HAC: -300, + HADT: -540, + HAE: -240, + HAP: -420, + HAR: -360, + HAST: -600, + HAT: -90, + HAY: -480, + HKT: 480, + HLV: -210, + HNA: -240, + HNC: -360, + HNE: -300, + HNP: -480, + HNR: -420, + HNT: -150, + HNY: -540, + HOVT: 420, + ICT: 420, + IDT: 180, + IOT: 360, + IRDT: 270, + IRKST: 540, + IRKT: 540, + IRST: 210, + IST: 330, + JST: 540, + KGT: 360, + KRAST: 480, + KRAT: 480, + KST: 540, + KUYT: 240, + LHDT: 660, + LHST: 630, + LINT: 840, + MAGST: 720, + MAGT: 720, + MART: -510, + MAWT: 300, + MDT: -360, + MESZ: 120, + MEZ: 60, + MHT: 720, + MMT: 390, + MSD: 240, + MSK: 240, + MST: -420, + MUT: 240, + MVT: 300, + MYT: 480, + NCT: 660, + NDT: -90, + NFT: 690, + NOVST: 420, + NOVT: 360, + NPT: 345, + NST: -150, + NUT: -660, + NZDT: 780, + NZST: 720, + OMSST: 420, + OMST: 420, + PDT: -420, + PET: -300, + PETST: 720, + PETT: 720, + PGT: 600, + PHOT: 780, + PHT: 480, + PKT: 300, + PMDT: -120, + PMST: -180, + PONT: 660, + PST: -480, + PT: -480, + PWT: 540, + PYST: -180, + PYT: -240, + RET: 240, + SAMT: 240, + SAST: 120, + SBT: 660, + SCT: 240, + SGT: 480, + SRT: -180, + SST: -660, + TAHT: -600, + TFT: 300, + TJT: 300, + TKT: 780, + TLT: 540, + TMT: 300, + TVT: 720, + ULAT: 480, + UTC: 0, + UYST: -120, + UYT: -180, + UZT: 300, + VET: -210, + VLAST: 660, + VLAT: 660, + VUT: 660, + WAST: 120, + WAT: 60, + WEST: 60, + WESZ: 60, + WET: 0, + WEZ: 0, + WFT: 720, + WGST: -120, + WGT: -180, + WIB: 420, + WIT: 540, + WITA: 480, + WST: 780, + WT: 0, + YAKST: 600, + YAKT: 600, + YAPT: 600, + YEKST: 360, + YEKT: 360 + }; + var ExtractTimezoneAbbrRefiner = class { + constructor(timezoneOverrides) { + this.timezone = Object.assign(Object.assign({}, DEFAULT_TIMEZONE_ABBR_MAP), timezoneOverrides); + } + refine(context2, results) { + var _a; + const timezoneOverrides = (_a = context2.option.timezones) !== null && _a !== void 0 ? _a : {}; + results.forEach((result) => { + var _a2, _b; + const suffix = context2.text.substring(result.index + result.text.length); + const match = TIMEZONE_NAME_PATTERN.exec(suffix); + if (!match) { + return; + } + const timezoneAbbr = match[1].toUpperCase(); + const extractedTimezoneOffset = (_b = (_a2 = timezoneOverrides[timezoneAbbr]) !== null && _a2 !== void 0 ? _a2 : this.timezone[timezoneAbbr]) !== null && _b !== void 0 ? _b : null; + if (extractedTimezoneOffset === null) { + return; + } + context2.debug(() => { + console.log(`Extracting timezone: '${timezoneAbbr}' into: ${extractedTimezoneOffset} for: ${result.start}`); + }); + const currentTimezoneOffset = result.start.get("timezoneOffset"); + if (currentTimezoneOffset !== null && extractedTimezoneOffset != currentTimezoneOffset) { + if (result.start.isCertain("timezoneOffset")) { + return; + } + if (timezoneAbbr != match[1]) { + return; + } + } + if (result.start.isOnlyDate()) { + if (timezoneAbbr != match[1]) { + return; + } + } + result.text += match[0]; + if (!result.start.isCertain("timezoneOffset")) { + result.start.assign("timezoneOffset", extractedTimezoneOffset); + } + if (result.end != null && !result.end.isCertain("timezoneOffset")) { + result.end.assign("timezoneOffset", extractedTimezoneOffset); + } + }); + return results; + } + }; + exports.default = ExtractTimezoneAbbrRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js +var require_ExtractTimezoneOffsetRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var TIMEZONE_OFFSET_PATTERN = new RegExp("^\\s*(?:\\(?(?:GMT|UTC)\\s?)?([+-])(\\d{1,2})(?::?(\\d{2}))?\\)?", "i"); + var TIMEZONE_OFFSET_SIGN_GROUP = 1; + var TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 2; + var TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 3; + var ExtractTimezoneOffsetRefiner = class { + refine(context2, results) { + results.forEach(function(result) { + if (result.start.isCertain("timezoneOffset")) { + return; + } + const suffix = context2.text.substring(result.index + result.text.length); + const match = TIMEZONE_OFFSET_PATTERN.exec(suffix); + if (!match) { + return; + } + context2.debug(() => { + console.log(`Extracting timezone: '${match[0]}' into : ${result}`); + }); + const hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]); + const minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP] || "0"); + let timezoneOffset = hourOffset * 60 + minuteOffset; + if (timezoneOffset > 14 * 60) { + return; + } + if (match[TIMEZONE_OFFSET_SIGN_GROUP] === "-") { + timezoneOffset = -timezoneOffset; + } + if (result.end != null) { + result.end.assign("timezoneOffset", timezoneOffset); + } + result.start.assign("timezoneOffset", timezoneOffset); + result.text += match[0]; + }); + return results; + } + }; + exports.default = ExtractTimezoneOffsetRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js +var require_OverlapRemovalRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var OverlapRemovalRefiner = class { + refine(context2, results) { + if (results.length < 2) { + return results; + } + const filteredResults = []; + let prevResult = results[0]; + for (let i4 = 1; i4 < results.length; i4++) { + const result = results[i4]; + if (result.index < prevResult.index + prevResult.text.length) { + if (result.text.length > prevResult.text.length) { + prevResult = result; + } + } else { + filteredResults.push(prevResult); + prevResult = result; + } + } + if (prevResult != null) { + filteredResults.push(prevResult); + } + return filteredResults; + } + }; + exports.default = OverlapRemovalRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js +var require_ForwardDateRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var ForwardDateRefiner = class { + refine(context2, results) { + if (!context2.option.forwardDate) { + return results; + } + results.forEach(function(result) { + let refMoment = dayjs_1.default(context2.refDate); + if (result.start.isOnlyDayMonthComponent() && refMoment.isAfter(result.start.dayjs())) { + for (let i4 = 0; i4 < 3 && refMoment.isAfter(result.start.dayjs()); i4++) { + result.start.imply("year", result.start.get("year") + 1); + context2.debug(() => { + console.log(`Forward yearly adjusted for ${result} (${result.start})`); + }); + if (result.end && !result.end.isCertain("year")) { + result.end.imply("year", result.end.get("year") + 1); + context2.debug(() => { + console.log(`Forward yearly adjusted for ${result} (${result.end})`); + }); + } + } + } + if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) { + if (refMoment.day() >= result.start.get("weekday")) { + refMoment = refMoment.day(result.start.get("weekday") + 7); + } else { + refMoment = refMoment.day(result.start.get("weekday")); + } + result.start.imply("day", refMoment.date()); + result.start.imply("month", refMoment.month() + 1); + result.start.imply("year", refMoment.year()); + context2.debug(() => { + console.log(`Forward weekly adjusted for ${result} (${result.start})`); + }); + if (result.end && result.end.isOnlyWeekdayComponent()) { + if (refMoment.day() > result.end.get("weekday")) { + refMoment = refMoment.day(result.end.get("weekday") + 7); + } else { + refMoment = refMoment.day(result.end.get("weekday")); + } + result.end.imply("day", refMoment.date()); + result.end.imply("month", refMoment.month() + 1); + result.end.imply("year", refMoment.year()); + context2.debug(() => { + console.log(`Forward weekly adjusted for ${result} (${result.end})`); + }); + } + } + }); + return results; + } + }; + exports.default = ForwardDateRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js +var require_UnlikelyFormatFilter = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var UnlikelyFormatFilter = class extends abstractRefiners_1.Filter { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + isValid(context2, result) { + if (result.text.replace(" ", "").match(/^\d*(\.\d*)?$/)) { + context2.debug(() => { + console.log(`Removing unlikely result '${result.text}'`); + }); + return false; + } + if (!result.start.isValidDate()) { + context2.debug(() => { + console.log(`Removing invalid result: ${result} (${result.start})`); + }); + return false; + } + if (result.end && !result.end.isValidDate()) { + context2.debug(() => { + console.log(`Removing invalid result: ${result} (${result.end})`); + }); + return false; + } + if (this.strictMode) { + return this.isStrictModeValid(context2, result); + } + return true; + } + isStrictModeValid(context2, result) { + if (result.start.isOnlyWeekdayComponent()) { + context2.debug(() => { + console.log(`(Strict) Removing weekday only component: ${result} (${result.end})`); + }); + return false; + } + if (result.start.isOnlyTime() && (!result.start.isCertain("hour") || !result.start.isCertain("minute"))) { + context2.debug(() => { + console.log(`(Strict) Removing uncertain time component: ${result} (${result.end})`); + }); + return false; + } + return true; + } + }; + exports.default = UnlikelyFormatFilter; + } +}); + +// node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js +var require_ISOFormatParser = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})(?:T([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2})(?:\\.(\\d{1,4}))?)?(?:Z|([+-]\\d{2}):?(\\d{2})?)?)?(?=\\W|$)", "i"); + var YEAR_NUMBER_GROUP = 1; + var MONTH_NUMBER_GROUP = 2; + var DATE_NUMBER_GROUP = 3; + var HOUR_NUMBER_GROUP = 4; + var MINUTE_NUMBER_GROUP = 5; + var SECOND_NUMBER_GROUP = 6; + var MILLISECOND_NUMBER_GROUP = 7; + var TZD_HOUR_OFFSET_GROUP = 8; + var TZD_MINUTE_OFFSET_GROUP = 9; + var ISOFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const components = {}; + components["year"] = parseInt(match[YEAR_NUMBER_GROUP]); + components["month"] = parseInt(match[MONTH_NUMBER_GROUP]); + components["day"] = parseInt(match[DATE_NUMBER_GROUP]); + if (match[HOUR_NUMBER_GROUP] != null) { + components["hour"] = parseInt(match[HOUR_NUMBER_GROUP]); + components["minute"] = parseInt(match[MINUTE_NUMBER_GROUP]); + if (match[SECOND_NUMBER_GROUP] != null) { + components["second"] = parseInt(match[SECOND_NUMBER_GROUP]); + } + if (match[MILLISECOND_NUMBER_GROUP] != null) { + components["millisecond"] = parseInt(match[MILLISECOND_NUMBER_GROUP]); + } + if (match[TZD_HOUR_OFFSET_GROUP] == null) { + components["timezoneOffset"] = 0; + } else { + const hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]); + let minuteOffset = 0; + if (match[TZD_MINUTE_OFFSET_GROUP] != null) { + minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]); + } + let offset = hourOffset * 60; + if (offset < 0) { + offset -= minuteOffset; + } else { + offset += minuteOffset; + } + components["timezoneOffset"] = offset; + } + } + return components; + } + }; + exports.default = ISOFormatParser; + } +}); + +// node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js +var require_MergeWeekdayComponentRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var MergeWeekdayComponentRefiner = class extends abstractRefiners_1.MergingRefiner { + mergeResults(textBetween, currentResult, nextResult) { + const newResult = nextResult.clone(); + newResult.index = currentResult.index; + newResult.text = currentResult.text + textBetween + newResult.text; + newResult.start.assign("weekday", currentResult.start.get("weekday")); + if (newResult.end) { + newResult.end.assign("weekday", currentResult.start.get("weekday")); + } + return newResult; + } + shouldMergeResults(textBetween, currentResult, nextResult) { + const weekdayThenNormalDate = currentResult.start.isOnlyWeekdayComponent() && !currentResult.start.isCertain("hour") && nextResult.start.isCertain("day"); + return weekdayThenNormalDate && textBetween.match(/^,?\s*$/) != null; + } + }; + exports.default = MergeWeekdayComponentRefiner; + } +}); + +// node_modules/chrono-node/dist/configurations.js +var require_configurations = __commonJS({ + "node_modules/chrono-node/dist/configurations.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.includeCommonConfiguration = void 0; + var ExtractTimezoneAbbrRefiner_1 = __importDefault2(require_ExtractTimezoneAbbrRefiner()); + var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); + var OverlapRemovalRefiner_1 = __importDefault2(require_OverlapRemovalRefiner()); + var ForwardDateRefiner_1 = __importDefault2(require_ForwardDateRefiner()); + var UnlikelyFormatFilter_1 = __importDefault2(require_UnlikelyFormatFilter()); + var ISOFormatParser_1 = __importDefault2(require_ISOFormatParser()); + var MergeWeekdayComponentRefiner_1 = __importDefault2(require_MergeWeekdayComponentRefiner()); + function includeCommonConfiguration(configuration, strictMode = false) { + configuration.parsers.unshift(new ISOFormatParser_1.default()); + configuration.refiners.unshift(new MergeWeekdayComponentRefiner_1.default()); + configuration.refiners.unshift(new ExtractTimezoneAbbrRefiner_1.default()); + configuration.refiners.unshift(new ExtractTimezoneOffsetRefiner_1.default()); + configuration.refiners.unshift(new OverlapRemovalRefiner_1.default()); + configuration.refiners.push(new OverlapRemovalRefiner_1.default()); + configuration.refiners.push(new ForwardDateRefiner_1.default()); + configuration.refiners.push(new UnlikelyFormatFilter_1.default(strictMode)); + return configuration; + } + exports.includeCommonConfiguration = includeCommonConfiguration; + } +}); + +// node_modules/chrono-node/dist/common/casualReferences.js +var require_casualReferences = __commonJS({ + "node_modules/chrono-node/dist/common/casualReferences.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.noon = exports.morning = exports.midnight = exports.yesterdayEvening = exports.evening = exports.lastNight = exports.tonight = exports.theDayAfter = exports.tomorrow = exports.theDayBefore = exports.yesterday = exports.today = exports.now = void 0; + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var index_1 = require_dist(); + function now(reference) { + const targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.assignSimilarTime(component, targetDate); + if (reference.timezoneOffset !== null) { + component.assign("timezoneOffset", targetDate.utcOffset()); + } + return component; + } + exports.now = now; + function today(reference) { + const targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + return component; + } + exports.today = today; + function yesterday(reference) { + return theDayBefore(reference, 1); + } + exports.yesterday = yesterday; + function theDayBefore(reference, numDay) { + return theDayAfter(reference, -numDay); + } + exports.theDayBefore = theDayBefore; + function tomorrow(reference) { + return theDayAfter(reference, 1); + } + exports.tomorrow = tomorrow; + function theDayAfter(reference, nDays) { + let targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + targetDate = targetDate.add(nDays, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + return component; + } + exports.theDayAfter = theDayAfter; + function tonight(reference, implyHour = 22) { + const targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + component.imply("hour", implyHour); + component.imply("meridiem", index_1.Meridiem.PM); + dayjs_2.assignSimilarDate(component, targetDate); + return component; + } + exports.tonight = tonight; + function lastNight(reference, implyHour = 0) { + let targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + if (targetDate.hour() < 6) { + targetDate = targetDate.add(-1, "day"); + } + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", implyHour); + return component; + } + exports.lastNight = lastNight; + function evening(reference, implyHour = 20) { + const component = new results_1.ParsingComponents(reference, {}); + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", implyHour); + return component; + } + exports.evening = evening; + function yesterdayEvening(reference, implyHour = 20) { + let targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + targetDate = targetDate.add(-1, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", implyHour); + component.imply("meridiem", index_1.Meridiem.PM); + return component; + } + exports.yesterdayEvening = yesterdayEvening; + function midnight(reference) { + const component = new results_1.ParsingComponents(reference, {}); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + return component; + } + exports.midnight = midnight; + function morning(reference, implyHour = 6) { + const component = new results_1.ParsingComponents(reference, {}); + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", implyHour); + return component; + } + exports.morning = morning; + function noon(reference) { + const component = new results_1.ParsingComponents(reference, {}); + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + return component; + } + exports.noon = noon; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js +var require_ENCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var references = __importStar2(require_casualReferences()); + var PATTERN = /(now|today|tonight|tomorrow|tmr|tmrw|yesterday|last\s*night)(?=\W|$)/i; + var ENCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return PATTERN; + } + innerExtract(context2, match) { + let targetDate = dayjs_1.default(context2.refDate); + const lowerText = match[0].toLowerCase(); + const component = context2.createParsingComponents(); + switch (lowerText) { + case "now": + return references.now(context2.reference); + case "today": + return references.today(context2.reference); + case "yesterday": + return references.yesterday(context2.reference); + case "tomorrow": + case "tmr": + case "tmrw": + return references.tomorrow(context2.reference); + case "tonight": + return references.tonight(context2.reference); + default: + if (lowerText.match(/last\s*night/)) { + if (targetDate.hour() > 6) { + targetDate = targetDate.add(-1, "day"); + } + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + break; + } + return component; + } + }; + exports.default = ENCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js +var require_ENCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var PATTERN = /(?:this)?\s{0,3}(morning|afternoon|evening|night|midnight|noon)(?=\W|$)/i; + var ENCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const targetDate = dayjs_1.default(context2.refDate); + const component = context2.createParsingComponents(); + switch (match[1].toLowerCase()) { + case "afternoon": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "evening": + case "night": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 20); + break; + case "midnight": + dayjs_2.assignTheNextDay(component, targetDate); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + break; + case "morning": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "noon": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + } + return component; + } + }; + exports.default = ENCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/common/calculation/weekdays.js +var require_weekdays = __commonJS({ + "node_modules/chrono-node/dist/common/calculation/weekdays.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getBackwardDaysToWeekday = exports.getDaysForwardToWeekday = exports.getDaysToWeekdayClosest = exports.getDaysToWeekday = exports.createParsingComponentsAtWeekday = void 0; + var index_1 = require_dist(); + var results_1 = require_results(); + var timeunits_1 = require_timeunits(); + function createParsingComponentsAtWeekday(reference, weekday, modifier) { + const refDate = reference.getDateWithAdjustedTimezone(); + const daysToWeekday = getDaysToWeekday(refDate, weekday, modifier); + let components = new results_1.ParsingComponents(reference); + components = timeunits_1.addImpliedTimeUnits(components, { "day": daysToWeekday }); + components.assign("weekday", weekday); + return components; + } + exports.createParsingComponentsAtWeekday = createParsingComponentsAtWeekday; + function getDaysToWeekday(refDate, weekday, modifier) { + const refWeekday = refDate.getDay(); + switch (modifier) { + case "this": + return getDaysForwardToWeekday(refDate, weekday); + case "last": + return getBackwardDaysToWeekday(refDate, weekday); + case "next": + if (refWeekday == index_1.Weekday.SUNDAY) { + return weekday == index_1.Weekday.SUNDAY ? 7 : weekday; + } + if (refWeekday == index_1.Weekday.SATURDAY) { + if (weekday == index_1.Weekday.SATURDAY) + return 7; + if (weekday == index_1.Weekday.SUNDAY) + return 8; + return 1 + weekday; + } + if (weekday < refWeekday && weekday != index_1.Weekday.SUNDAY) { + return getDaysForwardToWeekday(refDate, weekday); + } else { + return getDaysForwardToWeekday(refDate, weekday) + 7; + } + } + return getDaysToWeekdayClosest(refDate, weekday); + } + exports.getDaysToWeekday = getDaysToWeekday; + function getDaysToWeekdayClosest(refDate, weekday) { + const backward = getBackwardDaysToWeekday(refDate, weekday); + const forward = getDaysForwardToWeekday(refDate, weekday); + return forward < -backward ? forward : backward; + } + exports.getDaysToWeekdayClosest = getDaysToWeekdayClosest; + function getDaysForwardToWeekday(refDate, weekday) { + const refWeekday = refDate.getDay(); + let forwardCount = weekday - refWeekday; + if (forwardCount < 0) { + forwardCount += 7; + } + return forwardCount; + } + exports.getDaysForwardToWeekday = getDaysForwardToWeekday; + function getBackwardDaysToWeekday(refDate, weekday) { + const refWeekday = refDate.getDay(); + let backwardCount = weekday - refWeekday; + if (backwardCount >= 0) { + backwardCount -= 7; + } + return backwardCount; + } + exports.getBackwardDaysToWeekday = getBackwardDaysToWeekday; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js +var require_ENWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weekdays_1 = require_weekdays(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:on\\s*?)?(?:(this|last|past|next)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(this|last|past|next)\\s*week)?(?=\\W|$)`, "i"); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var ENWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const weekday = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord == "last" || modifierWord == "past") { + modifier = "last"; + } else if (modifierWord == "next") { + modifier = "next"; + } else if (modifierWord == "this") { + modifier = "this"; + } + return weekdays_1.createParsingComponentsAtWeekday(context2.reference, weekday, modifier); + } + }; + exports.default = ENWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js +var require_ENRelativeDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var pattern_1 = require_pattern(); + var PATTERN = new RegExp(`(this|last|past|next|after\\s*this)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`, "i"); + var MODIFIER_WORD_GROUP = 1; + var RELATIVE_WORD_GROUP = 2; + var ENRelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); + const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); + const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; + if (modifier == "next" || modifier.startsWith("after")) { + const timeUnits = {}; + timeUnits[timeunit] = 1; + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + if (modifier == "last" || modifier == "past") { + const timeUnits = {}; + timeUnits[timeunit] = -1; + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + const components = context2.createParsingComponents(); + let date = dayjs_1.default(context2.reference.instant); + if (unitWord.match(/week/i)) { + date = date.add(-date.get("d"), "d"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.imply("year", date.year()); + } else if (unitWord.match(/month/i)) { + date = date.add(-date.date() + 1, "d"); + components.imply("day", date.date()); + components.assign("year", date.year()); + components.assign("month", date.month() + 1); + } else if (unitWord.match(/year/i)) { + date = date.add(-date.date() + 1, "d"); + date = date.add(-date.month(), "month"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.assign("year", date.year()); + } + return components; + } + }; + exports.default = ENRelativeDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/chrono.js +var require_chrono = __commonJS({ + "node_modules/chrono-node/dist/chrono.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ParsingContext = exports.Chrono = void 0; + var results_1 = require_results(); + var en_1 = require_en(); + var Chrono = class { + constructor(configuration) { + configuration = configuration || en_1.createCasualConfiguration(); + this.parsers = [...configuration.parsers]; + this.refiners = [...configuration.refiners]; + } + clone() { + return new Chrono({ + parsers: [...this.parsers], + refiners: [...this.refiners] + }); + } + parseDate(text, referenceDate, option) { + const results = this.parse(text, referenceDate, option); + return results.length > 0 ? results[0].start.date() : null; + } + parse(text, referenceDate, option) { + const context2 = new ParsingContext(text, referenceDate, option); + let results = []; + this.parsers.forEach((parser) => { + const parsedResults = Chrono.executeParser(context2, parser); + results = results.concat(parsedResults); + }); + results.sort((a3, b2) => { + return a3.index - b2.index; + }); + this.refiners.forEach(function(refiner) { + results = refiner.refine(context2, results); + }); + return results; + } + static executeParser(context2, parser) { + const results = []; + const pattern = parser.pattern(context2); + const originalText = context2.text; + let remainingText = context2.text; + let match = pattern.exec(remainingText); + while (match) { + const index = match.index + originalText.length - remainingText.length; + match.index = index; + const result = parser.extract(context2, match); + if (!result) { + remainingText = originalText.substring(match.index + 1); + match = pattern.exec(remainingText); + continue; + } + let parsedResult = null; + if (result instanceof results_1.ParsingResult) { + parsedResult = result; + } else if (result instanceof results_1.ParsingComponents) { + parsedResult = context2.createParsingResult(match.index, match[0]); + parsedResult.start = result; + } else { + parsedResult = context2.createParsingResult(match.index, match[0], result); + } + context2.debug(() => console.log(`${parser.constructor.name} extracted result ${parsedResult}`)); + results.push(parsedResult); + remainingText = originalText.substring(index + parsedResult.text.length); + match = pattern.exec(remainingText); + } + return results; + } + }; + exports.Chrono = Chrono; + var ParsingContext = class { + constructor(text, refDate, option) { + this.text = text; + this.reference = new results_1.ReferenceWithTimezone(refDate); + this.option = option !== null && option !== void 0 ? option : {}; + this.refDate = this.reference.instant; + } + createParsingComponents(components) { + if (components instanceof results_1.ParsingComponents) { + return components; + } + return new results_1.ParsingComponents(this.reference, components); + } + createParsingResult(index, textOrEndIndex, startComponents, endComponents) { + const text = typeof textOrEndIndex === "string" ? textOrEndIndex : this.text.substring(index, textOrEndIndex); + const start = startComponents ? this.createParsingComponents(startComponents) : null; + const end = endComponents ? this.createParsingComponents(endComponents) : null; + return new results_1.ParsingResult(this.reference, index, text, start, end); + } + debug(block) { + if (this.option.debug) { + if (this.option.debug instanceof Function) { + this.option.debug(block); + } else { + const handler = this.option.debug; + handler.debug(block); + } + } + } + }; + exports.ParsingContext = ParsingContext; + } +}); + +// node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js +var require_SlashDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var PATTERN = new RegExp("([^\\d]|^)([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?(\\W|$)", "i"); + var OPENING_GROUP = 1; + var ENDING_GROUP = 5; + var FIRST_NUMBERS_GROUP = 2; + var SECOND_NUMBERS_GROUP = 3; + var YEAR_GROUP = 4; + var SlashDateFormatParser = class { + constructor(littleEndian) { + this.groupNumberMonth = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP; + this.groupNumberDay = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP; + } + pattern() { + return PATTERN; + } + extract(context2, match) { + if (match[OPENING_GROUP] == "/" || match[ENDING_GROUP] == "/") { + match.index += match[0].length; + return; + } + const index = match.index + match[OPENING_GROUP].length; + const text = match[0].substr(match[OPENING_GROUP].length, match[0].length - match[OPENING_GROUP].length - match[ENDING_GROUP].length); + if (text.match(/^\d\.\d$/) || text.match(/^\d\.\d{1,2}\.\d{1,2}\s*$/)) { + return; + } + if (!match[YEAR_GROUP] && match[0].indexOf("/") < 0) { + return; + } + const result = context2.createParsingResult(index, text); + let month = parseInt(match[this.groupNumberMonth]); + let day = parseInt(match[this.groupNumberDay]); + if (month < 1 || month > 12) { + if (month > 12) { + if (day >= 1 && day <= 12 && month <= 31) { + [day, month] = [month, day]; + } else { + return null; + } + } + } + if (day < 1 || day > 31) { + return null; + } + result.start.assign("day", day); + result.start.assign("month", month); + if (match[YEAR_GROUP]) { + const rawYearNumber = parseInt(match[YEAR_GROUP]); + const year = years_1.findMostLikelyADYear(rawYearNumber); + result.start.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, day, month); + result.start.imply("year", year); + } + return result; + } + }; + exports.default = SlashDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +var require_ENTimeUnitCasualRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(this|last|past|next|after|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var ENTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const prefix = match[1].toLowerCase(); + let timeUnits = constants_1.parseTimeUnits(match[2]); + switch (prefix) { + case "last": + case "past": + case "-": + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + break; + } + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + }; + exports.default = ENTimeUnitCasualRelativeFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/refiners/ENMergeRelativeDateRefiner.js +var require_ENMergeRelativeDateRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/en/refiners/ENMergeRelativeDateRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var results_1 = require_results(); + var constants_1 = require_constants(); + var timeunits_1 = require_timeunits(); + function hasImpliedEarlierReferenceDate(result) { + return result.text.match(/\s+(before|from)$/i) != null; + } + function hasImpliedLaterReferenceDate(result) { + return result.text.match(/\s+(after|since)$/i) != null; + } + var ENMergeRelativeDateRefiner = class extends abstractRefiners_1.MergingRefiner { + patternBetween() { + return /^\s*$/i; + } + shouldMergeResults(textBetween, currentResult, nextResult) { + if (!textBetween.match(this.patternBetween())) { + return false; + } + if (!hasImpliedEarlierReferenceDate(currentResult) && !hasImpliedLaterReferenceDate(currentResult)) { + return false; + } + return !!nextResult.start.get("day") && !!nextResult.start.get("month") && !!nextResult.start.get("year"); + } + mergeResults(textBetween, currentResult, nextResult) { + let timeUnits = constants_1.parseTimeUnits(currentResult.text); + if (hasImpliedEarlierReferenceDate(currentResult)) { + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + } + const components = results_1.ParsingComponents.createRelativeFromReference(new results_1.ReferenceWithTimezone(nextResult.start.date()), timeUnits); + return new results_1.ParsingResult(nextResult.reference, currentResult.index, `${currentResult.text}${textBetween}${nextResult.text}`, components); + } + }; + exports.default = ENMergeRelativeDateRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/en/index.js +var require_en = __commonJS({ + "node_modules/chrono-node/dist/locales/en/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.GB = exports.strict = exports.casual = void 0; + var ENTimeUnitWithinFormatParser_1 = __importDefault2(require_ENTimeUnitWithinFormatParser()); + var ENMonthNameLittleEndianParser_1 = __importDefault2(require_ENMonthNameLittleEndianParser()); + var ENMonthNameMiddleEndianParser_1 = __importDefault2(require_ENMonthNameMiddleEndianParser()); + var ENMonthNameParser_1 = __importDefault2(require_ENMonthNameParser()); + var ENCasualYearMonthDayParser_1 = __importDefault2(require_ENCasualYearMonthDayParser()); + var ENSlashMonthFormatParser_1 = __importDefault2(require_ENSlashMonthFormatParser()); + var ENTimeExpressionParser_1 = __importDefault2(require_ENTimeExpressionParser()); + var ENTimeUnitAgoFormatParser_1 = __importDefault2(require_ENTimeUnitAgoFormatParser()); + var ENTimeUnitLaterFormatParser_1 = __importDefault2(require_ENTimeUnitLaterFormatParser()); + var ENMergeDateRangeRefiner_1 = __importDefault2(require_ENMergeDateRangeRefiner()); + var ENMergeDateTimeRefiner_1 = __importDefault2(require_ENMergeDateTimeRefiner()); + var configurations_1 = require_configurations(); + var ENCasualDateParser_1 = __importDefault2(require_ENCasualDateParser()); + var ENCasualTimeParser_1 = __importDefault2(require_ENCasualTimeParser()); + var ENWeekdayParser_1 = __importDefault2(require_ENWeekdayParser()); + var ENRelativeDateFormatParser_1 = __importDefault2(require_ENRelativeDateFormatParser()); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var ENTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_ENTimeUnitCasualRelativeFormatParser()); + var ENMergeRelativeDateRefiner_1 = __importDefault2(require_ENMergeRelativeDateRefiner()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration(false)); + exports.strict = new chrono_1.Chrono(createConfiguration(true, false)); + exports.GB = new chrono_1.Chrono(createConfiguration(false, true)); + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = false) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new ENCasualDateParser_1.default()); + option.parsers.unshift(new ENCasualTimeParser_1.default()); + option.parsers.unshift(new ENMonthNameParser_1.default()); + option.parsers.unshift(new ENRelativeDateFormatParser_1.default()); + option.parsers.unshift(new ENTimeUnitCasualRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = false) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new ENTimeUnitWithinFormatParser_1.default(), + new ENMonthNameLittleEndianParser_1.default(), + new ENMonthNameMiddleEndianParser_1.default(), + new ENWeekdayParser_1.default(), + new ENCasualYearMonthDayParser_1.default(), + new ENSlashMonthFormatParser_1.default(), + new ENTimeExpressionParser_1.default(strictMode), + new ENTimeUnitAgoFormatParser_1.default(strictMode), + new ENTimeUnitLaterFormatParser_1.default(strictMode) + ], + refiners: [new ENMergeRelativeDateRefiner_1.default(), new ENMergeDateTimeRefiner_1.default(), new ENMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js +var require_DETimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var DETimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:um|von)\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|bis)\\s*"; + } + extractPrimaryTimeComponents(context2, match) { + if (match[0].match(/^\s*\d{4}\s*$/)) { + return null; + } + return super.extractPrimaryTimeComponents(context2, match); + } + }; + exports.default = DETimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/constants.js +var require_constants2 = __commonJS({ + "node_modules/chrono-node/dist/locales/de/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.WEEKDAY_DICTIONARY = { + "sonntag": 0, + "so": 0, + "montag": 1, + "mo": 1, + "dienstag": 2, + "di": 2, + "mittwoch": 3, + "mi": 3, + "donnerstag": 4, + "do": 4, + "freitag": 5, + "fr": 5, + "samstag": 6, + "sa": 6 + }; + exports.MONTH_DICTIONARY = { + "januar": 1, + "j\xE4nner": 1, + "janner": 1, + "jan": 1, + "jan.": 1, + "februar": 2, + "feber": 2, + "feb": 2, + "feb.": 2, + "m\xE4rz": 3, + "maerz": 3, + "m\xE4r": 3, + "m\xE4r.": 3, + "mrz": 3, + "mrz.": 3, + "april": 4, + "apr": 4, + "apr.": 4, + "mai": 5, + "juni": 6, + "jun": 6, + "jun.": 6, + "juli": 7, + "jul": 7, + "jul.": 7, + "august": 8, + "aug": 8, + "aug.": 8, + "september": 9, + "sep": 9, + "sep.": 9, + "sept": 9, + "sept.": 9, + "oktober": 10, + "okt": 10, + "okt.": 10, + "november": 11, + "nov": 11, + "nov.": 11, + "dezember": 12, + "dez": 12, + "dez.": 12 + }; + exports.INTEGER_WORD_DICTIONARY = { + "eins": 1, + "eine": 1, + "einem": 1, + "einen": 1, + "einer": 1, + "zwei": 2, + "drei": 3, + "vier": 4, + "f\xFCnf": 5, + "fuenf": 5, + "sechs": 6, + "sieben": 7, + "acht": 8, + "neun": 9, + "zehn": 10, + "elf": 11, + "zw\xF6lf": 12, + "zwoelf": 12 + }; + exports.TIME_UNIT_DICTIONARY = { + sek: "second", + sekunde: "second", + sekunden: "second", + min: "minute", + minute: "minute", + minuten: "minute", + h: "hour", + std: "hour", + stunde: "hour", + stunden: "hour", + tag: "d", + tage: "d", + tagen: "d", + woche: "week", + wochen: "week", + monat: "month", + monate: "month", + monaten: "month", + monats: "month", + quartal: "quarter", + quartals: "quarter", + quartale: "quarter", + quartalen: "quarter", + a: "year", + j: "year", + jr: "year", + jahr: "year", + jahre: "year", + jahren: "year", + jahres: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?\\b(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "a" || num === "an") { + return 1; + } else if (num.match(/few/)) { + return 3; + } else if (num.match(/half/)) { + return 0.5; + } else if (num.match(/couple/)) { + return 2; + } else if (num.match(/several/)) { + return 7; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.YEAR_PATTERN = `(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*(?:C(?:hr)?|(?:u\\.?|d\\.?(?:\\s*g\\.?)?)?\\s*Z)\\.?|\\s*(?:u\\.?|d\\.?(?:\\s*g\\.)?)\\s*Z\\.?)?)`; + function parseYear(match) { + if (/v/i.test(match)) { + return -parseInt(match.replace(/[^0-9]+/gi, "")); + } + if (/n/i.test(match)) { + return parseInt(match.replace(/[^0-9]+/gi, "")); + } + if (/z/i.test(match)) { + return parseInt(match.replace(/[^0-9]+/gi, "")); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js +var require_DEWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants2(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weekdays_1 = require_weekdays(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:a[mn]\\s*?)?(?:(diese[mn]|letzte[mn]|n(?:\xE4|ae)chste[mn])\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(diese|letzte|n(?:\xE4|ae)chste)\\s*woche)?(?=\\W|$)`, "i"); + var PREFIX_GROUP = 1; + var SUFFIX_GROUP = 3; + var WEEKDAY_GROUP = 2; + var DEWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[SUFFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord.match(/letzte/)) { + modifier = "last"; + } else if (modifierWord.match(/chste/)) { + modifier = "next"; + } else if (modifierWord.match(/diese/)) { + modifier = "this"; + } + return weekdays_1.createParsingComponentsAtWeekday(context2.reference, offset, modifier); + } + }; + exports.default = DEWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DESpecificTimeExpressionParser.js +var require_DESpecificTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DESpecificTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var FIRST_REG_PATTERN = new RegExp("(^|\\s|T)(?:(?:um|von)\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)", "i"); + var SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|bis(?:\\s+um)?|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)", "i"); + var HOUR_GROUP = 2; + var MINUTE_GROUP = 3; + var SECOND_GROUP = 4; + var AM_PM_HOUR_GROUP = 5; + var DESpecificTimeExpressionParser = class { + pattern(context2) { + return FIRST_REG_PATTERN; + } + extract(context2, match) { + const result = context2.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length)); + if (result.text.match(/^\d{4}$/)) { + match.index += match[0].length; + return null; + } + result.start = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match); + if (!result.start) { + match.index += match[0].length; + return null; + } + const remainingText = context2.text.substring(match.index + match[0].length); + const secondMatch = SECOND_REG_PATTERN.exec(remainingText); + if (secondMatch) { + result.end = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch); + if (result.end) { + result.text += secondMatch[0]; + } + } + return result; + } + static extractTimeComponent(extractingComponents, match) { + let hour = 0; + let minute = 0; + let meridiem = null; + hour = parseInt(match[HOUR_GROUP]); + if (match[MINUTE_GROUP] != null) { + minute = parseInt(match[MINUTE_GROUP]); + } + if (minute >= 60 || hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP].toLowerCase(); + if (ampm.match(/morgen|vormittag/)) { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + } + } + if (ampm.match(/nachmittag|abend/)) { + meridiem = index_1.Meridiem.PM; + if (hour != 12) { + hour += 12; + } + } + if (ampm.match(/nacht/)) { + if (hour == 12) { + meridiem = index_1.Meridiem.AM; + hour = 0; + } else if (hour < 6) { + meridiem = index_1.Meridiem.AM; + } else { + meridiem = index_1.Meridiem.PM; + hour += 12; + } + } + } + extractingComponents.assign("hour", hour); + extractingComponents.assign("minute", minute); + if (meridiem !== null) { + extractingComponents.assign("meridiem", meridiem); + } else { + if (hour < 12) { + extractingComponents.imply("meridiem", index_1.Meridiem.AM); + } else { + extractingComponents.imply("meridiem", index_1.Meridiem.PM); + } + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + extractingComponents.assign("second", second); + } + return extractingComponents; + } + }; + exports.default = DESpecificTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js +var require_DEMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var DEMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(bis(?:\s*(?:am|zum))?|-)\s*$/i; + } + }; + exports.default = DEMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js +var require_DEMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var DEMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(T|um|am|,|-)?\\s*$"); + } + }; + exports.default = DEMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js +var require_DECasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var timeunits_1 = require_timeunits(); + var DECasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return /(diesen)?\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht)(?=\W|$)/i; + } + innerExtract(context2, match) { + const targetDate = dayjs_1.default(context2.refDate); + const timeKeywordPattern = match[2].toLowerCase(); + const component = context2.createParsingComponents(); + dayjs_2.implySimilarTime(component, targetDate); + return DECasualTimeParser.extractTimeComponents(component, timeKeywordPattern); + } + static extractTimeComponents(component, timeKeywordPattern) { + switch (timeKeywordPattern) { + case "morgen": + component.imply("hour", 6); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "vormittag": + component.imply("hour", 9); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "mittag": + case "mittags": + component.imply("hour", 12); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "nachmittag": + component.imply("hour", 15); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "abend": + component.imply("hour", 18); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "nacht": + component.imply("hour", 22); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "mitternacht": + if (component.get("hour") > 1) { + component = timeunits_1.addImpliedTimeUnits(component, { "day": 1 }); + } + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + } + return component; + } + }; + exports.default = DECasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js +var require_DECasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var DECasualTimeParser_1 = __importDefault2(require_DECasualTimeParser()); + var references = __importStar2(require_casualReferences()); + var PATTERN = new RegExp(`(jetzt|heute|morgen|\xFCbermorgen|uebermorgen|gestern|vorgestern|letzte\\s*nacht)(?:\\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var TIME_GROUP = 2; + var DECasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return PATTERN; + } + innerExtract(context2, match) { + let targetDate = dayjs_1.default(context2.refDate); + const dateKeyword = (match[DATE_GROUP] || "").toLowerCase(); + const timeKeyword = (match[TIME_GROUP] || "").toLowerCase(); + let component = context2.createParsingComponents(); + switch (dateKeyword) { + case "jetzt": + component = references.now(context2.reference); + break; + case "heute": + component = references.today(context2.reference); + break; + case "morgen": + dayjs_2.assignTheNextDay(component, targetDate); + break; + case "\xFCbermorgen": + case "uebermorgen": + targetDate = targetDate.add(1, "day"); + dayjs_2.assignTheNextDay(component, targetDate); + break; + case "gestern": + targetDate = targetDate.add(-1, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + break; + case "vorgestern": + targetDate = targetDate.add(-2, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + break; + default: + if (dateKeyword.match(/letzte\s*nacht/)) { + if (targetDate.hour() > 6) { + targetDate = targetDate.add(-1, "day"); + } + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + break; + } + if (timeKeyword) { + component = DECasualTimeParser_1.default.extractTimeComponents(component, timeKeyword); + } + return component; + } + }; + exports.default = DECasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js +var require_DEMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants2(); + var constants_2 = require_constants2(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:am\\s*?)?(?:den\\s*?)?([0-9]{1,2})\\.(?:\\s*(?:bis(?:\\s*(?:am|zum))?|\\-|\\\u2013|\\s)\\s*([0-9]{1,2})\\.?)?\\s*(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var DEMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = parseInt(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = parseInt(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = DEMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js +var require_DETimeUnitRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants2(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var pattern_1 = require_pattern(); + var DETimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor() { + super(); + } + innerPattern() { + return new RegExp(`(?:\\s*((?:n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?|vor|in)\\s*)?(${constants_1.NUMBER_PATTERN})?(?:\\s*(n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?)?\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})`, "i"); + } + innerExtract(context2, match) { + const num = match[2] ? constants_1.parseNumberPattern(match[2]) : 1; + const unit = constants_1.TIME_UNIT_DICTIONARY[match[4].toLowerCase()]; + let timeUnits = {}; + timeUnits[unit] = num; + let modifier = match[1] || match[3] || ""; + modifier = modifier.toLowerCase(); + if (!modifier) { + return; + } + if (/vor/.test(modifier) || /letzte/.test(modifier) || /vergangen/.test(modifier)) { + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + } + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + }; + exports.default = DETimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/index.js +var require_de = __commonJS({ + "node_modules/chrono-node/dist/locales/de/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var ISOFormatParser_1 = __importDefault2(require_ISOFormatParser()); + var DETimeExpressionParser_1 = __importDefault2(require_DETimeExpressionParser()); + var DEWeekdayParser_1 = __importDefault2(require_DEWeekdayParser()); + var DESpecificTimeExpressionParser_1 = __importDefault2(require_DESpecificTimeExpressionParser()); + var DEMergeDateRangeRefiner_1 = __importDefault2(require_DEMergeDateRangeRefiner()); + var DEMergeDateTimeRefiner_1 = __importDefault2(require_DEMergeDateTimeRefiner()); + var DECasualDateParser_1 = __importDefault2(require_DECasualDateParser()); + var DECasualTimeParser_1 = __importDefault2(require_DECasualTimeParser()); + var DEMonthNameLittleEndianParser_1 = __importDefault2(require_DEMonthNameLittleEndianParser()); + var DETimeUnitRelativeFormatParser_1 = __importDefault2(require_DETimeUnitRelativeFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new DECasualTimeParser_1.default()); + option.parsers.unshift(new DECasualDateParser_1.default()); + option.parsers.unshift(new DETimeUnitRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new ISOFormatParser_1.default(), + new SlashDateFormatParser_1.default(littleEndian), + new DETimeExpressionParser_1.default(), + new DESpecificTimeExpressionParser_1.default(), + new DEMonthNameLittleEndianParser_1.default(), + new DEWeekdayParser_1.default() + ], + refiners: [new DEMergeDateRangeRefiner_1.default(), new DEMergeDateTimeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js +var require_FRCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var references = __importStar2(require_casualReferences()); + var FRCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return /(maintenant|aujourd'hui|demain|hier|cette\s*nuit|la\s*veille)(?=\W|$)/i; + } + innerExtract(context2, match) { + let targetDate = dayjs_1.default(context2.refDate); + const lowerText = match[0].toLowerCase(); + const component = context2.createParsingComponents(); + switch (lowerText) { + case "maintenant": + return references.now(context2.reference); + case "aujourd'hui": + return references.today(context2.reference); + case "hier": + return references.yesterday(context2.reference); + case "demain": + return references.tomorrow(context2.reference); + default: + if (lowerText.match(/cette\s*nuit/)) { + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 22); + component.imply("meridiem", index_1.Meridiem.PM); + } else if (lowerText.match(/la\s*veille/)) { + targetDate = targetDate.add(-1, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + } + return component; + } + }; + exports.default = FRCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js +var require_FRCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var FRCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return /(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i; + } + innerExtract(context2, match) { + const suffixLower = match[2].toLowerCase(); + const component = context2.createParsingComponents(); + switch (suffixLower) { + case "apr\xE8s-midi": + case "aprem": + component.imply("hour", 14); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "soir": + component.imply("hour", 18); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "matin": + component.imply("hour", 8); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "a midi": + component.imply("hour", 12); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "\xE0 minuit": + component.imply("hour", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + } + return component; + } + }; + exports.default = FRCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js +var require_FRTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var FRTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:[\xE0a])\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*"; + } + extractPrimaryTimeComponents(context2, match) { + if (match[0].match(/^\s*\d{4}\s*$/)) { + return null; + } + return super.extractPrimaryTimeComponents(context2, match); + } + }; + exports.default = FRTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js +var require_FRMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var FRMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(T|\xE0|a|vers|de|,|-)?\\s*$"); + } + }; + exports.default = FRMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js +var require_FRMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var FRMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(à|a|-)\s*$/i; + } + }; + exports.default = FRMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/fr/constants.js +var require_constants3 = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + exports.WEEKDAY_DICTIONARY = { + "dimanche": 0, + "dim": 0, + "lundi": 1, + "lun": 1, + "mardi": 2, + "mar": 2, + "mercredi": 3, + "mer": 3, + "jeudi": 4, + "jeu": 4, + "vendredi": 5, + "ven": 5, + "samedi": 6, + "sam": 6 + }; + exports.MONTH_DICTIONARY = { + "janvier": 1, + "jan": 1, + "jan.": 1, + "f\xE9vrier": 2, + "f\xE9v": 2, + "f\xE9v.": 2, + "fevrier": 2, + "fev": 2, + "fev.": 2, + "mars": 3, + "mar": 3, + "mar.": 3, + "avril": 4, + "avr": 4, + "avr.": 4, + "mai": 5, + "juin": 6, + "jun": 6, + "juillet": 7, + "juil": 7, + "jul": 7, + "jul.": 7, + "ao\xFBt": 8, + "aout": 8, + "septembre": 9, + "sep": 9, + "sep.": 9, + "sept": 9, + "sept.": 9, + "octobre": 10, + "oct": 10, + "oct.": 10, + "novembre": 11, + "nov": 11, + "nov.": 11, + "d\xE9cembre": 12, + "decembre": 12, + "dec": 12, + "dec.": 12 + }; + exports.INTEGER_WORD_DICTIONARY = { + "un": 1, + "deux": 2, + "trois": 3, + "quatre": 4, + "cinq": 5, + "six": 6, + "sept": 7, + "huit": 8, + "neuf": 9, + "dix": 10, + "onze": 11, + "douze": 12, + "treize": 13 + }; + exports.TIME_UNIT_DICTIONARY = { + "sec": "second", + "seconde": "second", + "secondes": "second", + "min": "minute", + "mins": "minute", + "minute": "minute", + "minutes": "minute", + "h": "hour", + "hr": "hour", + "hrs": "hour", + "heure": "hour", + "heures": "hour", + "jour": "d", + "jours": "d", + "semaine": "week", + "semaines": "week", + "mois": "month", + "trimestre": "quarter", + "trimestres": "quarter", + "ans": "year", + "ann\xE9e": "year", + "ann\xE9es": "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|une?\\b|quelques?|demi-?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "une" || num === "un") { + return 1; + } else if (num.match(/quelques?/)) { + return 3; + } else if (num.match(/demi-?/)) { + return 0.5; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:er)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + num = num.replace(/(?:er)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])`; + function parseYear(match) { + if (/AC/i.test(match)) { + match = match.replace(/BC/i, ""); + return -parseInt(match); + } + if (/AD/i.test(match) || /C/i.test(match)) { + match = match.replace(/[^\d]+/i, ""); + return parseInt(match); + } + let yearNumber = parseInt(match); + if (yearNumber < 100) { + if (yearNumber > 50) { + yearNumber = yearNumber + 1900; + } else { + yearNumber = yearNumber + 2e3; + } + } + return yearNumber; + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js +var require_FRWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weekdays_1 = require_weekdays(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(?:ce)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(dernier|prochain)\\s*)?(?=\\W|\\d|$)`, "i"); + var WEEKDAY_GROUP = 1; + var POSTFIX_GROUP = 2; + var FRWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const weekday = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + if (weekday === void 0) { + return null; + } + let suffix = match[POSTFIX_GROUP]; + suffix = suffix || ""; + suffix = suffix.toLowerCase(); + let modifier = null; + if (suffix == "dernier") { + modifier = "last"; + } else if (suffix == "prochain") { + modifier = "next"; + } + return weekdays_1.createParsingComponentsAtWeekday(context2.reference, weekday, modifier); + } + }; + exports.default = FRWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js +var require_FRSpecificTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var FIRST_REG_PATTERN = new RegExp("(^|\\s|T)(?:(?:[\xE0a])\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)", "i"); + var SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)", "i"); + var HOUR_GROUP = 2; + var MINUTE_GROUP = 3; + var SECOND_GROUP = 4; + var AM_PM_HOUR_GROUP = 5; + var FRSpecificTimeExpressionParser = class { + pattern(context2) { + return FIRST_REG_PATTERN; + } + extract(context2, match) { + const result = context2.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length)); + if (result.text.match(/^\d{4}$/)) { + match.index += match[0].length; + return null; + } + result.start = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match); + if (!result.start) { + match.index += match[0].length; + return null; + } + const remainingText = context2.text.substring(match.index + match[0].length); + const secondMatch = SECOND_REG_PATTERN.exec(remainingText); + if (secondMatch) { + result.end = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch); + if (result.end) { + result.text += secondMatch[0]; + } + } + return result; + } + static extractTimeComponent(extractingComponents, match) { + let hour = 0; + let minute = 0; + let meridiem = null; + hour = parseInt(match[HOUR_GROUP]); + if (match[MINUTE_GROUP] != null) { + minute = parseInt(match[MINUTE_GROUP]); + } + if (minute >= 60 || hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + } + } + if (ampm == "p") { + meridiem = index_1.Meridiem.PM; + if (hour != 12) { + hour += 12; + } + } + } + extractingComponents.assign("hour", hour); + extractingComponents.assign("minute", minute); + if (meridiem !== null) { + extractingComponents.assign("meridiem", meridiem); + } else { + if (hour < 12) { + extractingComponents.imply("meridiem", index_1.Meridiem.AM); + } else { + extractingComponents.imply("meridiem", index_1.Meridiem.PM); + } + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + extractingComponents.assign("second", second); + } + return extractingComponents; + } + }; + exports.default = FRSpecificTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js +var require_FRMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants3(); + var constants_2 = require_constants3(); + var constants_3 = require_constants3(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:on\\s*?)?(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:au|\\-|\\\u2013|jusqu'au?|\\s)\\s*(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:de)?\\s*)(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var FRMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = FRMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js +var require_FRTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var FRTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor() { + super(); + } + innerPattern() { + return new RegExp(`il y a\\s*(${constants_1.TIME_UNITS_PATTERN})(?=(?:\\W|$))`, "i"); + } + innerExtract(context2, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, outputTimeUnits); + } + }; + exports.default = FRTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js +var require_FRTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var FRTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp(`(?:dans|en|pour|pendant|de)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + } + innerExtract(context2, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + }; + exports.default = FRTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +var require_FRTimeUnitRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var pattern_1 = require_pattern(); + var FRTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor() { + super(); + } + innerPattern() { + return new RegExp(`(?:les?|la|l'|du|des?)\\s*(${constants_1.NUMBER_PATTERN})?(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?`, "i"); + } + innerExtract(context2, match) { + const num = match[1] ? constants_1.parseNumberPattern(match[1]) : 1; + const unit = constants_1.TIME_UNIT_DICTIONARY[match[3].toLowerCase()]; + let timeUnits = {}; + timeUnits[unit] = num; + let modifier = match[2] || match[4] || ""; + modifier = modifier.toLowerCase(); + if (!modifier) { + return; + } + if (/derni[eè]re?s?/.test(modifier) || /pass[ée]e?s?/.test(modifier) || /pr[ée]c[ée]dents?/.test(modifier)) { + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + } + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + }; + exports.default = FRTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/index.js +var require_fr = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var FRCasualDateParser_1 = __importDefault2(require_FRCasualDateParser()); + var FRCasualTimeParser_1 = __importDefault2(require_FRCasualTimeParser()); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var FRTimeExpressionParser_1 = __importDefault2(require_FRTimeExpressionParser()); + var FRMergeDateTimeRefiner_1 = __importDefault2(require_FRMergeDateTimeRefiner()); + var FRMergeDateRangeRefiner_1 = __importDefault2(require_FRMergeDateRangeRefiner()); + var FRWeekdayParser_1 = __importDefault2(require_FRWeekdayParser()); + var FRSpecificTimeExpressionParser_1 = __importDefault2(require_FRSpecificTimeExpressionParser()); + var FRMonthNameLittleEndianParser_1 = __importDefault2(require_FRMonthNameLittleEndianParser()); + var FRTimeUnitAgoFormatParser_1 = __importDefault2(require_FRTimeUnitAgoFormatParser()); + var FRTimeUnitWithinFormatParser_1 = __importDefault2(require_FRTimeUnitWithinFormatParser()); + var FRTimeUnitRelativeFormatParser_1 = __importDefault2(require_FRTimeUnitRelativeFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new FRCasualDateParser_1.default()); + option.parsers.unshift(new FRCasualTimeParser_1.default()); + option.parsers.unshift(new FRTimeUnitRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new FRMonthNameLittleEndianParser_1.default(), + new FRTimeExpressionParser_1.default(), + new FRSpecificTimeExpressionParser_1.default(), + new FRTimeUnitAgoFormatParser_1.default(), + new FRTimeUnitWithinFormatParser_1.default(), + new FRWeekdayParser_1.default() + ], + refiners: [new FRMergeDateTimeRefiner_1.default(), new FRMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/ja/constants.js +var require_constants4 = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.toHankaku = void 0; + function toHankaku(text) { + return String(text).replace(/\u2019/g, "'").replace(/\u201D/g, '"').replace(/\u3000/g, " ").replace(/\uFFE5/g, "\xA5").replace(/[\uFF01\uFF03-\uFF06\uFF08\uFF09\uFF0C-\uFF19\uFF1C-\uFF1F\uFF21-\uFF3B\uFF3D\uFF3F\uFF41-\uFF5B\uFF5D\uFF5E]/g, alphaNum); + } + exports.toHankaku = toHankaku; + function alphaNum(token) { + return String.fromCharCode(token.charCodeAt(0) - 65248); + } + } +}); + +// node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js +var require_JPStandardParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants4(); + var years_1 = require_years(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var PATTERN = /(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i; + var SPECIAL_YEAR_GROUP = 1; + var TYPICAL_YEAR_GROUP = 2; + var ERA_GROUP = 3; + var YEAR_NUMBER_GROUP = 4; + var MONTH_GROUP = 5; + var DAY_GROUP = 6; + var JPStandardParser = class { + pattern() { + return PATTERN; + } + extract(context2, match) { + const month = parseInt(constants_1.toHankaku(match[MONTH_GROUP])); + const day = parseInt(constants_1.toHankaku(match[DAY_GROUP])); + const components = context2.createParsingComponents({ + day, + month + }); + if (match[SPECIAL_YEAR_GROUP] && match[SPECIAL_YEAR_GROUP].match("\u540C|\u4ECA|\u672C")) { + const moment3 = dayjs_1.default(context2.refDate); + components.assign("year", moment3.year()); + } + if (match[TYPICAL_YEAR_GROUP]) { + const yearNumText = match[YEAR_NUMBER_GROUP]; + let year = yearNumText == "\u5143" ? 1 : parseInt(constants_1.toHankaku(yearNumText)); + if (match[ERA_GROUP] == "\u4EE4\u548C") { + year += 2018; + } else if (match[ERA_GROUP] == "\u5E73\u6210") { + year += 1988; + } else if (match[ERA_GROUP] == "\u662D\u548C") { + year += 1925; + } + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, day, month); + components.imply("year", year); + } + return components; + } + }; + exports.default = JPStandardParser; + } +}); + +// node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js +var require_JPMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var JPMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(から|ー|-)\s*$/i; + } + }; + exports.default = JPMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js +var require_JPCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var index_1 = require_dist(); + var references = __importStar2(require_casualReferences()); + var PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i; + var JPCasualDateParser = class { + pattern() { + return PATTERN; + } + extract(context2, match) { + const text = match[0]; + const date = dayjs_1.default(context2.refDate); + const components = context2.createParsingComponents(); + switch (text) { + case "\u6628\u65E5": + return references.yesterday(context2.reference); + case "\u660E\u65E5": + return references.tomorrow(context2.reference); + case "\u4ECA\u65E5": + case "\u5F53\u65E5": + return references.today(context2.reference); + } + if (text == "\u4ECA\u591C" || text == "\u4ECA\u5915" || text == "\u4ECA\u6669") { + components.imply("hour", 22); + components.assign("meridiem", index_1.Meridiem.PM); + } else if (text.match("\u4ECA\u671D")) { + components.imply("hour", 6); + components.assign("meridiem", index_1.Meridiem.AM); + } + components.assign("day", date.date()); + components.assign("month", date.month() + 1); + components.assign("year", date.year()); + return components; + } + }; + exports.default = JPCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/ja/index.js +var require_ja = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var JPStandardParser_1 = __importDefault2(require_JPStandardParser()); + var JPMergeDateRangeRefiner_1 = __importDefault2(require_JPMergeDateRangeRefiner()); + var JPCasualDateParser_1 = __importDefault2(require_JPCasualDateParser()); + var chrono_1 = require_chrono(); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration()); + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration() { + const option = createConfiguration(); + option.parsers.unshift(new JPCasualDateParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration() { + return { + parsers: [new JPStandardParser_1.default()], + refiners: [new JPMergeDateRangeRefiner_1.default()] + }; + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/pt/constants.js +var require_constants5 = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseYear = exports.YEAR_PATTERN = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + exports.WEEKDAY_DICTIONARY = { + "domingo": 0, + "dom": 0, + "segunda": 1, + "segunda-feira": 1, + "seg": 1, + "ter\xE7a": 2, + "ter\xE7a-feira": 2, + "ter": 2, + "quarta": 3, + "quarta-feira": 3, + "qua": 3, + "quinta": 4, + "quinta-feira": 4, + "qui": 4, + "sexta": 5, + "sexta-feira": 5, + "sex": 5, + "s\xE1bado": 6, + "sabado": 6, + "sab": 6 + }; + exports.MONTH_DICTIONARY = { + "janeiro": 1, + "jan": 1, + "jan.": 1, + "fevereiro": 2, + "fev": 2, + "fev.": 2, + "mar\xE7o": 3, + "mar": 3, + "mar.": 3, + "abril": 4, + "abr": 4, + "abr.": 4, + "maio": 5, + "mai": 5, + "mai.": 5, + "junho": 6, + "jun": 6, + "jun.": 6, + "julho": 7, + "jul": 7, + "jul.": 7, + "agosto": 8, + "ago": 8, + "ago.": 8, + "setembro": 9, + "set": 9, + "set.": 9, + "outubro": 10, + "out": 10, + "out.": 10, + "novembro": 11, + "nov": 11, + "nov.": 11, + "dezembro": 12, + "dez": 12, + "dez.": 12 + }; + exports.YEAR_PATTERN = "[0-9]{1,4}(?![^\\s]\\d)(?:\\s*[a|d]\\.?\\s*c\\.?|\\s*a\\.?\\s*d\\.?)?"; + function parseYear(match) { + if (match.match(/^[0-9]{1,4}$/)) { + let yearNumber = parseInt(match); + if (yearNumber < 100) { + if (yearNumber > 50) { + yearNumber = yearNumber + 1900; + } else { + yearNumber = yearNumber + 2e3; + } + } + return yearNumber; + } + if (match.match(/a\.?\s*c\.?/i)) { + match = match.replace(/a\.?\s*c\.?/i, ""); + return -parseInt(match); + } + return parseInt(match); + } + exports.parseYear = parseYear; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js +var require_PTWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants5(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weekdays_1 = require_weekdays(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(este|esta|passado|pr[o\xF3]ximo)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(este|esta|passado|pr[\xF3o]ximo)\\s*semana)?(?=\\W|\\d|$)`, "i"); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var PTWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const weekday = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + if (weekday === void 0) { + return null; + } + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let norm = prefix || postfix || ""; + norm = norm.toLowerCase(); + let modifier = null; + if (norm == "passado") { + modifier = "this"; + } else if (norm == "pr\xF3ximo" || norm == "proximo") { + modifier = "next"; + } else if (norm == "este") { + modifier = "this"; + } + return weekdays_1.createParsingComponentsAtWeekday(context2.reference, weekday, modifier); + } + }; + exports.default = PTWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js +var require_PTTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var PTTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:ao?|\xE0s?|das|da|de|do)\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|a(?:o)?|\\?)\\s*"; + } + }; + exports.default = PTTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js +var require_PTMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var PTMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(?:,|\xE0)?\\s*$"); + } + }; + exports.default = PTMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js +var require_PTMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var PTMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(?:-)\s*$/i; + } + }; + exports.default = PTMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js +var require_PTMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants5(); + var constants_2 = require_constants5(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`([0-9]{1,2})(?:\xBA|\xAA|\xB0)?(?:\\s*(?:desde|de|\\-|\\\u2013|ao?|\\s)\\s*([0-9]{1,2})(?:\xBA|\xAA|\xB0)?)?\\s*(?:de)?\\s*(?:-|/|\\s*(?:de|,)?\\s*)(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:\\s*(?:de|,)?\\s*(${constants_2.YEAR_PATTERN}))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var PTMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = parseInt(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = parseInt(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = PTMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js +var require_PTCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var PTCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return /(agora|hoje|amanha|amanhã|ontem)(?=\W|$)/i; + } + innerExtract(context2, match) { + const lowerText = match[0].toLowerCase(); + const component = context2.createParsingComponents(); + switch (lowerText) { + case "agora": + return references.now(context2.reference); + case "hoje": + return references.today(context2.reference); + case "amanha": + case "amanh\xE3": + return references.tomorrow(context2.reference); + case "ontem": + return references.yesterday(context2.reference); + } + return component; + } + }; + exports.default = PTCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js +var require_PTCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_1 = require_dayjs(); + var dayjs_2 = __importDefault2(require_dayjs_min()); + var PTCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return /(?:esta\s*)?(manha|manhã|tarde|meia-noite|meio-dia|noite)(?=\W|$)/i; + } + innerExtract(context2, match) { + const targetDate = dayjs_2.default(context2.refDate); + const component = context2.createParsingComponents(); + switch (match[1].toLowerCase()) { + case "tarde": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "noite": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 22); + break; + case "manha": + case "manh\xE3": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "meia-noite": + dayjs_1.assignTheNextDay(component, targetDate); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + break; + case "meio-dia": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + } + return component; + } + }; + exports.default = PTCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/index.js +var require_pt = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var PTWeekdayParser_1 = __importDefault2(require_PTWeekdayParser()); + var PTTimeExpressionParser_1 = __importDefault2(require_PTTimeExpressionParser()); + var PTMergeDateTimeRefiner_1 = __importDefault2(require_PTMergeDateTimeRefiner()); + var PTMergeDateRangeRefiner_1 = __importDefault2(require_PTMergeDateRangeRefiner()); + var PTMonthNameLittleEndianParser_1 = __importDefault2(require_PTMonthNameLittleEndianParser()); + var PTCasualDateParser_1 = __importDefault2(require_PTCasualDateParser()); + var PTCasualTimeParser_1 = __importDefault2(require_PTCasualTimeParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.push(new PTCasualDateParser_1.default()); + option.parsers.push(new PTCasualTimeParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new PTWeekdayParser_1.default(), + new PTTimeExpressionParser_1.default(), + new PTMonthNameLittleEndianParser_1.default() + ], + refiners: [new PTMergeDateTimeRefiner_1.default(), new PTMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js +var require_NLMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var NLMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(tot|-)\s*$/i; + } + }; + exports.default = NLMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js +var require_NLMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var NLMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$"); + } + }; + exports.default = NLMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js +var require_NLCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var NLCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i; + } + innerExtract(context2, match) { + const lowerText = match[0].toLowerCase(); + const component = context2.createParsingComponents(); + switch (lowerText) { + case "nu": + return references.now(context2.reference); + case "vandaag": + return references.today(context2.reference); + case "morgen": + case "morgend": + return references.tomorrow(context2.reference); + case "gisteren": + return references.yesterday(context2.reference); + } + return component; + } + }; + exports.default = NLCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js +var require_NLCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var DAY_GROUP = 1; + var MOMENT_GROUP = 2; + var NLCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; + } + innerExtract(context2, match) { + const targetDate = dayjs_1.default(context2.refDate); + const component = context2.createParsingComponents(); + if (match[DAY_GROUP] === "deze") { + component.assign("day", context2.refDate.getDate()); + component.assign("month", context2.refDate.getMonth() + 1); + component.assign("year", context2.refDate.getFullYear()); + } + switch (match[MOMENT_GROUP].toLowerCase()) { + case "namiddag": + case "'s namiddags": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "avond": + case "'s avonds'": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 20); + break; + case "middernacht": + dayjs_2.assignTheNextDay(component, targetDate); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + break; + case "ochtend": + case "'s ochtends": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "middag": + case "'s middags": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + } + return component; + } + }; + exports.default = NLCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/constants.js +var require_constants6 = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.WEEKDAY_DICTIONARY = { + zondag: 0, + zon: 0, + "zon.": 0, + zo: 0, + "zo.": 0, + maandag: 1, + ma: 1, + "ma.": 1, + dinsdag: 2, + din: 2, + "din.": 2, + di: 2, + "di.": 2, + woensdag: 3, + woe: 3, + "woe.": 3, + wo: 3, + "wo.": 3, + donderdag: 4, + dond: 4, + "dond.": 4, + do: 4, + "do.": 4, + vrijdag: 5, + vrij: 5, + "vrij.": 5, + vr: 5, + "vr.": 5, + zaterdag: 6, + zat: 6, + "zat.": 6, + "za": 6, + "za.": 6 + }; + exports.MONTH_DICTIONARY = { + januari: 1, + jan: 1, + "jan.": 1, + februari: 2, + feb: 2, + "feb.": 2, + maart: 3, + mar: 3, + "mar.": 3, + april: 4, + apr: 4, + "apr.": 4, + mei: 5, + juni: 6, + jun: 6, + "jun.": 6, + juli: 7, + jul: 7, + "jul.": 7, + augustus: 8, + aug: 8, + "aug.": 8, + september: 9, + sep: 9, + "sep.": 9, + sept: 9, + "sept.": 9, + oktober: 10, + okt: 10, + "okt.": 10, + november: 11, + nov: 11, + "nov.": 11, + december: 12, + dec: 12, + "dec.": 12 + }; + exports.INTEGER_WORD_DICTIONARY = { + een: 1, + twee: 2, + drie: 3, + vier: 4, + vijf: 5, + zes: 6, + zeven: 7, + acht: 8, + negen: 9, + tien: 10, + elf: 11, + twaalf: 12 + }; + exports.ORDINAL_WORD_DICTIONARY = { + eerste: 1, + tweede: 2, + derde: 3, + vierde: 4, + vijfde: 5, + zesde: 6, + zevende: 7, + achtste: 8, + negende: 9, + tiende: 10, + elfde: 11, + twaalfde: 12, + dertiende: 13, + veertiende: 14, + vijftiende: 15, + zestiende: 16, + zeventiende: 17, + achttiende: 18, + negentiende: 19, + twintigste: 20, + "eenentwintigste": 21, + "twee\xEBntwintigste": 22, + "drieentwintigste": 23, + "vierentwintigste": 24, + "vijfentwintigste": 25, + "zesentwintigste": 26, + "zevenentwintigste": 27, + "achtentwintig": 28, + "negenentwintig": 29, + "dertigste": 30, + "eenendertigste": 31 + }; + exports.TIME_UNIT_DICTIONARY = { + sec: "second", + second: "second", + seconden: "second", + min: "minute", + mins: "minute", + minute: "minute", + minuut: "minute", + minuten: "minute", + minuutje: "minute", + h: "hour", + hr: "hour", + hrs: "hour", + uur: "hour", + u: "hour", + uren: "hour", + dag: "d", + dagen: "d", + week: "week", + weken: "week", + maand: "month", + maanden: "month", + jaar: "year", + jr: "year", + jaren: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+[\\.,][0-9]+|halve?|half|paar)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "paar") { + return 2; + } else if (num === "half" || num.match(/halve?/)) { + return 0.5; + } + return parseFloat(num.replace(",", ".")); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:ste|de)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { + return exports.ORDINAL_WORD_DICTIONARY[num]; + } + num = num.replace(/(?:ste|de)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:voor Christus|na Christus)|[1-2][0-9]{3}|[5-9][0-9])`; + function parseYear(match) { + if (/voor Christus/i.test(match)) { + match = match.replace(/voor Christus/i, ""); + return -parseInt(match); + } + if (/na Christus/i.test(match)) { + match = match.replace(/na Christus/i, ""); + return parseInt(match); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:binnen|in)\\s*)?`, SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js +var require_NLTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var NLTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp(`(?:binnen|in|binnen de|voor)\\s*(` + constants_1.TIME_UNITS_PATTERN + `)(?=\\W|$)`, "i"); + } + innerExtract(context2, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + }; + exports.default = NLTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js +var require_NLWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weekdays_1 = require_weekdays(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:op\\s*?)?(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?=\\W|$)`, "i"); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var NLWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const weekday = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord == "vorige") { + modifier = "last"; + } else if (modifierWord == "volgende") { + modifier = "next"; + } else if (modifierWord == "deze") { + modifier = "this"; + } + return weekdays_1.createParsingComponentsAtWeekday(context2.reference, weekday, modifier); + } + }; + exports.default = NLWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js +var require_NLMonthNameMiddleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants6(); + var constants_2 = require_constants6(); + var constants_3 = require_constants6(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:on\\s*?)?(${constants_2.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:tot|\\-|\\\u2013|until|through|till|\\s)\\s*(${constants_2.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:of)?\\s*)(` + pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY) + `)(?:(?:-|/|,?\\s*)(${constants_3.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var MONTH_NAME_GROUP = 3; + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var YEAR_GROUP = 4; + var NLMonthNameMiddleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + const components = context2.createParsingComponents({ + day, + month + }); + if (match[YEAR_GROUP]) { + const year = constants_3.parseYear(match[YEAR_GROUP]); + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, day, month); + components.imply("year", year); + } + if (!match[DATE_TO_GROUP]) { + return components; + } + const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + const result = context2.createParsingResult(match.index, match[0]); + result.start = components; + result.end = components.clone(); + result.end.assign("day", endDate); + return result; + } + }; + exports.default = NLMonthNameMiddleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js +var require_NLMonthNameParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var years_1 = require_years(); + var pattern_1 = require_pattern(); + var constants_2 = require_constants6(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, "i"); + var MONTH_NAME_GROUP = 1; + var YEAR_GROUP = 2; + var NLMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const components = context2.createParsingComponents(); + components.imply("day", 1); + const monthName = match[MONTH_NAME_GROUP]; + const month = constants_1.MONTH_DICTIONARY[monthName.toLowerCase()]; + components.assign("month", month); + if (match[YEAR_GROUP]) { + const year = constants_2.parseYear(match[YEAR_GROUP]); + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, 1, month); + components.imply("year", year); + } + return components; + } + }; + exports.default = NLMonthNameParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js +var require_NLSlashMonthFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})", "i"); + var MONTH_GROUP = 1; + var YEAR_GROUP = 2; + var NLSlashMonthFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const year = parseInt(match[YEAR_GROUP]); + const month = parseInt(match[MONTH_GROUP]); + return context2.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); + } + }; + exports.default = NLSlashMonthFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js +var require_NLTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var NLTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:om)\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|om|\\?)\\s*"; + } + primarySuffix() { + return "(?:\\s*(?:uur))?(?!/)(?=\\W|$)"; + } + extractPrimaryTimeComponents(context2, match) { + if (match[0].match(/^\s*\d{4}\s*$/)) { + return null; + } + return super.extractPrimaryTimeComponents(context2, match); + } + }; + exports.default = NLTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js +var require_NLCasualYearMonthDayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`, "i"); + var YEAR_NUMBER_GROUP = 1; + var MONTH_NAME_GROUP = 2; + var MONTH_NUMBER_GROUP = 3; + var DATE_NUMBER_GROUP = 4; + var NLCasualYearMonthDayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + if (month < 1 || month > 12) { + return null; + } + const year = parseInt(match[YEAR_NUMBER_GROUP]); + const day = parseInt(match[DATE_NUMBER_GROUP]); + return { + day, + month, + year + }; + } + }; + exports.default = NLCasualYearMonthDayParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js +var require_NLCasualDateTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var index_1 = require_dist(); + var dayjs_1 = require_dayjs(); + var dayjs_2 = __importDefault2(require_dayjs_min()); + var DATE_GROUP = 1; + var TIME_OF_DAY_GROUP = 2; + var NLCasualDateTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return /(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i; + } + innerExtract(context2, match) { + const dateText = match[DATE_GROUP].toLowerCase(); + const timeText = match[TIME_OF_DAY_GROUP].toLowerCase(); + const component = context2.createParsingComponents(); + const targetDate = dayjs_2.default(context2.refDate); + switch (dateText) { + case "gisteren": + dayjs_1.assignSimilarDate(component, targetDate.add(-1, "day")); + break; + case "van": + dayjs_1.assignSimilarDate(component, targetDate); + break; + case "morgen": + dayjs_1.assignTheNextDay(component, targetDate); + break; + } + switch (timeText) { + case "ochtend": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "middag": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + case "namiddag": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "avond": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 20); + break; + } + return component; + } + }; + exports.default = NLCasualDateTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js +var require_NLTimeUnitCasualRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(deze|vorige|afgelopen|komende|over|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var NLTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const prefix = match[1].toLowerCase(); + let timeUnits = constants_1.parseTimeUnits(match[2]); + switch (prefix) { + case "vorige": + case "afgelopen": + case "-": + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + break; + } + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + }; + exports.default = NLTimeUnitCasualRelativeFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLRelativeDateFormatParser.js +var require_NLRelativeDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLRelativeDateFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var pattern_1 = require_pattern(); + var PATTERN = new RegExp(`(dit|deze|komende|volgend|volgende|afgelopen|vorige)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`, "i"); + var MODIFIER_WORD_GROUP = 1; + var RELATIVE_WORD_GROUP = 2; + var NLRelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); + const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); + const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; + if (modifier == "volgend" || modifier == "volgende" || modifier == "komende") { + const timeUnits = {}; + timeUnits[timeunit] = 1; + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + if (modifier == "afgelopen" || modifier == "vorige") { + const timeUnits = {}; + timeUnits[timeunit] = -1; + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + const components = context2.createParsingComponents(); + let date = dayjs_1.default(context2.reference.instant); + if (unitWord.match(/week/i)) { + date = date.add(-date.get("d"), "d"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.imply("year", date.year()); + } else if (unitWord.match(/maand/i)) { + date = date.add(-date.date() + 1, "d"); + components.imply("day", date.date()); + components.assign("year", date.year()); + components.assign("month", date.month() + 1); + } else if (unitWord.match(/jaar/i)) { + date = date.add(-date.date() + 1, "d"); + date = date.add(-date.month(), "month"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.assign("year", date.year()); + } + return components; + } + }; + exports.default = NLRelativeDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.js +var require_NLTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(?:geleden|voor|eerder)(?=(?:\\W|$))", "i"); + var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")geleden(?=(?:\\W|$))", "i"); + var NLTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context2, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, outputTimeUnits); + } + }; + exports.default = NLTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.js +var require_NLTimeUnitLaterFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|na|vanaf nu|voortaan|vooruit|uit)(?=(?:\\W|$))", "i"); + var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|vanaf nu)(?=(?:\\W|$))", "i"); + var GROUP_NUM_TIMEUNITS = 1; + var NLTimeUnitLaterFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context2, match) { + const fragments = constants_1.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, fragments); + } + }; + exports.default = NLTimeUnitLaterFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/index.js +var require_nl = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var NLMergeDateRangeRefiner_1 = __importDefault2(require_NLMergeDateRangeRefiner()); + var NLMergeDateTimeRefiner_1 = __importDefault2(require_NLMergeDateTimeRefiner()); + var NLCasualDateParser_1 = __importDefault2(require_NLCasualDateParser()); + var NLCasualTimeParser_1 = __importDefault2(require_NLCasualTimeParser()); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var NLTimeUnitWithinFormatParser_1 = __importDefault2(require_NLTimeUnitWithinFormatParser()); + var NLWeekdayParser_1 = __importDefault2(require_NLWeekdayParser()); + var NLMonthNameMiddleEndianParser_1 = __importDefault2(require_NLMonthNameMiddleEndianParser()); + var NLMonthNameParser_1 = __importDefault2(require_NLMonthNameParser()); + var NLSlashMonthFormatParser_1 = __importDefault2(require_NLSlashMonthFormatParser()); + var NLTimeExpressionParser_1 = __importDefault2(require_NLTimeExpressionParser()); + var NLCasualYearMonthDayParser_1 = __importDefault2(require_NLCasualYearMonthDayParser()); + var NLCasualDateTimeParser_1 = __importDefault2(require_NLCasualDateTimeParser()); + var NLTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_NLTimeUnitCasualRelativeFormatParser()); + var NLRelativeDateFormatParser_1 = __importDefault2(require_NLRelativeDateFormatParser()); + var NLTimeUnitAgoFormatParser_1 = __importDefault2(require_NLTimeUnitAgoFormatParser()); + var NLTimeUnitLaterFormatParser_1 = __importDefault2(require_NLTimeUnitLaterFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new NLCasualDateParser_1.default()); + option.parsers.unshift(new NLCasualTimeParser_1.default()); + option.parsers.unshift(new NLCasualDateTimeParser_1.default()); + option.parsers.unshift(new NLMonthNameParser_1.default()); + option.parsers.unshift(new NLRelativeDateFormatParser_1.default()); + option.parsers.unshift(new NLTimeUnitCasualRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new NLTimeUnitWithinFormatParser_1.default(), + new NLMonthNameMiddleEndianParser_1.default(), + new NLMonthNameParser_1.default(), + new NLWeekdayParser_1.default(), + new NLCasualYearMonthDayParser_1.default(), + new NLSlashMonthFormatParser_1.default(), + new NLTimeExpressionParser_1.default(strictMode), + new NLTimeUnitAgoFormatParser_1.default(strictMode), + new NLTimeUnitLaterFormatParser_1.default(strictMode) + ], + refiners: [new NLMergeDateTimeRefiner_1.default(), new NLMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantCasualDateParser.js +var require_ZHHantCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantCasualDateParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var NOW_GROUP = 1; + var DAY_GROUP_1 = 2; + var TIME_GROUP_1 = 3; + var TIME_GROUP_2 = 4; + var DAY_GROUP_3 = 5; + var TIME_GROUP_3 = 6; + var ZHHantCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return new RegExp("(\u800C\u5BB6|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?", "i"); + } + innerExtract(context2, match) { + const index = match.index; + const result = context2.createParsingResult(index, match[0]); + const refMoment = dayjs_1.default(context2.refDate); + let startMoment = refMoment; + if (match[NOW_GROUP]) { + result.start.imply("hour", refMoment.hour()); + result.start.imply("minute", refMoment.minute()); + result.start.imply("second", refMoment.second()); + result.start.imply("millisecond", refMoment.millisecond()); + } else if (match[DAY_GROUP_1]) { + const day1 = match[DAY_GROUP_1]; + const time1 = match[TIME_GROUP_1]; + if (day1 == "\u660E" || day1 == "\u807D") { + if (refMoment.hour() > 1) { + startMoment = startMoment.add(1, "day"); + } + } else if (day1 == "\u6628" || day1 == "\u5C0B" || day1 == "\u7434") { + startMoment = startMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + startMoment = startMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + startMoment = startMoment.add(-3, "day"); + } else if (day1 == "\u5F8C") { + startMoment = startMoment.add(2, "day"); + } else if (day1 == "\u5927\u5F8C") { + startMoment = startMoment.add(3, "day"); + } + if (time1 == "\u65E9" || time1 == "\u671D") { + result.start.imply("hour", 6); + } else if (time1 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } + } else if (match[TIME_GROUP_2]) { + const timeString2 = match[TIME_GROUP_2]; + const time2 = timeString2[0]; + if (time2 == "\u65E9" || time2 == "\u671D" || time2 == "\u4E0A") { + result.start.imply("hour", 6); + } else if (time2 == "\u4E0B" || time2 == "\u664F") { + result.start.imply("hour", 15); + result.start.imply("meridiem", 1); + } else if (time2 == "\u4E2D") { + result.start.imply("hour", 12); + result.start.imply("meridiem", 1); + } else if (time2 == "\u591C" || time2 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } else if (time2 == "\u51CC") { + result.start.imply("hour", 0); + } + } else if (match[DAY_GROUP_3]) { + const day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E" || day3 == "\u807D") { + if (refMoment.hour() > 1) { + startMoment = startMoment.add(1, "day"); + } + } else if (day3 == "\u6628" || day3 == "\u5C0B" || day3 == "\u7434") { + startMoment = startMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + startMoment = startMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + startMoment = startMoment.add(-3, "day"); + } else if (day3 == "\u5F8C") { + startMoment = startMoment.add(2, "day"); + } else if (day3 == "\u5927\u5F8C") { + startMoment = startMoment.add(3, "day"); + } + const timeString3 = match[TIME_GROUP_3]; + if (timeString3) { + const time3 = timeString3[0]; + if (time3 == "\u65E9" || time3 == "\u671D" || time3 == "\u4E0A") { + result.start.imply("hour", 6); + } else if (time3 == "\u4E0B" || time3 == "\u664F") { + result.start.imply("hour", 15); + result.start.imply("meridiem", 1); + } else if (time3 == "\u4E2D") { + result.start.imply("hour", 12); + result.start.imply("meridiem", 1); + } else if (time3 == "\u591C" || time3 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } else if (time3 == "\u51CC") { + result.start.imply("hour", 0); + } + } + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + return result; + } + }; + exports.default = ZHHantCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/constants.js +var require_constants7 = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.zhStringToYear = exports.zhStringToNumber = exports.WEEKDAY_OFFSET = exports.NUMBER = void 0; + exports.NUMBER = { + "\u96F6": 0, + "\u4E00": 1, + "\u4E8C": 2, + "\u5169": 2, + "\u4E09": 3, + "\u56DB": 4, + "\u4E94": 5, + "\u516D": 6, + "\u4E03": 7, + "\u516B": 8, + "\u4E5D": 9, + "\u5341": 10, + "\u5EFF": 20, + "\u5345": 30 + }; + exports.WEEKDAY_OFFSET = { + "\u5929": 0, + "\u65E5": 0, + "\u4E00": 1, + "\u4E8C": 2, + "\u4E09": 3, + "\u56DB": 4, + "\u4E94": 5, + "\u516D": 6 + }; + function zhStringToNumber(text) { + let number = 0; + for (let i4 = 0; i4 < text.length; i4++) { + const char = text[i4]; + if (char === "\u5341") { + number = number === 0 ? exports.NUMBER[char] : number * exports.NUMBER[char]; + } else { + number += exports.NUMBER[char]; + } + } + return number; + } + exports.zhStringToNumber = zhStringToNumber; + function zhStringToYear(text) { + let string2 = ""; + for (let i4 = 0; i4 < text.length; i4++) { + const char = text[i4]; + string2 = string2 + exports.NUMBER[char]; + } + return parseInt(string2); + } + exports.zhStringToYear = zhStringToYear; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDateParser.js +var require_ZHHantDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDateParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var YEAR_GROUP = 1; + var MONTH_GROUP = 2; + var DAY_GROUP = 3; + var ZHHantDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp("(\\d{2,4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,2})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,2})?(?:\\s*)(?:\u65E5|\u865F)?"); + } + innerExtract(context2, match) { + const startMoment = dayjs_1.default(context2.refDate); + const result = context2.createParsingResult(match.index, match[0]); + let month = parseInt(match[MONTH_GROUP]); + if (isNaN(month)) + month = constants_1.zhStringToNumber(match[MONTH_GROUP]); + result.start.assign("month", month); + if (match[DAY_GROUP]) { + let day = parseInt(match[DAY_GROUP]); + if (isNaN(day)) + day = constants_1.zhStringToNumber(match[DAY_GROUP]); + result.start.assign("day", day); + } else { + result.start.imply("day", startMoment.date()); + } + if (match[YEAR_GROUP]) { + let year = parseInt(match[YEAR_GROUP]); + if (isNaN(year)) + year = constants_1.zhStringToYear(match[YEAR_GROUP]); + result.start.assign("year", year); + } else { + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHantDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.js +var require_ZHHantDeadlineFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var PATTERN = new RegExp("(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+|\u534A|\u5E7E)(?:\\s*)(?:\u500B)?(\u79D2(?:\u9418)?|\u5206\u9418|\u5C0F\u6642|\u9418|\u65E5|\u5929|\u661F\u671F|\u79AE\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u904E)?\u5F8C|(?:\u4E4B)?\u5167)", "i"); + var NUMBER_GROUP = 1; + var UNIT_GROUP = 2; + var ZHHantDeadlineFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + let number = parseInt(match[NUMBER_GROUP]); + if (isNaN(number)) { + number = constants_1.zhStringToNumber(match[NUMBER_GROUP]); + } + if (isNaN(number)) { + const string2 = match[NUMBER_GROUP]; + if (string2 === "\u5E7E") { + number = 3; + } else if (string2 === "\u534A") { + number = 0.5; + } else { + return null; + } + } + let date = dayjs_1.default(context2.refDate); + const unit = match[UNIT_GROUP]; + const unitAbbr = unit[0]; + if (unitAbbr.match(/[日天星禮月年]/)) { + if (unitAbbr == "\u65E5" || unitAbbr == "\u5929") { + date = date.add(number, "d"); + } else if (unitAbbr == "\u661F" || unitAbbr == "\u79AE") { + date = date.add(number * 7, "d"); + } else if (unitAbbr == "\u6708") { + date = date.add(number, "month"); + } else if (unitAbbr == "\u5E74") { + date = date.add(number, "year"); + } + result.start.assign("year", date.year()); + result.start.assign("month", date.month() + 1); + result.start.assign("day", date.date()); + return result; + } + if (unitAbbr == "\u79D2") { + date = date.add(number, "second"); + } else if (unitAbbr == "\u5206") { + date = date.add(number, "minute"); + } else if (unitAbbr == "\u5C0F" || unitAbbr == "\u9418") { + date = date.add(number, "hour"); + } + result.start.imply("year", date.year()); + result.start.imply("month", date.month() + 1); + result.start.imply("day", date.date()); + result.start.assign("hour", date.hour()); + result.start.assign("minute", date.minute()); + result.start.assign("second", date.second()); + return result; + } + }; + exports.default = ZHHantDeadlineFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantRelationWeekdayParser.js +var require_ZHHantRelationWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantRelationWeekdayParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var PATTERN = new RegExp("(?\u4E0A|\u4ECA|\u4E0B|\u9019|\u5462)(?:\u500B)?(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); + var ZHHantRelationWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + const dayOfWeek = match.groups.weekday; + const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; + if (offset === void 0) + return null; + let modifier = null; + const prefix = match.groups.prefix; + if (prefix == "\u4E0A") { + modifier = "last"; + } else if (prefix == "\u4E0B") { + modifier = "next"; + } else if (prefix == "\u4ECA" || prefix == "\u9019" || prefix == "\u5462") { + modifier = "this"; + } + let startMoment = dayjs_1.default(context2.refDate); + let startMomentFixed = false; + const refOffset = startMoment.day(); + if (modifier == "last" || modifier == "past") { + startMoment = startMoment.day(offset - 7); + startMomentFixed = true; + } else if (modifier == "next") { + startMoment = startMoment.day(offset + 7); + startMomentFixed = true; + } else if (modifier == "this") { + startMoment = startMoment.day(offset); + } else { + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset + 7); + } else { + startMoment = startMoment.day(offset); + } + } + result.start.assign("weekday", offset); + if (startMomentFixed) { + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHantRelationWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js +var require_ZHHantTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var FIRST_REG_PATTERN = new RegExp("(?:\u7531|\u5F9E|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); + var SECOND_REG_PATTERN = new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); + var DAY_GROUP_1 = 1; + var ZH_AM_PM_HOUR_GROUP_1 = 2; + var ZH_AM_PM_HOUR_GROUP_2 = 3; + var DAY_GROUP_3 = 4; + var ZH_AM_PM_HOUR_GROUP_3 = 5; + var HOUR_GROUP = 6; + var MINUTE_GROUP = 7; + var SECOND_GROUP = 8; + var AM_PM_HOUR_GROUP = 9; + var ZHHantTimeExpressionParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return FIRST_REG_PATTERN; + } + innerExtract(context2, match) { + if (match.index > 0 && context2.text[match.index - 1].match(/\w/)) { + return null; + } + const refMoment = dayjs_1.default(context2.refDate); + const result = context2.createParsingResult(match.index, match[0]); + const startMoment = refMoment.clone(); + if (match[DAY_GROUP_1]) { + var day1 = match[DAY_GROUP_1]; + if (day1 == "\u660E" || day1 == "\u807D") { + if (refMoment.hour() > 1) { + startMoment.add(1, "day"); + } + } else if (day1 == "\u6628" || day1 == "\u5C0B" || day1 == "\u7434") { + startMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + startMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + startMoment.add(-3, "day"); + } else if (day1 == "\u5F8C") { + startMoment.add(2, "day"); + } else if (day1 == "\u5927\u5F8C") { + startMoment.add(3, "day"); + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else if (match[DAY_GROUP_3]) { + var day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E" || day3 == "\u807D") { + startMoment.add(1, "day"); + } else if (day3 == "\u6628" || day3 == "\u5C0B" || day3 == "\u7434") { + startMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + startMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + startMoment.add(-3, "day"); + } else if (day3 == "\u5F8C") { + startMoment.add(2, "day"); + } else if (day3 == "\u5927\u5F8C") { + startMoment.add(3, "day"); + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + let hour = 0; + let minute = 0; + let meridiem = -1; + if (match[SECOND_GROUP]) { + var second = parseInt(match[SECOND_GROUP]); + if (isNaN(second)) { + second = constants_1.zhStringToNumber(match[SECOND_GROUP]); + } + if (second >= 60) + return null; + result.start.assign("second", second); + } + hour = parseInt(match[HOUR_GROUP]); + if (isNaN(hour)) { + hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); + } + if (match[MINUTE_GROUP]) { + if (match[MINUTE_GROUP] == "\u534A") { + minute = 30; + } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { + minute = 0; + } else { + minute = parseInt(match[MINUTE_GROUP]); + if (isNaN(minute)) { + minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); + } + } + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60) { + return null; + } + if (hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = 1; + } + if (match[AM_PM_HOUR_GROUP]) { + if (hour > 12) + return null; + var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = 0; + if (hour == 12) + hour = 0; + } + if (ampm == "p") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { + var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; + var zhAMPM1 = zhAMPMString1[0]; + if (zhAMPM1 == "\u671D" || zhAMPM1 == "\u65E9") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM1 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { + var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; + var zhAMPM2 = zhAMPMString2[0]; + if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u671D" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u664F" || zhAMPM2 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { + var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; + var zhAMPM3 = zhAMPMString3[0]; + if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u671D" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u664F" || zhAMPM3 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } + result.start.assign("hour", hour); + result.start.assign("minute", minute); + if (meridiem >= 0) { + result.start.assign("meridiem", meridiem); + } else { + if (hour < 12) { + result.start.imply("meridiem", 0); + } else { + result.start.imply("meridiem", 1); + } + } + match = SECOND_REG_PATTERN.exec(context2.text.substring(result.index + result.text.length)); + if (!match) { + if (result.text.match(/^\d+$/)) { + return null; + } + return result; + } + const endMoment = startMoment.clone(); + result.end = context2.createParsingComponents(); + if (match[DAY_GROUP_1]) { + var day1 = match[DAY_GROUP_1]; + if (day1 == "\u660E" || day1 == "\u807D") { + if (refMoment.hour() > 1) { + endMoment.add(1, "day"); + } + } else if (day1 == "\u6628" || day1 == "\u5C0B" || day1 == "\u7434") { + endMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + endMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + endMoment.add(-3, "day"); + } else if (day1 == "\u5F8C") { + endMoment.add(2, "day"); + } else if (day1 == "\u5927\u5F8C") { + endMoment.add(3, "day"); + } + result.end.assign("day", endMoment.date()); + result.end.assign("month", endMoment.month() + 1); + result.end.assign("year", endMoment.year()); + } else if (match[DAY_GROUP_3]) { + var day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E" || day3 == "\u807D") { + endMoment.add(1, "day"); + } else if (day3 == "\u6628" || day3 == "\u5C0B" || day3 == "\u7434") { + endMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + endMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + endMoment.add(-3, "day"); + } else if (day3 == "\u5F8C") { + endMoment.add(2, "day"); + } else if (day3 == "\u5927\u5F8C") { + endMoment.add(3, "day"); + } + result.end.assign("day", endMoment.date()); + result.end.assign("month", endMoment.month() + 1); + result.end.assign("year", endMoment.year()); + } else { + result.end.imply("day", endMoment.date()); + result.end.imply("month", endMoment.month() + 1); + result.end.imply("year", endMoment.year()); + } + hour = 0; + minute = 0; + meridiem = -1; + if (match[SECOND_GROUP]) { + var second = parseInt(match[SECOND_GROUP]); + if (isNaN(second)) { + second = constants_1.zhStringToNumber(match[SECOND_GROUP]); + } + if (second >= 60) + return null; + result.end.assign("second", second); + } + hour = parseInt(match[HOUR_GROUP]); + if (isNaN(hour)) { + hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); + } + if (match[MINUTE_GROUP]) { + if (match[MINUTE_GROUP] == "\u534A") { + minute = 30; + } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { + minute = 0; + } else { + minute = parseInt(match[MINUTE_GROUP]); + if (isNaN(minute)) { + minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); + } + } + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60) { + return null; + } + if (hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = 1; + } + if (match[AM_PM_HOUR_GROUP]) { + if (hour > 12) + return null; + var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = 0; + if (hour == 12) + hour = 0; + } + if (ampm == "p") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + if (!result.start.isCertain("meridiem")) { + if (meridiem == 0) { + result.start.imply("meridiem", 0); + if (result.start.get("hour") == 12) { + result.start.assign("hour", 0); + } + } else { + result.start.imply("meridiem", 1); + if (result.start.get("hour") != 12) { + result.start.assign("hour", result.start.get("hour") + 12); + } + } + } + } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { + var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; + var zhAMPM1 = zhAMPMString1[0]; + if (zhAMPM1 == "\u671D" || zhAMPM1 == "\u65E9") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM1 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { + var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; + var zhAMPM2 = zhAMPMString2[0]; + if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u671D" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u664F" || zhAMPM2 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { + var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; + var zhAMPM3 = zhAMPMString3[0]; + if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u671D" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u664F" || zhAMPM3 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } + result.text = result.text + match[0]; + result.end.assign("hour", hour); + result.end.assign("minute", minute); + if (meridiem >= 0) { + result.end.assign("meridiem", meridiem); + } else { + const startAtPM = result.start.isCertain("meridiem") && result.start.get("meridiem") == 1; + if (startAtPM && result.start.get("hour") > hour) { + result.end.imply("meridiem", 0); + } else if (hour > 12) { + result.end.imply("meridiem", 1); + } + } + if (result.end.date().getTime() < result.start.date().getTime()) { + result.end.imply("day", result.end.get("day") + 1); + } + return result; + } + }; + exports.default = ZHHantTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantWeekdayParser.js +var require_ZHHantWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantWeekdayParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var PATTERN = new RegExp("(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); + var ZHHantWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + const dayOfWeek = match.groups.weekday; + const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; + if (offset === void 0) + return null; + let startMoment = dayjs_1.default(context2.refDate); + const startMomentFixed = false; + const refOffset = startMoment.day(); + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset + 7); + } else { + startMoment = startMoment.day(offset); + } + result.start.assign("weekday", offset); + if (startMomentFixed) { + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHantWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateRangeRefiner.js +var require_ZHHantMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var ZHHantMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(至|到|\-|\~|~|-|ー)\s*$/i; + } + }; + exports.default = ZHHantMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateTimeRefiner.js +var require_ZHHantMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var ZHHantMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return /^\s*$/i; + } + }; + exports.default = ZHHantMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/index.js +var require_hant = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = exports.hant = void 0; + var chrono_1 = require_chrono(); + var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); + var configurations_1 = require_configurations(); + var ZHHantCasualDateParser_1 = __importDefault2(require_ZHHantCasualDateParser()); + var ZHHantDateParser_1 = __importDefault2(require_ZHHantDateParser()); + var ZHHantDeadlineFormatParser_1 = __importDefault2(require_ZHHantDeadlineFormatParser()); + var ZHHantRelationWeekdayParser_1 = __importDefault2(require_ZHHantRelationWeekdayParser()); + var ZHHantTimeExpressionParser_1 = __importDefault2(require_ZHHantTimeExpressionParser()); + var ZHHantWeekdayParser_1 = __importDefault2(require_ZHHantWeekdayParser()); + var ZHHantMergeDateRangeRefiner_1 = __importDefault2(require_ZHHantMergeDateRangeRefiner()); + var ZHHantMergeDateTimeRefiner_1 = __importDefault2(require_ZHHantMergeDateTimeRefiner()); + exports.hant = new chrono_1.Chrono(createCasualConfiguration()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration()); + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration() { + const option = createConfiguration(); + option.parsers.unshift(new ZHHantCasualDateParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration() { + const configuration = configurations_1.includeCommonConfiguration({ + parsers: [ + new ZHHantDateParser_1.default(), + new ZHHantRelationWeekdayParser_1.default(), + new ZHHantWeekdayParser_1.default(), + new ZHHantTimeExpressionParser_1.default(), + new ZHHantDeadlineFormatParser_1.default() + ], + refiners: [new ZHHantMergeDateRangeRefiner_1.default(), new ZHHantMergeDateTimeRefiner_1.default()] + }); + configuration.refiners = configuration.refiners.filter((refiner) => !(refiner instanceof ExtractTimezoneOffsetRefiner_1.default)); + return configuration; + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.js +var require_ZHHansCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var NOW_GROUP = 1; + var DAY_GROUP_1 = 2; + var TIME_GROUP_1 = 3; + var TIME_GROUP_2 = 4; + var DAY_GROUP_3 = 5; + var TIME_GROUP_3 = 6; + var ZHHansCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context2) { + return new RegExp("(\u73B0\u5728|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?", "i"); + } + innerExtract(context2, match) { + const index = match.index; + const result = context2.createParsingResult(index, match[0]); + const refMoment = dayjs_1.default(context2.refDate); + let startMoment = refMoment; + if (match[NOW_GROUP]) { + result.start.imply("hour", refMoment.hour()); + result.start.imply("minute", refMoment.minute()); + result.start.imply("second", refMoment.second()); + result.start.imply("millisecond", refMoment.millisecond()); + } else if (match[DAY_GROUP_1]) { + const day1 = match[DAY_GROUP_1]; + const time1 = match[TIME_GROUP_1]; + if (day1 == "\u660E") { + if (refMoment.hour() > 1) { + startMoment = startMoment.add(1, "day"); + } + } else if (day1 == "\u6628") { + startMoment = startMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + startMoment = startMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + startMoment = startMoment.add(-3, "day"); + } else if (day1 == "\u540E") { + startMoment = startMoment.add(2, "day"); + } else if (day1 == "\u5927\u540E") { + startMoment = startMoment.add(3, "day"); + } + if (time1 == "\u65E9") { + result.start.imply("hour", 6); + } else if (time1 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } + } else if (match[TIME_GROUP_2]) { + const timeString2 = match[TIME_GROUP_2]; + const time2 = timeString2[0]; + if (time2 == "\u65E9" || time2 == "\u4E0A") { + result.start.imply("hour", 6); + } else if (time2 == "\u4E0B") { + result.start.imply("hour", 15); + result.start.imply("meridiem", 1); + } else if (time2 == "\u4E2D") { + result.start.imply("hour", 12); + result.start.imply("meridiem", 1); + } else if (time2 == "\u591C" || time2 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } else if (time2 == "\u51CC") { + result.start.imply("hour", 0); + } + } else if (match[DAY_GROUP_3]) { + const day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E") { + if (refMoment.hour() > 1) { + startMoment = startMoment.add(1, "day"); + } + } else if (day3 == "\u6628") { + startMoment = startMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + startMoment = startMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + startMoment = startMoment.add(-3, "day"); + } else if (day3 == "\u540E") { + startMoment = startMoment.add(2, "day"); + } else if (day3 == "\u5927\u540E") { + startMoment = startMoment.add(3, "day"); + } + const timeString3 = match[TIME_GROUP_3]; + if (timeString3) { + const time3 = timeString3[0]; + if (time3 == "\u65E9" || time3 == "\u4E0A") { + result.start.imply("hour", 6); + } else if (time3 == "\u4E0B") { + result.start.imply("hour", 15); + result.start.imply("meridiem", 1); + } else if (time3 == "\u4E2D") { + result.start.imply("hour", 12); + result.start.imply("meridiem", 1); + } else if (time3 == "\u591C" || time3 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } else if (time3 == "\u51CC") { + result.start.imply("hour", 0); + } + } + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + return result; + } + }; + exports.default = ZHHansCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/constants.js +var require_constants8 = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.zhStringToYear = exports.zhStringToNumber = exports.WEEKDAY_OFFSET = exports.NUMBER = void 0; + exports.NUMBER = { + "\u96F6": 0, + "\u3007": 0, + "\u4E00": 1, + "\u4E8C": 2, + "\u4E24": 2, + "\u4E09": 3, + "\u56DB": 4, + "\u4E94": 5, + "\u516D": 6, + "\u4E03": 7, + "\u516B": 8, + "\u4E5D": 9, + "\u5341": 10 + }; + exports.WEEKDAY_OFFSET = { + "\u5929": 0, + "\u65E5": 0, + "\u4E00": 1, + "\u4E8C": 2, + "\u4E09": 3, + "\u56DB": 4, + "\u4E94": 5, + "\u516D": 6 + }; + function zhStringToNumber(text) { + let number = 0; + for (let i4 = 0; i4 < text.length; i4++) { + const char = text[i4]; + if (char === "\u5341") { + number = number === 0 ? exports.NUMBER[char] : number * exports.NUMBER[char]; + } else { + number += exports.NUMBER[char]; + } + } + return number; + } + exports.zhStringToNumber = zhStringToNumber; + function zhStringToYear(text) { + let string2 = ""; + for (let i4 = 0; i4 < text.length; i4++) { + const char = text[i4]; + string2 = string2 + exports.NUMBER[char]; + } + return parseInt(string2); + } + exports.zhStringToYear = zhStringToYear; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDateParser.js +var require_ZHHansDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDateParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var YEAR_GROUP = 1; + var MONTH_GROUP = 2; + var DAY_GROUP = 3; + var ZHHansDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp("(\\d{2,4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,3})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,3})?(?:\\s*)(?:\u65E5|\u53F7)?"); + } + innerExtract(context2, match) { + const startMoment = dayjs_1.default(context2.refDate); + const result = context2.createParsingResult(match.index, match[0]); + let month = parseInt(match[MONTH_GROUP]); + if (isNaN(month)) + month = constants_1.zhStringToNumber(match[MONTH_GROUP]); + result.start.assign("month", month); + if (match[DAY_GROUP]) { + let day = parseInt(match[DAY_GROUP]); + if (isNaN(day)) + day = constants_1.zhStringToNumber(match[DAY_GROUP]); + result.start.assign("day", day); + } else { + result.start.imply("day", startMoment.date()); + } + if (match[YEAR_GROUP]) { + let year = parseInt(match[YEAR_GROUP]); + if (isNaN(year)) + year = constants_1.zhStringToYear(match[YEAR_GROUP]); + result.start.assign("year", year); + } else { + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHansDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.js +var require_ZHHansDeadlineFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var PATTERN = new RegExp("(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+|\u534A|\u51E0)(?:\\s*)(?:\u4E2A)?(\u79D2(?:\u949F)?|\u5206\u949F|\u5C0F\u65F6|\u949F|\u65E5|\u5929|\u661F\u671F|\u793C\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u8FC7)?\u540E|(?:\u4E4B)?\u5185)", "i"); + var NUMBER_GROUP = 1; + var UNIT_GROUP = 2; + var ZHHansDeadlineFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + let number = parseInt(match[NUMBER_GROUP]); + if (isNaN(number)) { + number = constants_1.zhStringToNumber(match[NUMBER_GROUP]); + } + if (isNaN(number)) { + const string2 = match[NUMBER_GROUP]; + if (string2 === "\u51E0") { + number = 3; + } else if (string2 === "\u534A") { + number = 0.5; + } else { + return null; + } + } + let date = dayjs_1.default(context2.refDate); + const unit = match[UNIT_GROUP]; + const unitAbbr = unit[0]; + if (unitAbbr.match(/[日天星礼月年]/)) { + if (unitAbbr == "\u65E5" || unitAbbr == "\u5929") { + date = date.add(number, "d"); + } else if (unitAbbr == "\u661F" || unitAbbr == "\u793C") { + date = date.add(number * 7, "d"); + } else if (unitAbbr == "\u6708") { + date = date.add(number, "month"); + } else if (unitAbbr == "\u5E74") { + date = date.add(number, "year"); + } + result.start.assign("year", date.year()); + result.start.assign("month", date.month() + 1); + result.start.assign("day", date.date()); + return result; + } + if (unitAbbr == "\u79D2") { + date = date.add(number, "second"); + } else if (unitAbbr == "\u5206") { + date = date.add(number, "minute"); + } else if (unitAbbr == "\u5C0F" || unitAbbr == "\u949F") { + date = date.add(number, "hour"); + } + result.start.imply("year", date.year()); + result.start.imply("month", date.month() + 1); + result.start.imply("day", date.date()); + result.start.assign("hour", date.hour()); + result.start.assign("minute", date.minute()); + result.start.assign("second", date.second()); + return result; + } + }; + exports.default = ZHHansDeadlineFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.js +var require_ZHHansRelationWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var PATTERN = new RegExp("(?\u4E0A|\u4E0B|\u8FD9)(?:\u4E2A)?(?:\u661F\u671F|\u793C\u62DC|\u5468)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); + var ZHHansRelationWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + const dayOfWeek = match.groups.weekday; + const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; + if (offset === void 0) + return null; + let modifier = null; + const prefix = match.groups.prefix; + if (prefix == "\u4E0A") { + modifier = "last"; + } else if (prefix == "\u4E0B") { + modifier = "next"; + } else if (prefix == "\u8FD9") { + modifier = "this"; + } + let startMoment = dayjs_1.default(context2.refDate); + let startMomentFixed = false; + const refOffset = startMoment.day(); + if (modifier == "last" || modifier == "past") { + startMoment = startMoment.day(offset - 7); + startMomentFixed = true; + } else if (modifier == "next") { + startMoment = startMoment.day(offset + 7); + startMomentFixed = true; + } else if (modifier == "this") { + startMoment = startMoment.day(offset); + } else { + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset + 7); + } else { + startMoment = startMoment.day(offset); + } + } + result.start.assign("weekday", offset); + if (startMomentFixed) { + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHansRelationWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js +var require_ZHHansTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var FIRST_REG_PATTERN = new RegExp("(?:\u4ECE|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); + var SECOND_REG_PATTERN = new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); + var DAY_GROUP_1 = 1; + var ZH_AM_PM_HOUR_GROUP_1 = 2; + var ZH_AM_PM_HOUR_GROUP_2 = 3; + var DAY_GROUP_3 = 4; + var ZH_AM_PM_HOUR_GROUP_3 = 5; + var HOUR_GROUP = 6; + var MINUTE_GROUP = 7; + var SECOND_GROUP = 8; + var AM_PM_HOUR_GROUP = 9; + var ZHHansTimeExpressionParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return FIRST_REG_PATTERN; + } + innerExtract(context2, match) { + if (match.index > 0 && context2.text[match.index - 1].match(/\w/)) { + return null; + } + const refMoment = dayjs_1.default(context2.refDate); + const result = context2.createParsingResult(match.index, match[0]); + const startMoment = refMoment.clone(); + if (match[DAY_GROUP_1]) { + const day1 = match[DAY_GROUP_1]; + if (day1 == "\u660E") { + if (refMoment.hour() > 1) { + startMoment.add(1, "day"); + } + } else if (day1 == "\u6628") { + startMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + startMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + startMoment.add(-3, "day"); + } else if (day1 == "\u540E") { + startMoment.add(2, "day"); + } else if (day1 == "\u5927\u540E") { + startMoment.add(3, "day"); + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else if (match[DAY_GROUP_3]) { + const day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E") { + startMoment.add(1, "day"); + } else if (day3 == "\u6628") { + startMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + startMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + startMoment.add(-3, "day"); + } else if (day3 == "\u540E") { + startMoment.add(2, "day"); + } else if (day3 == "\u5927\u540E") { + startMoment.add(3, "day"); + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + let hour = 0; + let minute = 0; + let meridiem = -1; + if (match[SECOND_GROUP]) { + let second = parseInt(match[SECOND_GROUP]); + if (isNaN(second)) { + second = constants_1.zhStringToNumber(match[SECOND_GROUP]); + } + if (second >= 60) + return null; + result.start.assign("second", second); + } + hour = parseInt(match[HOUR_GROUP]); + if (isNaN(hour)) { + hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); + } + if (match[MINUTE_GROUP]) { + if (match[MINUTE_GROUP] == "\u534A") { + minute = 30; + } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { + minute = 0; + } else { + minute = parseInt(match[MINUTE_GROUP]); + if (isNaN(minute)) { + minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); + } + } + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60) { + return null; + } + if (hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = 1; + } + if (match[AM_PM_HOUR_GROUP]) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = 0; + if (hour == 12) + hour = 0; + } + if (ampm == "p") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { + const zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; + const zhAMPM1 = zhAMPMString1[0]; + if (zhAMPM1 == "\u65E9") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM1 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { + const zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; + const zhAMPM2 = zhAMPMString2[0]; + if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { + const zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; + const zhAMPM3 = zhAMPMString3[0]; + if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } + result.start.assign("hour", hour); + result.start.assign("minute", minute); + if (meridiem >= 0) { + result.start.assign("meridiem", meridiem); + } else { + if (hour < 12) { + result.start.imply("meridiem", 0); + } else { + result.start.imply("meridiem", 1); + } + } + match = SECOND_REG_PATTERN.exec(context2.text.substring(result.index + result.text.length)); + if (!match) { + if (result.text.match(/^\d+$/)) { + return null; + } + return result; + } + const endMoment = startMoment.clone(); + result.end = context2.createParsingComponents(); + if (match[DAY_GROUP_1]) { + const day1 = match[DAY_GROUP_1]; + if (day1 == "\u660E") { + if (refMoment.hour() > 1) { + endMoment.add(1, "day"); + } + } else if (day1 == "\u6628") { + endMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + endMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + endMoment.add(-3, "day"); + } else if (day1 == "\u540E") { + endMoment.add(2, "day"); + } else if (day1 == "\u5927\u540E") { + endMoment.add(3, "day"); + } + result.end.assign("day", endMoment.date()); + result.end.assign("month", endMoment.month() + 1); + result.end.assign("year", endMoment.year()); + } else if (match[DAY_GROUP_3]) { + const day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E") { + endMoment.add(1, "day"); + } else if (day3 == "\u6628") { + endMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + endMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + endMoment.add(-3, "day"); + } else if (day3 == "\u540E") { + endMoment.add(2, "day"); + } else if (day3 == "\u5927\u540E") { + endMoment.add(3, "day"); + } + result.end.assign("day", endMoment.date()); + result.end.assign("month", endMoment.month() + 1); + result.end.assign("year", endMoment.year()); + } else { + result.end.imply("day", endMoment.date()); + result.end.imply("month", endMoment.month() + 1); + result.end.imply("year", endMoment.year()); + } + hour = 0; + minute = 0; + meridiem = -1; + if (match[SECOND_GROUP]) { + let second = parseInt(match[SECOND_GROUP]); + if (isNaN(second)) { + second = constants_1.zhStringToNumber(match[SECOND_GROUP]); + } + if (second >= 60) + return null; + result.end.assign("second", second); + } + hour = parseInt(match[HOUR_GROUP]); + if (isNaN(hour)) { + hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); + } + if (match[MINUTE_GROUP]) { + if (match[MINUTE_GROUP] == "\u534A") { + minute = 30; + } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { + minute = 0; + } else { + minute = parseInt(match[MINUTE_GROUP]); + if (isNaN(minute)) { + minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); + } + } + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60) { + return null; + } + if (hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = 1; + } + if (match[AM_PM_HOUR_GROUP]) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = 0; + if (hour == 12) + hour = 0; + } + if (ampm == "p") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + if (!result.start.isCertain("meridiem")) { + if (meridiem == 0) { + result.start.imply("meridiem", 0); + if (result.start.get("hour") == 12) { + result.start.assign("hour", 0); + } + } else { + result.start.imply("meridiem", 1); + if (result.start.get("hour") != 12) { + result.start.assign("hour", result.start.get("hour") + 12); + } + } + } + } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { + const zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; + const zhAMPM1 = zhAMPMString1[0]; + if (zhAMPM1 == "\u65E9") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM1 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { + const zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; + const zhAMPM2 = zhAMPMString2[0]; + if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { + const zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; + const zhAMPM3 = zhAMPMString3[0]; + if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } + result.text = result.text + match[0]; + result.end.assign("hour", hour); + result.end.assign("minute", minute); + if (meridiem >= 0) { + result.end.assign("meridiem", meridiem); + } else { + const startAtPM = result.start.isCertain("meridiem") && result.start.get("meridiem") == 1; + if (startAtPM && result.start.get("hour") > hour) { + result.end.imply("meridiem", 0); + } else if (hour > 12) { + result.end.imply("meridiem", 1); + } + } + if (result.end.date().getTime() < result.start.date().getTime()) { + result.end.imply("day", result.end.get("day") + 1); + } + return result; + } + }; + exports.default = ZHHansTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.js +var require_ZHHansWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var PATTERN = new RegExp("(?:\u661F\u671F|\u793C\u62DC|\u5468)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); + var ZHHansWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + const dayOfWeek = match.groups.weekday; + const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; + if (offset === void 0) + return null; + let startMoment = dayjs_1.default(context2.refDate); + const startMomentFixed = false; + const refOffset = startMoment.day(); + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset + 7); + } else { + startMoment = startMoment.day(offset); + } + result.start.assign("weekday", offset); + if (startMomentFixed) { + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHansWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.js +var require_ZHHansMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var ZHHansMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(至|到|-|~|~|-|ー)\s*$/i; + } + }; + exports.default = ZHHansMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.js +var require_ZHHansMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var ZHHansMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return /^\s*$/i; + } + }; + exports.default = ZHHansMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/index.js +var require_hans = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = exports.hans = void 0; + var chrono_1 = require_chrono(); + var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); + var configurations_1 = require_configurations(); + var ZHHansCasualDateParser_1 = __importDefault2(require_ZHHansCasualDateParser()); + var ZHHansDateParser_1 = __importDefault2(require_ZHHansDateParser()); + var ZHHansDeadlineFormatParser_1 = __importDefault2(require_ZHHansDeadlineFormatParser()); + var ZHHansRelationWeekdayParser_1 = __importDefault2(require_ZHHansRelationWeekdayParser()); + var ZHHansTimeExpressionParser_1 = __importDefault2(require_ZHHansTimeExpressionParser()); + var ZHHansWeekdayParser_1 = __importDefault2(require_ZHHansWeekdayParser()); + var ZHHansMergeDateRangeRefiner_1 = __importDefault2(require_ZHHansMergeDateRangeRefiner()); + var ZHHansMergeDateTimeRefiner_1 = __importDefault2(require_ZHHansMergeDateTimeRefiner()); + exports.hans = new chrono_1.Chrono(createCasualConfiguration()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration()); + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration() { + const option = createConfiguration(); + option.parsers.unshift(new ZHHansCasualDateParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration() { + const configuration = configurations_1.includeCommonConfiguration({ + parsers: [ + new ZHHansDateParser_1.default(), + new ZHHansRelationWeekdayParser_1.default(), + new ZHHansWeekdayParser_1.default(), + new ZHHansTimeExpressionParser_1.default(), + new ZHHansDeadlineFormatParser_1.default() + ], + refiners: [new ZHHansMergeDateRangeRefiner_1.default(), new ZHHansMergeDateTimeRefiner_1.default()] + }); + configuration.refiners = configuration.refiners.filter((refiner) => !(refiner instanceof ExtractTimezoneOffsetRefiner_1.default)); + return configuration; + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/zh/index.js +var require_zh = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/index.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __exportStar2 = exports && exports.__exportStar || function(m2, exports2) { + for (var p2 in m2) + if (p2 !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p2)) + __createBinding2(exports2, m2, p2); + }; + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.hans = void 0; + __exportStar2(require_hant(), exports); + exports.hans = __importStar2(require_hans()); + } +}); + +// node_modules/chrono-node/dist/locales/ru/constants.js +var require_constants9 = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = exports.REGEX_PARTS = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.REGEX_PARTS = { + leftBoundary: "([^\\p{L}\\p{N}_]|^)", + rightBoundary: "(?=[^\\p{L}\\p{N}_]|$)", + flags: "iu" + }; + exports.WEEKDAY_DICTIONARY = { + \u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435: 0, + \u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u044F: 0, + \u0432\u0441\u043A: 0, + "\u0432\u0441\u043A.": 0, + \u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A: 1, + \u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A\u0430: 1, + \u043F\u043D: 1, + "\u043F\u043D.": 1, + \u0432\u0442\u043E\u0440\u043D\u0438\u043A: 2, + \u0432\u0442\u043E\u0440\u043D\u0438\u043A\u0430: 2, + \u0432\u0442: 2, + "\u0432\u0442.": 2, + \u0441\u0440\u0435\u0434\u0430: 3, + \u0441\u0440\u0435\u0434\u044B: 3, + \u0441\u0440\u0435\u0434\u0443: 3, + \u0441\u0440: 3, + "\u0441\u0440.": 3, + \u0447\u0435\u0442\u0432\u0435\u0440\u0433: 4, + \u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430: 4, + \u0447\u0442: 4, + "\u0447\u0442.": 4, + \u043F\u044F\u0442\u043D\u0438\u0446\u0430: 5, + \u043F\u044F\u0442\u043D\u0438\u0446\u0443: 5, + \u043F\u044F\u0442\u043D\u0438\u0446\u044B: 5, + \u043F\u0442: 5, + "\u043F\u0442.": 5, + \u0441\u0443\u0431\u0431\u043E\u0442\u0430: 6, + \u0441\u0443\u0431\u0431\u043E\u0442\u0443: 6, + \u0441\u0443\u0431\u0431\u043E\u0442\u044B: 6, + \u0441\u0431: 6, + "\u0441\u0431.": 6 + }; + exports.FULL_MONTH_NAME_DICTIONARY = { + \u044F\u043D\u0432\u0430\u0440\u044C: 1, + \u044F\u043D\u0432\u0430\u0440\u044F: 1, + \u044F\u043D\u0432\u0430\u0440\u0435: 1, + \u0444\u0435\u0432\u0440\u0430\u043B\u044C: 2, + \u0444\u0435\u0432\u0440\u0430\u043B\u044F: 2, + \u0444\u0435\u0432\u0440\u0430\u043B\u0435: 2, + \u043C\u0430\u0440\u0442: 3, + \u043C\u0430\u0440\u0442\u0430: 3, + \u043C\u0430\u0440\u0442\u0435: 3, + \u0430\u043F\u0440\u0435\u043B\u044C: 4, + \u0430\u043F\u0440\u0435\u043B\u044F: 4, + \u0430\u043F\u0440\u0435\u043B\u0435: 4, + \u043C\u0430\u0439: 5, + \u043C\u0430\u044F: 5, + \u043C\u0430\u0435: 5, + \u0438\u044E\u043D\u044C: 6, + \u0438\u044E\u043D\u044F: 6, + \u0438\u044E\u043D\u0435: 6, + \u0438\u044E\u043B\u044C: 7, + \u0438\u044E\u043B\u044F: 7, + \u0438\u044E\u043B\u0435: 7, + \u0430\u0432\u0433\u0443\u0441\u0442: 8, + \u0430\u0432\u0433\u0443\u0441\u0442\u0430: 8, + \u0430\u0432\u0433\u0443\u0441\u0442\u0435: 8, + \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C: 9, + \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F: 9, + \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u0435: 9, + \u043E\u043A\u0442\u044F\u0431\u0440\u044C: 10, + \u043E\u043A\u0442\u044F\u0431\u0440\u044F: 10, + \u043E\u043A\u0442\u044F\u0431\u0440\u0435: 10, + \u043D\u043E\u044F\u0431\u0440\u044C: 11, + \u043D\u043E\u044F\u0431\u0440\u044F: 11, + \u043D\u043E\u044F\u0431\u0440\u0435: 11, + \u0434\u0435\u043A\u0430\u0431\u0440\u044C: 12, + \u0434\u0435\u043A\u0430\u0431\u0440\u044F: 12, + \u0434\u0435\u043A\u0430\u0431\u0440\u0435: 12 + }; + exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), { \u044F\u043D\u0432: 1, "\u044F\u043D\u0432.": 1, \u0444\u0435\u0432: 2, "\u0444\u0435\u0432.": 2, \u043C\u0430\u0440: 3, "\u043C\u0430\u0440.": 3, \u0430\u043F\u0440: 4, "\u0430\u043F\u0440.": 4, \u0430\u0432\u0433: 8, "\u0430\u0432\u0433.": 8, \u0441\u0435\u043D: 9, "\u0441\u0435\u043D.": 9, \u043E\u043A\u0442: 10, "\u043E\u043A\u0442.": 10, \u043D\u043E\u044F: 11, "\u043D\u043E\u044F.": 11, \u0434\u0435\u043A: 12, "\u0434\u0435\u043A.": 12 }); + exports.INTEGER_WORD_DICTIONARY = { + \u043E\u0434\u0438\u043D: 1, + \u043E\u0434\u043D\u0430: 1, + \u043E\u0434\u043D\u043E\u0439: 1, + \u043E\u0434\u043D\u0443: 1, + \u0434\u0432\u0435: 2, + \u0434\u0432\u0430: 2, + \u0434\u0432\u0443\u0445: 2, + \u0442\u0440\u0438: 3, + \u0442\u0440\u0435\u0445: 3, + \u0442\u0440\u0451\u0445: 3, + \u0447\u0435\u0442\u044B\u0440\u0435: 4, + \u0447\u0435\u0442\u044B\u0440\u0435\u0445: 4, + \u0447\u0435\u0442\u044B\u0440\u0451\u0445: 4, + \u043F\u044F\u0442\u044C: 5, + \u043F\u044F\u0442\u0438: 5, + \u0448\u0435\u0441\u0442\u044C: 6, + \u0448\u0435\u0441\u0442\u0438: 6, + \u0441\u0435\u043C\u044C: 7, + \u0441\u0435\u043C\u0438: 7, + \u0432\u043E\u0441\u0435\u043C\u044C: 8, + \u0432\u043E\u0441\u044C\u043C\u0438: 8, + \u0434\u0435\u0432\u044F\u0442\u044C: 9, + \u0434\u0435\u0432\u044F\u0442\u0438: 9, + \u0434\u0435\u0441\u044F\u0442\u044C: 10, + \u0434\u0435\u0441\u044F\u0442\u0438: 10, + \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u044C: 11, + \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u0438: 11, + \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u044C: 12, + \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u0438: 12 + }; + exports.ORDINAL_WORD_DICTIONARY = { + \u043F\u0435\u0440\u0432\u043E\u0435: 1, + \u043F\u0435\u0440\u0432\u043E\u0433\u043E: 1, + \u0432\u0442\u043E\u0440\u043E\u0435: 2, + \u0432\u0442\u043E\u0440\u043E\u0433\u043E: 2, + \u0442\u0440\u0435\u0442\u044C\u0435: 3, + \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E: 3, + \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435: 4, + \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E: 4, + \u043F\u044F\u0442\u043E\u0435: 5, + \u043F\u044F\u0442\u043E\u0433\u043E: 5, + \u0448\u0435\u0441\u0442\u043E\u0435: 6, + \u0448\u0435\u0441\u0442\u043E\u0433\u043E: 6, + \u0441\u0435\u0434\u044C\u043C\u043E\u0435: 7, + \u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E: 7, + \u0432\u043E\u0441\u044C\u043C\u043E\u0435: 8, + \u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E: 8, + \u0434\u0435\u0432\u044F\u0442\u043E\u0435: 9, + \u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E: 9, + \u0434\u0435\u0441\u044F\u0442\u043E\u0435: 10, + \u0434\u0435\u0441\u044F\u0442\u043E\u0433\u043E: 10, + \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 11, + \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 11, + \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 12, + \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 12, + \u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 13, + \u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 13, + \u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 14, + \u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 14, + \u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 15, + \u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 15, + \u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 16, + \u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 16, + \u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 17, + \u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 17, + \u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 18, + \u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 18, + \u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 19, + \u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 19, + \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 20, + \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 20, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435": 21, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E": 21, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0435": 22, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0433\u043E": 22, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435": 23, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E": 23, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435": 24, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E": 24, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0435": 25, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0433\u043E": 25, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0435": 26, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0433\u043E": 26, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0435": 27, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E": 27, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0435": 28, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E": 28, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0435": 29, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E": 29, + "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0435": 30, + "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0433\u043E": 30, + "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435": 31, + "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E": 31 + }; + exports.TIME_UNIT_DICTIONARY = { + \u0441\u0435\u043A: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u0430: "second", + \u0441\u0435\u043A\u0443\u043D\u0434: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u044B: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u0443: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0430: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0438: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u0435\u043A: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0443: "second", + \u043C\u0438\u043D: "minute", + \u043C\u0438\u043D\u0443\u0442\u0430: "minute", + \u043C\u0438\u043D\u0443\u0442: "minute", + \u043C\u0438\u043D\u0443\u0442\u044B: "minute", + \u043C\u0438\u043D\u0443\u0442\u0443: "minute", + \u043C\u0438\u043D\u0443\u0442\u043E\u043A: "minute", + \u043C\u0438\u043D\u0443\u0442\u043A\u0438: "minute", + \u043C\u0438\u043D\u0443\u0442\u043A\u0443: "minute", + \u0447\u0430\u0441: "hour", + \u0447\u0430\u0441\u043E\u0432: "hour", + \u0447\u0430\u0441\u0430: "hour", + \u0447\u0430\u0441\u0443: "hour", + \u0447\u0430\u0441\u0438\u043A\u043E\u0432: "hour", + \u0447\u0430\u0441\u0438\u043A\u0430: "hour", + \u0447\u0430\u0441\u0438\u043A\u0435: "hour", + \u0447\u0430\u0441\u0438\u043A: "hour", + \u0434\u0435\u043D\u044C: "d", + \u0434\u043D\u044F: "d", + \u0434\u043D\u0435\u0439: "d", + \u0441\u0443\u0442\u043E\u043A: "d", + \u0441\u0443\u0442\u043A\u0438: "d", + \u043D\u0435\u0434\u0435\u043B\u044F: "week", + \u043D\u0435\u0434\u0435\u043B\u0435: "week", + \u043D\u0435\u0434\u0435\u043B\u0438: "week", + \u043D\u0435\u0434\u0435\u043B\u044E: "week", + \u043D\u0435\u0434\u0435\u043B\u044C: "week", + \u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0435: "week", + \u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0438: "week", + \u043D\u0435\u0434\u0435\u043B\u0435\u043A: "week", + \u043C\u0435\u0441\u044F\u0446: "month", + \u043C\u0435\u0441\u044F\u0446\u0435: "month", + \u043C\u0435\u0441\u044F\u0446\u0435\u0432: "month", + \u043C\u0435\u0441\u044F\u0446\u0430: "month", + \u043A\u0432\u0430\u0440\u0442\u0430\u043B: "quarter", + \u043A\u0432\u0430\u0440\u0442\u0430\u043B\u0435: "quarter", + \u043A\u0432\u0430\u0440\u0442\u0430\u043B\u043E\u0432: "quarter", + \u0433\u043E\u0434: "year", + \u0433\u043E\u0434\u0430: "year", + \u0433\u043E\u0434\u0443: "year", + \u0433\u043E\u0434\u043E\u0432: "year", + \u043B\u0435\u0442: "year", + \u0433\u043E\u0434\u0438\u043A: "year", + \u0433\u043E\u0434\u0438\u043A\u0430: "year", + \u0433\u043E\u0434\u0438\u043A\u043E\u0432: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|\u043F\u043E\u043B|\u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E|\u043F\u0430\u0440(?:\u044B|\u0443)|\\s{0,3})`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } + if (num.match(/несколько/)) { + return 3; + } else if (num.match(/пол/)) { + return 0.5; + } else if (num.match(/пар/)) { + return 2; + } else if (num === "") { + return 1; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:\u0433\u043E|\u043E\u0433\u043E|\u0435|\u043E\u0435)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { + return exports.ORDINAL_WORD_DICTIONARY[num]; + } + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + var year = "(?:\\s+(?:\u0433\u043E\u0434\u0443|\u0433\u043E\u0434\u0430|\u0433\u043E\u0434|\u0433|\u0433.))?"; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}${year}\\s*(?:\u043D.\u044D.|\u0434\u043E \u043D.\u044D.|\u043D. \u044D.|\u0434\u043E \u043D. \u044D.)|[1-2][0-9]{3}${year}|[5-9][0-9]${year})`; + function parseYear(match) { + if (/(год|года|г|г.)/i.test(match)) { + match = match.replace(/(год|года|г|г.)/i, ""); + } + if (/(до н.э.|до н. э.)/i.test(match)) { + match = match.replace(/(до н.э.|до н. э.)/i, ""); + return -parseInt(match); + } + if (/(н. э.|н.э.)/i.test(match)) { + match = match.replace(/(н. э.|н.э.)/i, ""); + return parseInt(match); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,3}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s{0,3})?`, SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length).trim(); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitWithinFormatParser.js +var require_RUTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = `(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})${constants_1.REGEX_PARTS.rightBoundary}`; + var PATTERN_WITH_PREFIX = new RegExp(`(?:\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435|\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0438)\\s*${PATTERN}`, constants_1.REGEX_PARTS.flags); + var PATTERN_WITHOUT_PREFIX = new RegExp(PATTERN, "i"); + var RUTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern(context2) { + return context2.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX; + } + innerExtract(context2, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + }; + exports.default = RUTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameLittleEndianParser.js +var require_RUMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants9(); + var constants_2 = require_constants9(); + var constants_3 = require_constants9(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:\u0441)?\\s*(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:\u043F\u043E|-|\u2013|\u0434\u043E)?\\s{0,3}(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|\\/|\\s{0,3}(?:of)?\\s{0,3})(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|\\/|,?\\s{0,3})(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var RUMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const result = context2.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = RUMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameParser.js +var require_RUMonthNameParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var years_1 = require_years(); + var pattern_1 = require_pattern(); + var constants_2 = require_constants9(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`((?:\u0432)\\s*)?(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, constants_1.REGEX_PARTS.flags); + var MONTH_NAME_GROUP = 2; + var YEAR_GROUP = 3; + var RUMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const monthName = match[MONTH_NAME_GROUP].toLowerCase(); + if (match[0].length <= 3 && !constants_1.FULL_MONTH_NAME_DICTIONARY[monthName]) { + return null; + } + const result = context2.createParsingResult(match.index, match.index + match[0].length); + result.start.imply("day", 1); + const month = constants_1.MONTH_DICTIONARY[monthName]; + result.start.assign("month", month); + if (match[YEAR_GROUP]) { + const year = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context2.refDate, 1, month); + result.start.imply("year", year); + } + return result; + } + }; + exports.default = RUMonthNameParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeExpressionParser.js +var require_RUTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var constants_1 = require_constants9(); + var RUTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + constructor(strictMode) { + super(strictMode); + } + patternFlags() { + return constants_1.REGEX_PARTS.flags; + } + primaryPatternLeftBoundary() { + return `(^|\\s|T|(?:[^\\p{L}\\p{N}_]))`; + } + followingPhase() { + return `\\s*(?:\\-|\\\u2013|\\~|\\\u301C|\u0434\u043E|\u0438|\u043F\u043E|\\?)\\s*`; + } + primaryPrefix() { + return `(?:(?:\u0432|\u0441)\\s*)??`; + } + primarySuffix() { + return `(?:\\s*(?:\u0443\u0442\u0440\u0430|\u0432\u0435\u0447\u0435\u0440\u0430|\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F))?(?!\\/)${constants_1.REGEX_PARTS.rightBoundary}`; + } + extractPrimaryTimeComponents(context2, match) { + const components = super.extractPrimaryTimeComponents(context2, match); + if (components) { + if (match[0].endsWith("\u0432\u0435\u0447\u0435\u0440\u0430")) { + const hour = components.get("hour"); + if (hour >= 6 && hour < 12) { + components.assign("hour", components.get("hour") + 12); + components.assign("meridiem", index_1.Meridiem.PM); + } else if (hour < 6) { + components.assign("meridiem", index_1.Meridiem.AM); + } + } + if (match[0].endsWith("\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F")) { + components.assign("meridiem", index_1.Meridiem.PM); + const hour = components.get("hour"); + if (hour >= 0 && hour <= 6) { + components.assign("hour", components.get("hour") + 12); + } + } + if (match[0].endsWith("\u0443\u0442\u0440\u0430")) { + components.assign("meridiem", index_1.Meridiem.AM); + const hour = components.get("hour"); + if (hour < 12) { + components.assign("hour", components.get("hour")); + } + } + } + return components; + } + }; + exports.default = RUTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitAgoFormatParser.js +var require_RUTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}\u043D\u0430\u0437\u0430\u0434(?=(?:\\W|$))`, constants_1.REGEX_PARTS.flags); + var RUTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, outputTimeUnits); + } + }; + exports.default = RUTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateRangeRefiner.js +var require_RUMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var RUMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(и до|и по|до|по|-)\s*$/i; + } + }; + exports.default = RUMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateTimeRefiner.js +var require_RUMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var RUMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp(`^\\s*(T|\u0432|,|-)?\\s*$`); + } + }; + exports.default = RUMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUCasualDateParser.js +var require_RUCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var constants_1 = require_constants9(); + var PATTERN = new RegExp(`(?:\u0441|\u0441\u043E)?\\s*(\u0441\u0435\u0433\u043E\u0434\u043D\u044F|\u0432\u0447\u0435\u0440\u0430|\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430)${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var RUCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern(context2) { + return PATTERN; + } + innerExtract(context2, match) { + const lowerText = match[1].toLowerCase(); + const component = context2.createParsingComponents(); + switch (lowerText) { + case "\u0441\u0435\u0433\u043E\u0434\u043D\u044F": + return references.today(context2.reference); + case "\u0432\u0447\u0435\u0440\u0430": + return references.yesterday(context2.reference); + case "\u0437\u0430\u0432\u0442\u0440\u0430": + return references.tomorrow(context2.reference); + case "\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430": + return references.theDayAfter(context2.reference, 2); + case "\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430": + return references.theDayBefore(context2.reference, 2); + } + return component; + } + }; + exports.default = RUCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUCasualTimeParser.js +var require_RUCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUCasualTimeParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var dayjs_1 = require_dayjs(); + var dayjs_2 = __importDefault2(require_dayjs_min()); + var constants_1 = require_constants9(); + var PATTERN = new RegExp(`(\u0441\u0435\u0439\u0447\u0430\u0441|\u043F\u0440\u043E\u0448\u043B\u044B\u043C\\s*\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u043F\u0440\u043E\u0448\u043B\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u0435\u0433\u043E\u0434\u043D\u044F\\s*\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u0438\u043C \u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u0434\u0435\u043D\u044C|\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u0432\u0435\u0447\u0435\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u043D\u043E\u0447\u044C)${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var RUCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + let targetDate = dayjs_2.default(context2.refDate); + const lowerText = match[0].toLowerCase(); + const component = context2.createParsingComponents(); + if (lowerText === "\u0441\u0435\u0439\u0447\u0430\u0441") { + return references.now(context2.reference); + } + if (lowerText === "\u0432\u0435\u0447\u0435\u0440\u043E\u043C" || lowerText === "\u0432\u0435\u0447\u0435\u0440\u0430") { + return references.evening(context2.reference); + } + if (lowerText.endsWith("\u0443\u0442\u0440\u043E\u043C") || lowerText.endsWith("\u0443\u0442\u0440\u0430")) { + return references.morning(context2.reference); + } + if (lowerText.match(/в\s*полдень/)) { + return references.noon(context2.reference); + } + if (lowerText.match(/прошлой\s*ночью/)) { + return references.lastNight(context2.reference); + } + if (lowerText.match(/прошлым\s*вечером/)) { + return references.yesterdayEvening(context2.reference); + } + if (lowerText.match(/следующей\s*ночью/)) { + const daysToAdd = targetDate.hour() < 22 ? 1 : 2; + targetDate = targetDate.add(daysToAdd, "day"); + dayjs_1.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + if (lowerText.match(/в\s*полночь/) || lowerText.endsWith("\u043D\u043E\u0447\u044C\u044E")) { + return references.midnight(context2.reference); + } + return component; + } + }; + exports.default = RUCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUWeekdayParser.js +var require_RUWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weekdays_1 = require_weekdays(); + var PATTERN = new RegExp(`(?:(?:,|\\(|\uFF08)\\s*)?(?:\u0432\\s*?)?(?:(\u044D\u0442\u0443|\u044D\u0442\u043E\u0442|\u043F\u0440\u043E\u0448\u043B\u044B\u0439|\u043F\u0440\u043E\u0448\u043B\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:,|\\)|\uFF09))?(?:\\s*\u043D\u0430\\s*(\u044D\u0442\u043E\u0439|\u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439)\\s*\u043D\u0435\u0434\u0435\u043B\u0435)?${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var RUWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerExtract(context2, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const weekday = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord == "\u043F\u0440\u043E\u0448\u043B\u044B\u0439" || modifierWord == "\u043F\u0440\u043E\u0448\u043B\u0443\u044E" || modifierWord == "\u043F\u0440\u043E\u0448\u043B\u043E\u0439") { + modifier = "last"; + } else if (modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439" || modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E" || modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439" || modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E") { + modifier = "next"; + } else if (modifierWord == "\u044D\u0442\u043E\u0442" || modifierWord == "\u044D\u0442\u0443" || modifierWord == "\u044D\u0442\u043E\u0439") { + modifier = "this"; + } + return weekdays_1.createParsingComponentsAtWeekday(context2.reference, weekday, modifier); + } + }; + exports.default = RUWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RURelativeDateFormatParser.js +var require_RURelativeDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RURelativeDateFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var pattern_1 = require_pattern(); + var PATTERN = new RegExp(`(\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C|\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439|\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C|\u043D\u0430 \u044D\u0442\u043E\u0439|\u0432 \u044D\u0442\u043E\u043C)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var MODIFIER_WORD_GROUP = 1; + var RELATIVE_WORD_GROUP = 2; + var RURelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); + const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); + const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; + if (modifier == "\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439" || modifier == "\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C") { + const timeUnits = {}; + timeUnits[timeunit] = 1; + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + if (modifier == "\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C" || modifier == "\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439") { + const timeUnits = {}; + timeUnits[timeunit] = -1; + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + const components = context2.createParsingComponents(); + let date = dayjs_1.default(context2.reference.instant); + if (timeunit.match(/week/i)) { + date = date.add(-date.get("d"), "d"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.imply("year", date.year()); + } else if (timeunit.match(/month/i)) { + date = date.add(-date.date() + 1, "d"); + components.imply("day", date.date()); + components.assign("year", date.year()); + components.assign("month", date.month() + 1); + } else if (timeunit.match(/year/i)) { + date = date.add(-date.date() + 1, "d"); + date = date.add(-date.month(), "month"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.assign("year", date.year()); + } + return components; + } + }; + exports.default = RURelativeDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js +var require_RUTimeUnitCasualRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(\u044D\u0442\u0438|\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435|\u043F\u0440\u043E\u0448\u043B\u044B\u0435|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435|\u043F\u043E\u0441\u043B\u0435|\u0447\u0435\u0440\u0435\u0437|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var RUTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context2, match) { + const prefix = match[1].toLowerCase(); + let timeUnits = constants_1.parseTimeUnits(match[2]); + switch (prefix) { + case "\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435": + case "\u043F\u0440\u043E\u0448\u043B\u044B\u0435": + case "-": + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + break; + } + return results_1.ParsingComponents.createRelativeFromReference(context2.reference, timeUnits); + } + }; + exports.default = RUTimeUnitCasualRelativeFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/index.js +var require_ru = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var RUTimeUnitWithinFormatParser_1 = __importDefault2(require_RUTimeUnitWithinFormatParser()); + var RUMonthNameLittleEndianParser_1 = __importDefault2(require_RUMonthNameLittleEndianParser()); + var RUMonthNameParser_1 = __importDefault2(require_RUMonthNameParser()); + var RUTimeExpressionParser_1 = __importDefault2(require_RUTimeExpressionParser()); + var RUTimeUnitAgoFormatParser_1 = __importDefault2(require_RUTimeUnitAgoFormatParser()); + var RUMergeDateRangeRefiner_1 = __importDefault2(require_RUMergeDateRangeRefiner()); + var RUMergeDateTimeRefiner_1 = __importDefault2(require_RUMergeDateTimeRefiner()); + var configurations_1 = require_configurations(); + var RUCasualDateParser_1 = __importDefault2(require_RUCasualDateParser()); + var RUCasualTimeParser_1 = __importDefault2(require_RUCasualTimeParser()); + var RUWeekdayParser_1 = __importDefault2(require_RUWeekdayParser()); + var RURelativeDateFormatParser_1 = __importDefault2(require_RURelativeDateFormatParser()); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var RUTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_RUTimeUnitCasualRelativeFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + function createCasualConfiguration() { + const option = createConfiguration(false); + option.parsers.unshift(new RUCasualDateParser_1.default()); + option.parsers.unshift(new RUCasualTimeParser_1.default()); + option.parsers.unshift(new RUMonthNameParser_1.default()); + option.parsers.unshift(new RURelativeDateFormatParser_1.default()); + option.parsers.unshift(new RUTimeUnitCasualRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(true), + new RUTimeUnitWithinFormatParser_1.default(), + new RUMonthNameLittleEndianParser_1.default(), + new RUWeekdayParser_1.default(), + new RUTimeExpressionParser_1.default(strictMode), + new RUTimeUnitAgoFormatParser_1.default() + ], + refiners: [new RUMergeDateTimeRefiner_1.default(), new RUMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/index.js +var require_dist = __commonJS({ + "node_modules/chrono-node/dist/index.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + Object.defineProperty(o6, k22, { enumerable: true, get: function() { + return m2[k2]; + } }); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseDate = exports.parse = exports.casual = exports.strict = exports.ru = exports.zh = exports.nl = exports.pt = exports.ja = exports.fr = exports.de = exports.Weekday = exports.Meridiem = exports.Chrono = exports.en = void 0; + var en = __importStar2(require_en()); + exports.en = en; + var chrono_1 = require_chrono(); + Object.defineProperty(exports, "Chrono", { enumerable: true, get: function() { + return chrono_1.Chrono; + } }); + var Meridiem; + (function(Meridiem2) { + Meridiem2[Meridiem2["AM"] = 0] = "AM"; + Meridiem2[Meridiem2["PM"] = 1] = "PM"; + })(Meridiem = exports.Meridiem || (exports.Meridiem = {})); + var Weekday; + (function(Weekday2) { + Weekday2[Weekday2["SUNDAY"] = 0] = "SUNDAY"; + Weekday2[Weekday2["MONDAY"] = 1] = "MONDAY"; + Weekday2[Weekday2["TUESDAY"] = 2] = "TUESDAY"; + Weekday2[Weekday2["WEDNESDAY"] = 3] = "WEDNESDAY"; + Weekday2[Weekday2["THURSDAY"] = 4] = "THURSDAY"; + Weekday2[Weekday2["FRIDAY"] = 5] = "FRIDAY"; + Weekday2[Weekday2["SATURDAY"] = 6] = "SATURDAY"; + })(Weekday = exports.Weekday || (exports.Weekday = {})); + var de = __importStar2(require_de()); + exports.de = de; + var fr = __importStar2(require_fr()); + exports.fr = fr; + var ja = __importStar2(require_ja()); + exports.ja = ja; + var pt = __importStar2(require_pt()); + exports.pt = pt; + var nl = __importStar2(require_nl()); + exports.nl = nl; + var zh = __importStar2(require_zh()); + exports.zh = zh; + var ru = __importStar2(require_ru()); + exports.ru = ru; + exports.strict = en.strict; + exports.casual = en.casual; + function parse3(text, ref, option) { + return exports.casual.parse(text, ref, option); + } + exports.parse = parse3; + function parseDate(text, ref, option) { + return exports.casual.parseDate(text, ref, option); + } + exports.parseDate = parseDate; + } +}); + +// node_modules/tslib/tslib.js +var require_tslib = __commonJS({ + "node_modules/tslib/tslib.js"(exports, module2) { + var __extends2; + var __assign2; + var __rest2; + var __decorate2; + var __param2; + var __metadata2; + var __awaiter2; + var __generator2; + var __exportStar2; + var __values2; + var __read2; + var __spread2; + var __spreadArrays2; + var __spreadArray2; + var __await2; + var __asyncGenerator2; + var __asyncDelegator2; + var __asyncValues2; + var __makeTemplateObject2; + var __importStar2; + var __importDefault2; + var __classPrivateFieldGet2; + var __classPrivateFieldSet2; + var __classPrivateFieldIn2; + var __createBinding2; + (function(factory) { + var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; + if (typeof define === "function" && define.amd) { + define("tslib", ["exports"], function(exports2) { + factory(createExporter(root, createExporter(exports2))); + }); + } else if (typeof module2 === "object" && typeof module2.exports === "object") { + factory(createExporter(root, createExporter(module2.exports))); + } else { + factory(createExporter(root)); + } + function createExporter(exports2, previous) { + if (exports2 !== root) { + if (typeof Object.create === "function") { + Object.defineProperty(exports2, "__esModule", { value: true }); + } else { + exports2.__esModule = true; + } + } + return function(id, v2) { + return exports2[id] = previous ? previous(id, v2) : v2; + }; + } + })(function(exporter) { + var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d3, b2) { + d3.__proto__ = b2; + } || function(d3, b2) { + for (var p2 in b2) + if (Object.prototype.hasOwnProperty.call(b2, p2)) + d3[p2] = b2[p2]; + }; + __extends2 = function(d3, b2) { + if (typeof b2 !== "function" && b2 !== null) + throw new TypeError("Class extends value " + String(b2) + " is not a constructor or null"); + extendStatics(d3, b2); + function __() { + this.constructor = d3; + } + d3.prototype = b2 === null ? Object.create(b2) : (__.prototype = b2.prototype, new __()); + }; + __assign2 = Object.assign || function(t3) { + for (var s5, i4 = 1, n6 = arguments.length; i4 < n6; i4++) { + s5 = arguments[i4]; + for (var p2 in s5) + if (Object.prototype.hasOwnProperty.call(s5, p2)) + t3[p2] = s5[p2]; + } + return t3; + }; + __rest2 = function(s5, e7) { + var t3 = {}; + for (var p2 in s5) + if (Object.prototype.hasOwnProperty.call(s5, p2) && e7.indexOf(p2) < 0) + t3[p2] = s5[p2]; + if (s5 != null && typeof Object.getOwnPropertySymbols === "function") + for (var i4 = 0, p2 = Object.getOwnPropertySymbols(s5); i4 < p2.length; i4++) { + if (e7.indexOf(p2[i4]) < 0 && Object.prototype.propertyIsEnumerable.call(s5, p2[i4])) + t3[p2[i4]] = s5[p2[i4]]; + } + return t3; + }; + __decorate2 = function(decorators, target, key, desc) { + var c3 = arguments.length, r4 = c3 < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d3; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") + r4 = Reflect.decorate(decorators, target, key, desc); + else + for (var i4 = decorators.length - 1; i4 >= 0; i4--) + if (d3 = decorators[i4]) + r4 = (c3 < 3 ? d3(r4) : c3 > 3 ? d3(target, key, r4) : d3(target, key)) || r4; + return c3 > 3 && r4 && Object.defineProperty(target, key, r4), r4; + }; + __param2 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + __metadata2 = function(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") + return Reflect.metadata(metadataKey, metadataValue); + }; + __awaiter2 = function(thisArg, _arguments, P2, generator) { + function adopt(value) { + return value instanceof P2 ? value : new P2(function(resolve) { + resolve(value); + }); + } + return new (P2 || (P2 = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e7) { + reject(e7); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e7) { + reject(e7); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + __generator2 = function(thisArg, body) { + var _2 = { label: 0, sent: function() { + if (t3[0] & 1) + throw t3[1]; + return t3[1]; + }, trys: [], ops: [] }, f2, y2, t3, g2; + return g2 = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g2[Symbol.iterator] = function() { + return this; + }), g2; + function verb(n6) { + return function(v2) { + return step([n6, v2]); + }; + } + function step(op) { + if (f2) + throw new TypeError("Generator is already executing."); + while (_2) + try { + if (f2 = 1, y2 && (t3 = op[0] & 2 ? y2["return"] : op[0] ? y2["throw"] || ((t3 = y2["return"]) && t3.call(y2), 0) : y2.next) && !(t3 = t3.call(y2, op[1])).done) + return t3; + if (y2 = 0, t3) + op = [op[0] & 2, t3.value]; + switch (op[0]) { + case 0: + case 1: + t3 = op; + break; + case 4: + _2.label++; + return { value: op[1], done: false }; + case 5: + _2.label++; + y2 = op[1]; + op = [0]; + continue; + case 7: + op = _2.ops.pop(); + _2.trys.pop(); + continue; + default: + if (!(t3 = _2.trys, t3 = t3.length > 0 && t3[t3.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _2 = 0; + continue; + } + if (op[0] === 3 && (!t3 || op[1] > t3[0] && op[1] < t3[3])) { + _2.label = op[1]; + break; + } + if (op[0] === 6 && _2.label < t3[1]) { + _2.label = t3[1]; + t3 = op; + break; + } + if (t3 && _2.label < t3[2]) { + _2.label = t3[2]; + _2.ops.push(op); + break; + } + if (t3[2]) + _2.ops.pop(); + _2.trys.pop(); + continue; + } + op = body.call(thisArg, _2); + } catch (e7) { + op = [6, e7]; + y2 = 0; + } finally { + f2 = t3 = 0; + } + if (op[0] & 5) + throw op[1]; + return { value: op[0] ? op[1] : void 0, done: true }; + } + }; + __exportStar2 = function(m2, o6) { + for (var p2 in m2) + if (p2 !== "default" && !Object.prototype.hasOwnProperty.call(o6, p2)) + __createBinding2(o6, m2, p2); + }; + __createBinding2 = Object.create ? function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + var desc = Object.getOwnPropertyDescriptor(m2, k2); + if (!desc || ("get" in desc ? !m2.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m2[k2]; + } }; + } + Object.defineProperty(o6, k22, desc); + } : function(o6, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o6[k22] = m2[k2]; + }; + __values2 = function(o6) { + var s5 = typeof Symbol === "function" && Symbol.iterator, m2 = s5 && o6[s5], i4 = 0; + if (m2) + return m2.call(o6); + if (o6 && typeof o6.length === "number") + return { + next: function() { + if (o6 && i4 >= o6.length) + o6 = void 0; + return { value: o6 && o6[i4++], done: !o6 }; + } + }; + throw new TypeError(s5 ? "Object is not iterable." : "Symbol.iterator is not defined."); + }; + __read2 = function(o6, n6) { + var m2 = typeof Symbol === "function" && o6[Symbol.iterator]; + if (!m2) + return o6; + var i4 = m2.call(o6), r4, ar = [], e7; + try { + while ((n6 === void 0 || n6-- > 0) && !(r4 = i4.next()).done) + ar.push(r4.value); + } catch (error) { + e7 = { error }; + } finally { + try { + if (r4 && !r4.done && (m2 = i4["return"])) + m2.call(i4); + } finally { + if (e7) + throw e7.error; + } + } + return ar; + }; + __spread2 = function() { + for (var ar = [], i4 = 0; i4 < arguments.length; i4++) + ar = ar.concat(__read2(arguments[i4])); + return ar; + }; + __spreadArrays2 = function() { + for (var s5 = 0, i4 = 0, il = arguments.length; i4 < il; i4++) + s5 += arguments[i4].length; + for (var r4 = Array(s5), k2 = 0, i4 = 0; i4 < il; i4++) + for (var a3 = arguments[i4], j = 0, jl = a3.length; j < jl; j++, k2++) + r4[k2] = a3[j]; + return r4; + }; + __spreadArray2 = function(to, from, pack) { + if (pack || arguments.length === 2) + for (var i4 = 0, l5 = from.length, ar; i4 < l5; i4++) { + if (ar || !(i4 in from)) { + if (!ar) + ar = Array.prototype.slice.call(from, 0, i4); + ar[i4] = from[i4]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); + }; + __await2 = function(v2) { + return this instanceof __await2 ? (this.v = v2, this) : new __await2(v2); + }; + __asyncGenerator2 = function(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var g2 = generator.apply(thisArg, _arguments || []), i4, q = []; + return i4 = {}, verb("next"), verb("throw"), verb("return"), i4[Symbol.asyncIterator] = function() { + return this; + }, i4; + function verb(n6) { + if (g2[n6]) + i4[n6] = function(v2) { + return new Promise(function(a3, b2) { + q.push([n6, v2, a3, b2]) > 1 || resume(n6, v2); + }); + }; + } + function resume(n6, v2) { + try { + step(g2[n6](v2)); + } catch (e7) { + settle(q[0][3], e7); + } + } + function step(r4) { + r4.value instanceof __await2 ? Promise.resolve(r4.value.v).then(fulfill, reject) : settle(q[0][2], r4); + } + function fulfill(value) { + resume("next", value); + } + function reject(value) { + resume("throw", value); + } + function settle(f2, v2) { + if (f2(v2), q.shift(), q.length) + resume(q[0][0], q[0][1]); + } + }; + __asyncDelegator2 = function(o6) { + var i4, p2; + return i4 = {}, verb("next"), verb("throw", function(e7) { + throw e7; + }), verb("return"), i4[Symbol.iterator] = function() { + return this; + }, i4; + function verb(n6, f2) { + i4[n6] = o6[n6] ? function(v2) { + return (p2 = !p2) ? { value: __await2(o6[n6](v2)), done: n6 === "return" } : f2 ? f2(v2) : v2; + } : f2; + } + }; + __asyncValues2 = function(o6) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var m2 = o6[Symbol.asyncIterator], i4; + return m2 ? m2.call(o6) : (o6 = typeof __values2 === "function" ? __values2(o6) : o6[Symbol.iterator](), i4 = {}, verb("next"), verb("throw"), verb("return"), i4[Symbol.asyncIterator] = function() { + return this; + }, i4); + function verb(n6) { + i4[n6] = o6[n6] && function(v2) { + return new Promise(function(resolve, reject) { + v2 = o6[n6](v2), settle(resolve, reject, v2.done, v2.value); + }); + }; + } + function settle(resolve, reject, d3, v2) { + Promise.resolve(v2).then(function(v3) { + resolve({ value: v3, done: d3 }); + }, reject); + } + }; + __makeTemplateObject2 = function(cooked, raw) { + if (Object.defineProperty) { + Object.defineProperty(cooked, "raw", { value: raw }); + } else { + cooked.raw = raw; + } + return cooked; + }; + var __setModuleDefault = Object.create ? function(o6, v2) { + Object.defineProperty(o6, "default", { enumerable: true, value: v2 }); + } : function(o6, v2) { + o6["default"] = v2; + }; + __importStar2 = function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k2 in mod) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod, k2)) + __createBinding2(result, mod, k2); + } + __setModuleDefault(result, mod); + return result; + }; + __importDefault2 = function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + __classPrivateFieldGet2 = function(receiver, state, kind, f2) { + if (kind === "a" && !f2) + throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f2 : !state.has(receiver)) + throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f2 : kind === "a" ? f2.call(receiver) : f2 ? f2.value : state.get(receiver); + }; + __classPrivateFieldSet2 = function(receiver, state, value, kind, f2) { + if (kind === "m") + throw new TypeError("Private method is not writable"); + if (kind === "a" && !f2) + throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f2 : !state.has(receiver)) + throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return kind === "a" ? f2.call(receiver, value) : f2 ? f2.value = value : state.set(receiver, value), value; + }; + __classPrivateFieldIn2 = function(state, receiver) { + if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") + throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); + }; + exporter("__extends", __extends2); + exporter("__assign", __assign2); + exporter("__rest", __rest2); + exporter("__decorate", __decorate2); + exporter("__param", __param2); + exporter("__metadata", __metadata2); + exporter("__awaiter", __awaiter2); + exporter("__generator", __generator2); + exporter("__exportStar", __exportStar2); + exporter("__createBinding", __createBinding2); + exporter("__values", __values2); + exporter("__read", __read2); + exporter("__spread", __spread2); + exporter("__spreadArrays", __spreadArrays2); + exporter("__spreadArray", __spreadArray2); + exporter("__await", __await2); + exporter("__asyncGenerator", __asyncGenerator2); + exporter("__asyncDelegator", __asyncDelegator2); + exporter("__asyncValues", __asyncValues2); + exporter("__makeTemplateObject", __makeTemplateObject2); + exporter("__importStar", __importStar2); + exporter("__importDefault", __importDefault2); + exporter("__classPrivateFieldGet", __classPrivateFieldGet2); + exporter("__classPrivateFieldSet", __classPrivateFieldSet2); + exporter("__classPrivateFieldIn", __classPrivateFieldIn2); + }); + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => AppleRemindersPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian4 = require("obsidian"); + +// node_modules/@lit/reactive-element/css-tag.js +var t = window; +var e = t.ShadowRoot && (t.ShadyCSS === void 0 || t.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype; +var s = Symbol(); +var n = /* @__PURE__ */ new WeakMap(); +var o = class { + constructor(t3, e7, n6) { + if (this._$cssResult$ = true, n6 !== s) + throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead."); + this.cssText = t3, this.t = e7; + } + get styleSheet() { + let t3 = this.o; + const s5 = this.t; + if (e && t3 === void 0) { + const e7 = s5 !== void 0 && s5.length === 1; + e7 && (t3 = n.get(s5)), t3 === void 0 && ((this.o = t3 = new CSSStyleSheet()).replaceSync(this.cssText), e7 && n.set(s5, t3)); + } + return t3; + } + toString() { + return this.cssText; + } +}; +var r = (t3) => new o(typeof t3 == "string" ? t3 : t3 + "", void 0, s); +var i = (t3, ...e7) => { + const n6 = t3.length === 1 ? t3[0] : e7.reduce((e8, s5, n7) => e8 + ((t4) => { + if (t4._$cssResult$ === true) + return t4.cssText; + if (typeof t4 == "number") + return t4; + throw Error("Value passed to 'css' function must be a 'css' function result: " + t4 + ". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security."); + })(s5) + t3[n7 + 1], t3[0]); + return new o(n6, t3, s); +}; +var S = (s5, n6) => { + e ? s5.adoptedStyleSheets = n6.map((t3) => t3 instanceof CSSStyleSheet ? t3 : t3.styleSheet) : n6.forEach((e7) => { + const n7 = document.createElement("style"), o6 = t.litNonce; + o6 !== void 0 && n7.setAttribute("nonce", o6), n7.textContent = e7.cssText, s5.appendChild(n7); + }); +}; +var c = e ? (t3) => t3 : (t3) => t3 instanceof CSSStyleSheet ? ((t4) => { + let e7 = ""; + for (const s5 of t4.cssRules) + e7 += s5.cssText; + return r(e7); +})(t3) : t3; + +// node_modules/@lit/reactive-element/reactive-element.js +var s2; +var e2 = window; +var r2 = e2.trustedTypes; +var h = r2 ? r2.emptyScript : ""; +var o2 = e2.reactiveElementPolyfillSupport; +var n2 = { toAttribute(t3, i4) { + switch (i4) { + case Boolean: + t3 = t3 ? h : null; + break; + case Object: + case Array: + t3 = t3 == null ? t3 : JSON.stringify(t3); + } + return t3; +}, fromAttribute(t3, i4) { + let s5 = t3; + switch (i4) { + case Boolean: + s5 = t3 !== null; + break; + case Number: + s5 = t3 === null ? null : Number(t3); + break; + case Object: + case Array: + try { + s5 = JSON.parse(t3); + } catch (t4) { + s5 = null; + } + } + return s5; +} }; +var a = (t3, i4) => i4 !== t3 && (i4 == i4 || t3 == t3); +var l = { attribute: true, type: String, converter: n2, reflect: false, hasChanged: a }; +var d = class extends HTMLElement { + constructor() { + super(), this._$Ei = /* @__PURE__ */ new Map(), this.isUpdatePending = false, this.hasUpdated = false, this._$El = null, this.u(); + } + static addInitializer(t3) { + var i4; + (i4 = this.h) !== null && i4 !== void 0 || (this.h = []), this.h.push(t3); + } + static get observedAttributes() { + this.finalize(); + const t3 = []; + return this.elementProperties.forEach((i4, s5) => { + const e7 = this._$Ep(s5, i4); + e7 !== void 0 && (this._$Ev.set(e7, s5), t3.push(e7)); + }), t3; + } + static createProperty(t3, i4 = l) { + if (i4.state && (i4.attribute = false), this.finalize(), this.elementProperties.set(t3, i4), !i4.noAccessor && !this.prototype.hasOwnProperty(t3)) { + const s5 = typeof t3 == "symbol" ? Symbol() : "__" + t3, e7 = this.getPropertyDescriptor(t3, s5, i4); + e7 !== void 0 && Object.defineProperty(this.prototype, t3, e7); + } + } + static getPropertyDescriptor(t3, i4, s5) { + return { get() { + return this[i4]; + }, set(e7) { + const r4 = this[t3]; + this[i4] = e7, this.requestUpdate(t3, r4, s5); + }, configurable: true, enumerable: true }; + } + static getPropertyOptions(t3) { + return this.elementProperties.get(t3) || l; + } + static finalize() { + if (this.hasOwnProperty("finalized")) + return false; + this.finalized = true; + const t3 = Object.getPrototypeOf(this); + if (t3.finalize(), this.elementProperties = new Map(t3.elementProperties), this._$Ev = /* @__PURE__ */ new Map(), this.hasOwnProperty("properties")) { + const t4 = this.properties, i4 = [...Object.getOwnPropertyNames(t4), ...Object.getOwnPropertySymbols(t4)]; + for (const s5 of i4) + this.createProperty(s5, t4[s5]); + } + return this.elementStyles = this.finalizeStyles(this.styles), true; + } + static finalizeStyles(i4) { + const s5 = []; + if (Array.isArray(i4)) { + const e7 = new Set(i4.flat(1 / 0).reverse()); + for (const i5 of e7) + s5.unshift(c(i5)); + } else + i4 !== void 0 && s5.push(c(i4)); + return s5; + } + static _$Ep(t3, i4) { + const s5 = i4.attribute; + return s5 === false ? void 0 : typeof s5 == "string" ? s5 : typeof t3 == "string" ? t3.toLowerCase() : void 0; + } + u() { + var t3; + this._$E_ = new Promise((t4) => this.enableUpdating = t4), this._$AL = /* @__PURE__ */ new Map(), this._$Eg(), this.requestUpdate(), (t3 = this.constructor.h) === null || t3 === void 0 || t3.forEach((t4) => t4(this)); + } + addController(t3) { + var i4, s5; + ((i4 = this._$ES) !== null && i4 !== void 0 ? i4 : this._$ES = []).push(t3), this.renderRoot !== void 0 && this.isConnected && ((s5 = t3.hostConnected) === null || s5 === void 0 || s5.call(t3)); + } + removeController(t3) { + var i4; + (i4 = this._$ES) === null || i4 === void 0 || i4.splice(this._$ES.indexOf(t3) >>> 0, 1); + } + _$Eg() { + this.constructor.elementProperties.forEach((t3, i4) => { + this.hasOwnProperty(i4) && (this._$Ei.set(i4, this[i4]), delete this[i4]); + }); + } + createRenderRoot() { + var t3; + const s5 = (t3 = this.shadowRoot) !== null && t3 !== void 0 ? t3 : this.attachShadow(this.constructor.shadowRootOptions); + return S(s5, this.constructor.elementStyles), s5; + } + connectedCallback() { + var t3; + this.renderRoot === void 0 && (this.renderRoot = this.createRenderRoot()), this.enableUpdating(true), (t3 = this._$ES) === null || t3 === void 0 || t3.forEach((t4) => { + var i4; + return (i4 = t4.hostConnected) === null || i4 === void 0 ? void 0 : i4.call(t4); + }); + } + enableUpdating(t3) { + } + disconnectedCallback() { + var t3; + (t3 = this._$ES) === null || t3 === void 0 || t3.forEach((t4) => { + var i4; + return (i4 = t4.hostDisconnected) === null || i4 === void 0 ? void 0 : i4.call(t4); + }); + } + attributeChangedCallback(t3, i4, s5) { + this._$AK(t3, s5); + } + _$EO(t3, i4, s5 = l) { + var e7; + const r4 = this.constructor._$Ep(t3, s5); + if (r4 !== void 0 && s5.reflect === true) { + const h3 = (((e7 = s5.converter) === null || e7 === void 0 ? void 0 : e7.toAttribute) !== void 0 ? s5.converter : n2).toAttribute(i4, s5.type); + this._$El = t3, h3 == null ? this.removeAttribute(r4) : this.setAttribute(r4, h3), this._$El = null; + } + } + _$AK(t3, i4) { + var s5; + const e7 = this.constructor, r4 = e7._$Ev.get(t3); + if (r4 !== void 0 && this._$El !== r4) { + const t4 = e7.getPropertyOptions(r4), h3 = typeof t4.converter == "function" ? { fromAttribute: t4.converter } : ((s5 = t4.converter) === null || s5 === void 0 ? void 0 : s5.fromAttribute) !== void 0 ? t4.converter : n2; + this._$El = r4, this[r4] = h3.fromAttribute(i4, t4.type), this._$El = null; + } + } + requestUpdate(t3, i4, s5) { + let e7 = true; + t3 !== void 0 && (((s5 = s5 || this.constructor.getPropertyOptions(t3)).hasChanged || a)(this[t3], i4) ? (this._$AL.has(t3) || this._$AL.set(t3, i4), s5.reflect === true && this._$El !== t3 && (this._$EC === void 0 && (this._$EC = /* @__PURE__ */ new Map()), this._$EC.set(t3, s5))) : e7 = false), !this.isUpdatePending && e7 && (this._$E_ = this._$Ej()); + } + _$Ej() { + return __async(this, null, function* () { + this.isUpdatePending = true; + try { + yield this._$E_; + } catch (t4) { + Promise.reject(t4); + } + const t3 = this.scheduleUpdate(); + return t3 != null && (yield t3), !this.isUpdatePending; + }); + } + scheduleUpdate() { + return this.performUpdate(); + } + performUpdate() { + var t3; + if (!this.isUpdatePending) + return; + this.hasUpdated, this._$Ei && (this._$Ei.forEach((t4, i5) => this[i5] = t4), this._$Ei = void 0); + let i4 = false; + const s5 = this._$AL; + try { + i4 = this.shouldUpdate(s5), i4 ? (this.willUpdate(s5), (t3 = this._$ES) === null || t3 === void 0 || t3.forEach((t4) => { + var i5; + return (i5 = t4.hostUpdate) === null || i5 === void 0 ? void 0 : i5.call(t4); + }), this.update(s5)) : this._$Ek(); + } catch (t4) { + throw i4 = false, this._$Ek(), t4; + } + i4 && this._$AE(s5); + } + willUpdate(t3) { + } + _$AE(t3) { + var i4; + (i4 = this._$ES) === null || i4 === void 0 || i4.forEach((t4) => { + var i5; + return (i5 = t4.hostUpdated) === null || i5 === void 0 ? void 0 : i5.call(t4); + }), this.hasUpdated || (this.hasUpdated = true, this.firstUpdated(t3)), this.updated(t3); + } + _$Ek() { + this._$AL = /* @__PURE__ */ new Map(), this.isUpdatePending = false; + } + get updateComplete() { + return this.getUpdateComplete(); + } + getUpdateComplete() { + return this._$E_; + } + shouldUpdate(t3) { + return true; + } + update(t3) { + this._$EC !== void 0 && (this._$EC.forEach((t4, i4) => this._$EO(i4, this[i4], t4)), this._$EC = void 0), this._$Ek(); + } + updated(t3) { + } + firstUpdated(t3) { + } +}; +d.finalized = true, d.elementProperties = /* @__PURE__ */ new Map(), d.elementStyles = [], d.shadowRootOptions = { mode: "open" }, o2 == null || o2({ ReactiveElement: d }), ((s2 = e2.reactiveElementVersions) !== null && s2 !== void 0 ? s2 : e2.reactiveElementVersions = []).push("1.4.1"); + +// node_modules/lit-html/lit-html.js +var t2; +var i2 = window; +var s3 = i2.trustedTypes; +var e3 = s3 ? s3.createPolicy("lit-html", { createHTML: (t3) => t3 }) : void 0; +var o3 = `lit$${(Math.random() + "").slice(9)}$`; +var n3 = "?" + o3; +var l2 = `<${n3}>`; +var h2 = document; +var r3 = (t3 = "") => h2.createComment(t3); +var d2 = (t3) => t3 === null || typeof t3 != "object" && typeof t3 != "function"; +var u = Array.isArray; +var c2 = (t3) => u(t3) || typeof (t3 == null ? void 0 : t3[Symbol.iterator]) == "function"; +var v = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g; +var a2 = /-->/g; +var f = />/g; +var _ = RegExp(`>|[ +\f\r](?:([^\\s"'>=/]+)([ +\f\r]*=[ +\f\r]*(?:[^ +\f\r"'\`<>=]|("|')|))|$)`, "g"); +var m = /'/g; +var p = /"/g; +var $ = /^(?:script|style|textarea|title)$/i; +var g = (t3) => (i4, ...s5) => ({ _$litType$: t3, strings: i4, values: s5 }); +var y = g(1); +var w = g(2); +var x = Symbol.for("lit-noChange"); +var b = Symbol.for("lit-nothing"); +var T = /* @__PURE__ */ new WeakMap(); +var A = (t3, i4, s5) => { + var e7, o6; + const n6 = (e7 = s5 == null ? void 0 : s5.renderBefore) !== null && e7 !== void 0 ? e7 : i4; + let l5 = n6._$litPart$; + if (l5 === void 0) { + const t4 = (o6 = s5 == null ? void 0 : s5.renderBefore) !== null && o6 !== void 0 ? o6 : null; + n6._$litPart$ = l5 = new S2(i4.insertBefore(r3(), t4), t4, void 0, s5 != null ? s5 : {}); + } + return l5._$AI(t3), l5; +}; +var E = h2.createTreeWalker(h2, 129, null, false); +var C = (t3, i4) => { + const s5 = t3.length - 1, n6 = []; + let h3, r4 = i4 === 2 ? "" : "", d3 = v; + for (let i5 = 0; i5 < s5; i5++) { + const s6 = t3[i5]; + let e7, u3, c3 = -1, g2 = 0; + for (; g2 < s6.length && (d3.lastIndex = g2, u3 = d3.exec(s6), u3 !== null); ) + g2 = d3.lastIndex, d3 === v ? u3[1] === "!--" ? d3 = a2 : u3[1] !== void 0 ? d3 = f : u3[2] !== void 0 ? ($.test(u3[2]) && (h3 = RegExp("" ? (d3 = h3 != null ? h3 : v, c3 = -1) : u3[1] === void 0 ? c3 = -2 : (c3 = d3.lastIndex - u3[2].length, e7 = u3[1], d3 = u3[3] === void 0 ? _ : u3[3] === '"' ? p : m) : d3 === p || d3 === m ? d3 = _ : d3 === a2 || d3 === f ? d3 = v : (d3 = _, h3 = void 0); + const y2 = d3 === _ && t3[i5 + 1].startsWith("/>") ? " " : ""; + r4 += d3 === v ? s6 + l2 : c3 >= 0 ? (n6.push(e7), s6.slice(0, c3) + "$lit$" + s6.slice(c3) + o3 + y2) : s6 + o3 + (c3 === -2 ? (n6.push(void 0), i5) : y2); + } + const u2 = r4 + (t3[s5] || "") + (i4 === 2 ? "" : ""); + if (!Array.isArray(t3) || !t3.hasOwnProperty("raw")) + throw Error("invalid template strings array"); + return [e3 !== void 0 ? e3.createHTML(u2) : u2, n6]; +}; +var P = class { + constructor({ strings: t3, _$litType$: i4 }, e7) { + let l5; + this.parts = []; + let h3 = 0, d3 = 0; + const u2 = t3.length - 1, c3 = this.parts, [v2, a3] = C(t3, i4); + if (this.el = P.createElement(v2, e7), E.currentNode = this.el.content, i4 === 2) { + const t4 = this.el.content, i5 = t4.firstChild; + i5.remove(), t4.append(...i5.childNodes); + } + for (; (l5 = E.nextNode()) !== null && c3.length < u2; ) { + if (l5.nodeType === 1) { + if (l5.hasAttributes()) { + const t4 = []; + for (const i5 of l5.getAttributeNames()) + if (i5.endsWith("$lit$") || i5.startsWith(o3)) { + const s5 = a3[d3++]; + if (t4.push(i5), s5 !== void 0) { + const t5 = l5.getAttribute(s5.toLowerCase() + "$lit$").split(o3), i6 = /([.?@])?(.*)/.exec(s5); + c3.push({ type: 1, index: h3, name: i6[2], strings: t5, ctor: i6[1] === "." ? R : i6[1] === "?" ? H : i6[1] === "@" ? I : M }); + } else + c3.push({ type: 6, index: h3 }); + } + for (const i5 of t4) + l5.removeAttribute(i5); + } + if ($.test(l5.tagName)) { + const t4 = l5.textContent.split(o3), i5 = t4.length - 1; + if (i5 > 0) { + l5.textContent = s3 ? s3.emptyScript : ""; + for (let s5 = 0; s5 < i5; s5++) + l5.append(t4[s5], r3()), E.nextNode(), c3.push({ type: 2, index: ++h3 }); + l5.append(t4[i5], r3()); + } + } + } else if (l5.nodeType === 8) + if (l5.data === n3) + c3.push({ type: 2, index: h3 }); + else { + let t4 = -1; + for (; (t4 = l5.data.indexOf(o3, t4 + 1)) !== -1; ) + c3.push({ type: 7, index: h3 }), t4 += o3.length - 1; + } + h3++; + } + } + static createElement(t3, i4) { + const s5 = h2.createElement("template"); + return s5.innerHTML = t3, s5; + } +}; +function V(t3, i4, s5 = t3, e7) { + var o6, n6, l5, h3; + if (i4 === x) + return i4; + let r4 = e7 !== void 0 ? (o6 = s5._$Cl) === null || o6 === void 0 ? void 0 : o6[e7] : s5._$Cu; + const u2 = d2(i4) ? void 0 : i4._$litDirective$; + return (r4 == null ? void 0 : r4.constructor) !== u2 && ((n6 = r4 == null ? void 0 : r4._$AO) === null || n6 === void 0 || n6.call(r4, false), u2 === void 0 ? r4 = void 0 : (r4 = new u2(t3), r4._$AT(t3, s5, e7)), e7 !== void 0 ? ((l5 = (h3 = s5)._$Cl) !== null && l5 !== void 0 ? l5 : h3._$Cl = [])[e7] = r4 : s5._$Cu = r4), r4 !== void 0 && (i4 = V(t3, r4._$AS(t3, i4.values), r4, e7)), i4; +} +var N = class { + constructor(t3, i4) { + this.v = [], this._$AN = void 0, this._$AD = t3, this._$AM = i4; + } + get parentNode() { + return this._$AM.parentNode; + } + get _$AU() { + return this._$AM._$AU; + } + p(t3) { + var i4; + const { el: { content: s5 }, parts: e7 } = this._$AD, o6 = ((i4 = t3 == null ? void 0 : t3.creationScope) !== null && i4 !== void 0 ? i4 : h2).importNode(s5, true); + E.currentNode = o6; + let n6 = E.nextNode(), l5 = 0, r4 = 0, d3 = e7[0]; + for (; d3 !== void 0; ) { + if (l5 === d3.index) { + let i5; + d3.type === 2 ? i5 = new S2(n6, n6.nextSibling, this, t3) : d3.type === 1 ? i5 = new d3.ctor(n6, d3.name, d3.strings, this, t3) : d3.type === 6 && (i5 = new L(n6, this, t3)), this.v.push(i5), d3 = e7[++r4]; + } + l5 !== (d3 == null ? void 0 : d3.index) && (n6 = E.nextNode(), l5++); + } + return o6; + } + m(t3) { + let i4 = 0; + for (const s5 of this.v) + s5 !== void 0 && (s5.strings !== void 0 ? (s5._$AI(t3, s5, i4), i4 += s5.strings.length - 2) : s5._$AI(t3[i4])), i4++; + } +}; +var S2 = class { + constructor(t3, i4, s5, e7) { + var o6; + this.type = 2, this._$AH = b, this._$AN = void 0, this._$AA = t3, this._$AB = i4, this._$AM = s5, this.options = e7, this._$C_ = (o6 = e7 == null ? void 0 : e7.isConnected) === null || o6 === void 0 || o6; + } + get _$AU() { + var t3, i4; + return (i4 = (t3 = this._$AM) === null || t3 === void 0 ? void 0 : t3._$AU) !== null && i4 !== void 0 ? i4 : this._$C_; + } + get parentNode() { + let t3 = this._$AA.parentNode; + const i4 = this._$AM; + return i4 !== void 0 && t3.nodeType === 11 && (t3 = i4.parentNode), t3; + } + get startNode() { + return this._$AA; + } + get endNode() { + return this._$AB; + } + _$AI(t3, i4 = this) { + t3 = V(this, t3, i4), d2(t3) ? t3 === b || t3 == null || t3 === "" ? (this._$AH !== b && this._$AR(), this._$AH = b) : t3 !== this._$AH && t3 !== x && this.$(t3) : t3._$litType$ !== void 0 ? this.T(t3) : t3.nodeType !== void 0 ? this.k(t3) : c2(t3) ? this.O(t3) : this.$(t3); + } + S(t3, i4 = this._$AB) { + return this._$AA.parentNode.insertBefore(t3, i4); + } + k(t3) { + this._$AH !== t3 && (this._$AR(), this._$AH = this.S(t3)); + } + $(t3) { + this._$AH !== b && d2(this._$AH) ? this._$AA.nextSibling.data = t3 : this.k(h2.createTextNode(t3)), this._$AH = t3; + } + T(t3) { + var i4; + const { values: s5, _$litType$: e7 } = t3, o6 = typeof e7 == "number" ? this._$AC(t3) : (e7.el === void 0 && (e7.el = P.createElement(e7.h, this.options)), e7); + if (((i4 = this._$AH) === null || i4 === void 0 ? void 0 : i4._$AD) === o6) + this._$AH.m(s5); + else { + const t4 = new N(o6, this), i5 = t4.p(this.options); + t4.m(s5), this.k(i5), this._$AH = t4; + } + } + _$AC(t3) { + let i4 = T.get(t3.strings); + return i4 === void 0 && T.set(t3.strings, i4 = new P(t3)), i4; + } + O(t3) { + u(this._$AH) || (this._$AH = [], this._$AR()); + const i4 = this._$AH; + let s5, e7 = 0; + for (const o6 of t3) + e7 === i4.length ? i4.push(s5 = new S2(this.S(r3()), this.S(r3()), this, this.options)) : s5 = i4[e7], s5._$AI(o6), e7++; + e7 < i4.length && (this._$AR(s5 && s5._$AB.nextSibling, e7), i4.length = e7); + } + _$AR(t3 = this._$AA.nextSibling, i4) { + var s5; + for ((s5 = this._$AP) === null || s5 === void 0 || s5.call(this, false, true, i4); t3 && t3 !== this._$AB; ) { + const i5 = t3.nextSibling; + t3.remove(), t3 = i5; + } + } + setConnected(t3) { + var i4; + this._$AM === void 0 && (this._$C_ = t3, (i4 = this._$AP) === null || i4 === void 0 || i4.call(this, t3)); + } +}; +var M = class { + constructor(t3, i4, s5, e7, o6) { + this.type = 1, this._$AH = b, this._$AN = void 0, this.element = t3, this.name = i4, this._$AM = e7, this.options = o6, s5.length > 2 || s5[0] !== "" || s5[1] !== "" ? (this._$AH = Array(s5.length - 1).fill(new String()), this.strings = s5) : this._$AH = b; + } + get tagName() { + return this.element.tagName; + } + get _$AU() { + return this._$AM._$AU; + } + _$AI(t3, i4 = this, s5, e7) { + const o6 = this.strings; + let n6 = false; + if (o6 === void 0) + t3 = V(this, t3, i4, 0), n6 = !d2(t3) || t3 !== this._$AH && t3 !== x, n6 && (this._$AH = t3); + else { + const e8 = t3; + let l5, h3; + for (t3 = o6[0], l5 = 0; l5 < o6.length - 1; l5++) + h3 = V(this, e8[s5 + l5], i4, l5), h3 === x && (h3 = this._$AH[l5]), n6 || (n6 = !d2(h3) || h3 !== this._$AH[l5]), h3 === b ? t3 = b : t3 !== b && (t3 += (h3 != null ? h3 : "") + o6[l5 + 1]), this._$AH[l5] = h3; + } + n6 && !e7 && this.P(t3); + } + P(t3) { + t3 === b ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, t3 != null ? t3 : ""); + } +}; +var R = class extends M { + constructor() { + super(...arguments), this.type = 3; + } + P(t3) { + this.element[this.name] = t3 === b ? void 0 : t3; + } +}; +var k = s3 ? s3.emptyScript : ""; +var H = class extends M { + constructor() { + super(...arguments), this.type = 4; + } + P(t3) { + t3 && t3 !== b ? this.element.setAttribute(this.name, k) : this.element.removeAttribute(this.name); + } +}; +var I = class extends M { + constructor(t3, i4, s5, e7, o6) { + super(t3, i4, s5, e7, o6), this.type = 5; + } + _$AI(t3, i4 = this) { + var s5; + if ((t3 = (s5 = V(this, t3, i4, 0)) !== null && s5 !== void 0 ? s5 : b) === x) + return; + const e7 = this._$AH, o6 = t3 === b && e7 !== b || t3.capture !== e7.capture || t3.once !== e7.once || t3.passive !== e7.passive, n6 = t3 !== b && (e7 === b || o6); + o6 && this.element.removeEventListener(this.name, this, e7), n6 && this.element.addEventListener(this.name, this, t3), this._$AH = t3; + } + handleEvent(t3) { + var i4, s5; + typeof this._$AH == "function" ? this._$AH.call((s5 = (i4 = this.options) === null || i4 === void 0 ? void 0 : i4.host) !== null && s5 !== void 0 ? s5 : this.element, t3) : this._$AH.handleEvent(t3); + } +}; +var L = class { + constructor(t3, i4, s5) { + this.element = t3, this.type = 6, this._$AN = void 0, this._$AM = i4, this.options = s5; + } + get _$AU() { + return this._$AM._$AU; + } + _$AI(t3) { + V(this, t3); + } +}; +var Z = i2.litHtmlPolyfillSupport; +Z == null || Z(P, S2), ((t2 = i2.litHtmlVersions) !== null && t2 !== void 0 ? t2 : i2.litHtmlVersions = []).push("2.3.1"); + +// node_modules/lit-element/lit-element.js +var l3; +var o4; +var s4 = class extends d { + constructor() { + super(...arguments), this.renderOptions = { host: this }, this._$Do = void 0; + } + createRenderRoot() { + var t3, e7; + const i4 = super.createRenderRoot(); + return (t3 = (e7 = this.renderOptions).renderBefore) !== null && t3 !== void 0 || (e7.renderBefore = i4.firstChild), i4; + } + update(t3) { + const i4 = this.render(); + this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t3), this._$Do = A(i4, this.renderRoot, this.renderOptions); + } + connectedCallback() { + var t3; + super.connectedCallback(), (t3 = this._$Do) === null || t3 === void 0 || t3.setConnected(true); + } + disconnectedCallback() { + var t3; + super.disconnectedCallback(), (t3 = this._$Do) === null || t3 === void 0 || t3.setConnected(false); + } + render() { + return x; + } +}; +s4.finalized = true, s4._$litElement$ = true, (l3 = globalThis.litElementHydrateSupport) === null || l3 === void 0 || l3.call(globalThis, { LitElement: s4 }); +var n4 = globalThis.litElementPolyfillSupport; +n4 == null || n4({ LitElement: s4 }); +((o4 = globalThis.litElementVersions) !== null && o4 !== void 0 ? o4 : globalThis.litElementVersions = []).push("3.2.2"); + +// node_modules/@lit/reactive-element/decorators/custom-element.js +var e4 = (e7) => (n6) => typeof n6 == "function" ? ((e8, n7) => (customElements.define(e8, n7), n7))(e7, n6) : ((e8, n7) => { + const { kind: t3, elements: s5 } = n7; + return { kind: t3, elements: s5, finisher(n8) { + customElements.define(e8, n8); + } }; +})(e7, n6); + +// node_modules/@lit/reactive-element/decorators/property.js +var i3 = (i4, e7) => e7.kind === "method" && e7.descriptor && !("value" in e7.descriptor) ? __spreadProps(__spreadValues({}, e7), { finisher(n6) { + n6.createProperty(e7.key, i4); +} }) : { kind: "field", key: Symbol(), placement: "own", descriptor: {}, originalKey: e7.key, initializer() { + typeof e7.initializer == "function" && (this[e7.key] = e7.initializer.call(this)); +}, finisher(n6) { + n6.createProperty(e7.key, i4); +} }; +function e5(e7) { + return (n6, t3) => t3 !== void 0 ? ((i4, e8, n7) => { + e8.constructor.createProperty(n7, i4); + })(e7, n6, t3) : i3(e7, n6); +} + +// node_modules/@lit/reactive-element/decorators/query-assigned-elements.js +var n5; +var e6 = ((n5 = window.HTMLSlotElement) === null || n5 === void 0 ? void 0 : n5.prototype.assignedElements) != null ? (o6, n6) => o6.assignedElements(n6) : (o6, n6) => o6.assignedNodes(n6).filter((o7) => o7.nodeType === Node.ELEMENT_NODE); + +// src/data/apple-integration.ts +var import_node_osascript = __toESM(require_lib()); +var executor = (script, variables = null) => __async(void 0, null, function* () { + return new Promise((resolve, reject) => { + let childProcess = import_node_osascript.default.execute(script, variables, (err, res, raw) => { + if (err) + reject(err); + resolve(res); + }); + setTimeout(() => { + childProcess.stdin.pause(); + childProcess.kill(); + reject("Apple Script timed out"); + }, 3e4); + }); +}); + +// src/ui/settings.ts +var import_obsidian = require("obsidian"); +var DEFAULT_SETTINGS = { + autoRefreshTime: 60 +}; +var SampleSettingTab = class extends import_obsidian.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + containerEl.createEl("h2", { text: "Apple Reminders Plugin" }); + new import_obsidian.Setting(containerEl).setName("Auto Refresh Time (seconds)").setDesc("Please input time in seconds. This controls the interval between which the plugin automatically refreshes with Apple Reminders. (Restart Obsidian for changes to take affect)").setTooltip("300 seconds = 5 minutes").addSlider((text) => text.setLimits(60, 600, 10).setValue(this.plugin.settings.autoRefreshTime).onChange((value) => __async(this, null, function* () { + this.plugin.settings.autoRefreshTime = value; + yield this.plugin.saveSettings(); + }))); + } +}; + +// src/data/utilities.ts +var chrono = __toESM(require_dist()); +var import_obsidian2 = require("obsidian"); + +// src/data/constants.ts +var APPLE_DATE_FORMAT = "dddd, DD MMMM at H:m:ss"; + +// src/data/utilities.ts +function predicate(reminder, filters, filename) { + var match = true; + if (filters == null) + return true; + filters.forEach((filter) => { + if (filter != null) { + if (filter.date != null) { + if (reminder["due date"] == "missing value") { + match && (match = false); + } else { + var date = filter.date == "daily note" ? filename : filter.date; + if (date) { + var range = chrono.parse(date)[0]; + var start = (0, import_obsidian2.moment)(range.start.date()); + if (range.end != null) { + var end = (0, import_obsidian2.moment)(range.end.date()); + match && (match = (0, import_obsidian2.moment)(reminder["due date"], APPLE_DATE_FORMAT).isBetween(start, end, "day", "[]")); + } else { + match && (match = (0, import_obsidian2.moment)(reminder["due date"], APPLE_DATE_FORMAT).isSame(start, "day")); + } + } + } + } + if (filter.priority != null) { + var priority = 0; + switch (filter.priority) { + case "high": + priority = 1; + break; + case "medium": + priority = 5; + break; + case "low": + priority = 9; + break; + default: + priority = 0; + } + match && (match = reminder.priority == priority); + } + } + }); + return match; +} + +// src/data/reminders-data.service.ts +var RemindersDataService = function() { + let logger = console.log; + let settings = DEFAULT_SETTINGS; + const getAllLists = () => __async(this, null, function* () { + logger("Getting all lists"); + return yield executor(`tell application "Reminders" to return properties of lists`); + }); + const getList = (list_name) => __async(this, null, function* () { + logger("Looking for " + list_name); + let ret = yield executor(`tell application "Reminders" + try + return properties of list list_name + on error + set lis to make new list + set name of lis to list_name + return properties of lis + end try + end tell`, { list_name }); + logger("Done", 3e3); + return ret; + }); + const getReminders = (list_name, filters) => __async(this, null, function* () { + logger("Getting reminders in " + list_name); + let x2 = yield executor(`tell list list_name in application "Reminders" + set buffer to ((current date) - hours * 1) + return properties of reminders whose completion date comes after buffer or completed is false + end tell`, { list_name }); + logger("Done", 3e3); + if (!Array.isArray(x2)) + return []; + if (filters) { + x2 = x2.filter((value) => predicate(value, filters, null)); + } + return x2; + }); + const getOrCreateReminder = (list_name, reminder_name) => __async(this, null, function* () { + logger("Looking for " + reminder_name + " in " + list_name + " before attempting to create"); + let ret = yield executor(`tell list list_name in application "Reminders" + try + return properties of reminder reminder_name + on error + set rem to make new reminder + set name of rem to reminder_name + return properties of rem + end try + end tell`, { list_name, reminder_name }); + return ret; + }); + const refreshReminder = (reminderId) => { + }; + const toggleReminderDoneStatus = (list_name, reminder_name) => __async(this, null, function* () { + logger("Toggling Reminder: " + reminder_name + " in list " + list_name); + let ret = yield executor(`tell list list_name in application "Reminders" + set rem to reminder reminder_name + set completed in rem to not completed in rem + return properties of rem + end tell`, { list_name, reminder_name }); + logger("Done", 3e3); + return ret; + }); + return { + getAllLists, + getList, + getReminders, + getOrCreateReminder, + refreshReminder, + toggleReminderDoneStatus, + setLogger: (func) => { + logger = (x2, clearAfter) => { + func(x2, clearAfter); + }; + }, + setSettings: (_settings) => { + settings = _settings; + }, + fetchData: (spec, fileName = null) => { + let customReminders = spec.reminders ? spec.reminders : []; + return Promise.all([ + getList(spec.list), + getReminders(spec["list"], spec["filters"]), + Promise.all(customReminders.map((rem) => getOrCreateReminder(spec.list, rem))) + ]); + }, + getSettings: () => settings + }; +}(); + +// src/ui/loading-bar.element.ts +var LoadingBarComponent = class extends s4 { + render() { + return w` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `; + } +}; +LoadingBarComponent = __decorateClass([ + e4("apple-list-loading-bar") +], LoadingBarComponent); + +// src/ui/reminder.element.ts +var import_obsidian3 = require("obsidian"); +var ReminderElement = class extends s4 { + onCheckboxChange(event) { + RemindersDataService.toggleReminderDoneStatus(this.list_name, this.model.name).then((rem) => { + this.model = rem; + }); + } + render() { + return y` + + + + ${this.model.priority && this.model.priority > 0 ? y` + + ${Array.from(Array(Math.ceil((10 - this.model.priority) / 3)).keys()).reduce((prev, curr) => prev + "!", "")} + + ` : ""} + ${this.model.name} + ${this.model.body && this.model.body != "missing value" ? y`
${this.model.body}` : ""} + ${this.model["due date"] && this.model["due date"] != "missing value" ? y`
${(0, import_obsidian3.moment)(this.model["due date"], APPLE_DATE_FORMAT).format(" YYYY/MM/DD, hh:mm a (Z)")}` : ""} +
+
+
+
+ `; + } +}; +ReminderElement.styles = i` + .checkbox-round { + width: 1.3em; + height: 1.3em; + background-color: rgba(255, 255, 255, 0); + border-radius: 50%; + vertical-align: middle; + border: 1px solid rgb(170, 168, 168); + -webkit-appearance: none; + outline: none; + cursor: pointer; + opacity: 0.3; + } + + .checkbox-round:checked { + background-color: gray; + } + + .apple-reminder-name { + padding-left: 1rem; + } + + .apple-reminder-due-date { + opacity: 0.3; + padding-left: 4em; + } + .apple-reminder-container { + padding: 0; + margin: 0; + } + .apple-reminder-priority { + color: red; + } + .apple-reminder-note { + opacity: 0.3; + padding-left: 4em; + } + .apple-list-break { + margin: 0; + } + + .apple-list-reminder-break-line { + margin-left: 2em; + margin-top: 0.5em; + margin-bottom: 0.5em; + padding: 0; + height: 0.5px; + opacity: 0.2; + } + `; +__decorateClass([ + e5() +], ReminderElement.prototype, "list_name", 2); +__decorateClass([ + e5() +], ReminderElement.prototype, "model", 2); +ReminderElement = __decorateClass([ + e4("apple-reminder-element") +], ReminderElement); + +// src/ui/list.element.ts +var ListElement = class extends s4 { + constructor(_spec) { + super(); + this.refreshDisabled = false; + this.reminders = []; + this.customReminders = []; + this.loadingBar = new LoadingBarComponent(); + this.spec = _spec; + } + get elements() { + return this.reminders.concat(this.customReminders).map((rem) => { + let el = new ReminderElement(); + el.model = rem; + el.list_name = this.listMeta.name; + return el; + }); + } + refresh() { + this.refreshDisabled = true; + RemindersDataService.fetchData(this.spec, this.fileName).then(([listData, reminders, customReminders]) => { + this.reminders = reminders; + this.listMeta = listData; + this.customReminders = customReminders; + this.refreshDisabled = false; + }); + } + render() { + var _a, _b, _c; + return y` +
+
+

+ ${!((_b = this.listMeta) == null ? void 0 : _b.name) ? (_c = this.spec) == null ? void 0 : _c.list : this.listMeta.name} +

+ + ${this.listMeta ? y` + + ${this.elements.length > 0 ? this.elements : y`No reminders found`} + + + ` : this.loadingBar} +
+ +
+
+ `; + } +}; +ListElement.styles = i` + .apple-list-reminders { + margin: 0; + padding: 0; + } + + .apple-list-top-rule, + .apple-list-bottom-rule { + opacity: 0; + } + `; +__decorateClass([ + e5() +], ListElement.prototype, "spec", 2); +__decorateClass([ + e5() +], ListElement.prototype, "refreshDisabled", 2); +__decorateClass([ + e5() +], ListElement.prototype, "reminders", 2); +__decorateClass([ + e5() +], ListElement.prototype, "customReminders", 2); +__decorateClass([ + e5() +], ListElement.prototype, "listMeta", 2); +__decorateClass([ + e5() +], ListElement.prototype, "fileName", 2); +ListElement = __decorateClass([ + e4("apple-list-element") +], ListElement); + +// node_modules/yaml/browser/dist/nodes/Node.js +var ALIAS = Symbol.for("yaml.alias"); +var DOC = Symbol.for("yaml.document"); +var MAP = Symbol.for("yaml.map"); +var PAIR = Symbol.for("yaml.pair"); +var SCALAR = Symbol.for("yaml.scalar"); +var SEQ = Symbol.for("yaml.seq"); +var NODE_TYPE = Symbol.for("yaml.node.type"); +var isAlias = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === ALIAS; +var isDocument = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === DOC; +var isMap = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === MAP; +var isPair = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === PAIR; +var isScalar = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SCALAR; +var isSeq = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SEQ; +function isCollection(node) { + if (node && typeof node === "object") + switch (node[NODE_TYPE]) { + case MAP: + case SEQ: + return true; + } + return false; +} +function isNode(node) { + if (node && typeof node === "object") + switch (node[NODE_TYPE]) { + case ALIAS: + case MAP: + case SCALAR: + case SEQ: + return true; + } + return false; +} +var hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor; +var NodeBase = class { + constructor(type) { + Object.defineProperty(this, NODE_TYPE, { value: type }); + } + clone() { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (this.range) + copy.range = this.range.slice(); + return copy; + } +}; + +// node_modules/yaml/browser/dist/visit.js +var BREAK = Symbol("break visit"); +var SKIP = Symbol("skip children"); +var REMOVE = Symbol("remove node"); +function visit(node, visitor) { + const visitor_ = initVisitor(visitor); + if (isDocument(node)) { + const cd = visit_(null, node.contents, visitor_, Object.freeze([node])); + if (cd === REMOVE) + node.contents = null; + } else + visit_(null, node, visitor_, Object.freeze([])); +} +visit.BREAK = BREAK; +visit.SKIP = SKIP; +visit.REMOVE = REMOVE; +function visit_(key, node, visitor, path) { + const ctrl = callVisitor(key, node, visitor, path); + if (isNode(ctrl) || isPair(ctrl)) { + replaceNode(key, path, ctrl); + return visit_(key, ctrl, visitor, path); + } + if (typeof ctrl !== "symbol") { + if (isCollection(node)) { + path = Object.freeze(path.concat(node)); + for (let i4 = 0; i4 < node.items.length; ++i4) { + const ci = visit_(i4, node.items[i4], visitor, path); + if (typeof ci === "number") + i4 = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + node.items.splice(i4, 1); + i4 -= 1; + } + } + } else if (isPair(node)) { + path = Object.freeze(path.concat(node)); + const ck = visit_("key", node.key, visitor, path); + if (ck === BREAK) + return BREAK; + else if (ck === REMOVE) + node.key = null; + const cv = visit_("value", node.value, visitor, path); + if (cv === BREAK) + return BREAK; + else if (cv === REMOVE) + node.value = null; + } + } + return ctrl; +} +function visitAsync(node, visitor) { + return __async(this, null, function* () { + const visitor_ = initVisitor(visitor); + if (isDocument(node)) { + const cd = yield visitAsync_(null, node.contents, visitor_, Object.freeze([node])); + if (cd === REMOVE) + node.contents = null; + } else + yield visitAsync_(null, node, visitor_, Object.freeze([])); + }); +} +visitAsync.BREAK = BREAK; +visitAsync.SKIP = SKIP; +visitAsync.REMOVE = REMOVE; +function visitAsync_(key, node, visitor, path) { + return __async(this, null, function* () { + const ctrl = yield callVisitor(key, node, visitor, path); + if (isNode(ctrl) || isPair(ctrl)) { + replaceNode(key, path, ctrl); + return visitAsync_(key, ctrl, visitor, path); + } + if (typeof ctrl !== "symbol") { + if (isCollection(node)) { + path = Object.freeze(path.concat(node)); + for (let i4 = 0; i4 < node.items.length; ++i4) { + const ci = yield visitAsync_(i4, node.items[i4], visitor, path); + if (typeof ci === "number") + i4 = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + node.items.splice(i4, 1); + i4 -= 1; + } + } + } else if (isPair(node)) { + path = Object.freeze(path.concat(node)); + const ck = yield visitAsync_("key", node.key, visitor, path); + if (ck === BREAK) + return BREAK; + else if (ck === REMOVE) + node.key = null; + const cv = yield visitAsync_("value", node.value, visitor, path); + if (cv === BREAK) + return BREAK; + else if (cv === REMOVE) + node.value = null; + } + } + return ctrl; + }); +} +function initVisitor(visitor) { + if (typeof visitor === "object" && (visitor.Collection || visitor.Node || visitor.Value)) { + return Object.assign({ + Alias: visitor.Node, + Map: visitor.Node, + Scalar: visitor.Node, + Seq: visitor.Node + }, visitor.Value && { + Map: visitor.Value, + Scalar: visitor.Value, + Seq: visitor.Value + }, visitor.Collection && { + Map: visitor.Collection, + Seq: visitor.Collection + }, visitor); + } + return visitor; +} +function callVisitor(key, node, visitor, path) { + var _a, _b, _c, _d, _e; + if (typeof visitor === "function") + return visitor(key, node, path); + if (isMap(node)) + return (_a = visitor.Map) == null ? void 0 : _a.call(visitor, key, node, path); + if (isSeq(node)) + return (_b = visitor.Seq) == null ? void 0 : _b.call(visitor, key, node, path); + if (isPair(node)) + return (_c = visitor.Pair) == null ? void 0 : _c.call(visitor, key, node, path); + if (isScalar(node)) + return (_d = visitor.Scalar) == null ? void 0 : _d.call(visitor, key, node, path); + if (isAlias(node)) + return (_e = visitor.Alias) == null ? void 0 : _e.call(visitor, key, node, path); + return void 0; +} +function replaceNode(key, path, node) { + const parent = path[path.length - 1]; + if (isCollection(parent)) { + parent.items[key] = node; + } else if (isPair(parent)) { + if (key === "key") + parent.key = node; + else + parent.value = node; + } else if (isDocument(parent)) { + parent.contents = node; + } else { + const pt = isAlias(parent) ? "alias" : "scalar"; + throw new Error(`Cannot replace node with ${pt} parent`); + } +} + +// node_modules/yaml/browser/dist/doc/directives.js +var escapeChars = { + "!": "%21", + ",": "%2C", + "[": "%5B", + "]": "%5D", + "{": "%7B", + "}": "%7D" +}; +var escapeTagName = (tn) => tn.replace(/[!,[\]{}]/g, (ch) => escapeChars[ch]); +var Directives = class { + constructor(yaml, tags) { + this.docStart = null; + this.docEnd = false; + this.yaml = Object.assign({}, Directives.defaultYaml, yaml); + this.tags = Object.assign({}, Directives.defaultTags, tags); + } + clone() { + const copy = new Directives(this.yaml, this.tags); + copy.docStart = this.docStart; + return copy; + } + atDocument() { + const res = new Directives(this.yaml, this.tags); + switch (this.yaml.version) { + case "1.1": + this.atNextDocument = true; + break; + case "1.2": + this.atNextDocument = false; + this.yaml = { + explicit: Directives.defaultYaml.explicit, + version: "1.2" + }; + this.tags = Object.assign({}, Directives.defaultTags); + break; + } + return res; + } + add(line, onError) { + if (this.atNextDocument) { + this.yaml = { explicit: Directives.defaultYaml.explicit, version: "1.1" }; + this.tags = Object.assign({}, Directives.defaultTags); + this.atNextDocument = false; + } + const parts = line.trim().split(/[ \t]+/); + const name = parts.shift(); + switch (name) { + case "%TAG": { + if (parts.length !== 2) { + onError(0, "%TAG directive should contain exactly two parts"); + if (parts.length < 2) + return false; + } + const [handle, prefix] = parts; + this.tags[handle] = prefix; + return true; + } + case "%YAML": { + this.yaml.explicit = true; + if (parts.length !== 1) { + onError(0, "%YAML directive should contain exactly one part"); + return false; + } + const [version] = parts; + if (version === "1.1" || version === "1.2") { + this.yaml.version = version; + return true; + } else { + const isValid = /^\d+\.\d+$/.test(version); + onError(6, `Unsupported YAML version ${version}`, isValid); + return false; + } + } + default: + onError(0, `Unknown directive ${name}`, true); + return false; + } + } + tagName(source, onError) { + if (source === "!") + return "!"; + if (source[0] !== "!") { + onError(`Not a valid tag: ${source}`); + return null; + } + if (source[1] === "<") { + const verbatim = source.slice(2, -1); + if (verbatim === "!" || verbatim === "!!") { + onError(`Verbatim tags aren't resolved, so ${source} is invalid.`); + return null; + } + if (source[source.length - 1] !== ">") + onError("Verbatim tags must end with a >"); + return verbatim; + } + const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/); + if (!suffix) + onError(`The ${source} tag has no suffix`); + const prefix = this.tags[handle]; + if (prefix) + return prefix + decodeURIComponent(suffix); + if (handle === "!") + return source; + onError(`Could not resolve tag: ${source}`); + return null; + } + tagString(tag) { + for (const [handle, prefix] of Object.entries(this.tags)) { + if (tag.startsWith(prefix)) + return handle + escapeTagName(tag.substring(prefix.length)); + } + return tag[0] === "!" ? tag : `!<${tag}>`; + } + toString(doc) { + const lines = this.yaml.explicit ? [`%YAML ${this.yaml.version || "1.2"}`] : []; + const tagEntries = Object.entries(this.tags); + let tagNames; + if (doc && tagEntries.length > 0 && isNode(doc.contents)) { + const tags = {}; + visit(doc.contents, (_key, node) => { + if (isNode(node) && node.tag) + tags[node.tag] = true; + }); + tagNames = Object.keys(tags); + } else + tagNames = []; + for (const [handle, prefix] of tagEntries) { + if (handle === "!!" && prefix === "tag:yaml.org,2002:") + continue; + if (!doc || tagNames.some((tn) => tn.startsWith(prefix))) + lines.push(`%TAG ${handle} ${prefix}`); + } + return lines.join("\n"); + } +}; +Directives.defaultYaml = { explicit: false, version: "1.2" }; +Directives.defaultTags = { "!!": "tag:yaml.org,2002:" }; + +// node_modules/yaml/browser/dist/doc/anchors.js +function anchorIsValid(anchor) { + if (/[\x00-\x19\s,[\]{}]/.test(anchor)) { + const sa = JSON.stringify(anchor); + const msg = `Anchor must not contain whitespace or control characters: ${sa}`; + throw new Error(msg); + } + return true; +} +function anchorNames(root) { + const anchors = /* @__PURE__ */ new Set(); + visit(root, { + Value(_key, node) { + if (node.anchor) + anchors.add(node.anchor); + } + }); + return anchors; +} +function findNewAnchor(prefix, exclude) { + for (let i4 = 1; true; ++i4) { + const name = `${prefix}${i4}`; + if (!exclude.has(name)) + return name; + } +} +function createNodeAnchors(doc, prefix) { + const aliasObjects = []; + const sourceObjects = /* @__PURE__ */ new Map(); + let prevAnchors = null; + return { + onAnchor: (source) => { + aliasObjects.push(source); + if (!prevAnchors) + prevAnchors = anchorNames(doc); + const anchor = findNewAnchor(prefix, prevAnchors); + prevAnchors.add(anchor); + return anchor; + }, + setAnchors: () => { + for (const source of aliasObjects) { + const ref = sourceObjects.get(source); + if (typeof ref === "object" && ref.anchor && (isScalar(ref.node) || isCollection(ref.node))) { + ref.node.anchor = ref.anchor; + } else { + const error = new Error("Failed to resolve repeated object (this should not happen)"); + error.source = source; + throw error; + } + } + }, + sourceObjects + }; +} + +// node_modules/yaml/browser/dist/nodes/Alias.js +var Alias = class extends NodeBase { + constructor(source) { + super(ALIAS); + this.source = source; + Object.defineProperty(this, "tag", { + set() { + throw new Error("Alias nodes cannot have tags"); + } + }); + } + resolve(doc) { + let found = void 0; + visit(doc, { + Node: (_key, node) => { + if (node === this) + return visit.BREAK; + if (node.anchor === this.source) + found = node; + } + }); + return found; + } + toJSON(_arg, ctx) { + if (!ctx) + return { source: this.source }; + const { anchors, doc, maxAliasCount } = ctx; + const source = this.resolve(doc); + if (!source) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new ReferenceError(msg); + } + const data = anchors.get(source); + if (!data || data.res === void 0) { + const msg = "This should not happen: Alias anchor was not resolved?"; + throw new ReferenceError(msg); + } + if (maxAliasCount >= 0) { + data.count += 1; + if (data.aliasCount === 0) + data.aliasCount = getAliasCount(doc, source, anchors); + if (data.count * data.aliasCount > maxAliasCount) { + const msg = "Excessive alias count indicates a resource exhaustion attack"; + throw new ReferenceError(msg); + } + } + return data.res; + } + toString(ctx, _onComment, _onChompKeep) { + const src = `*${this.source}`; + if (ctx) { + anchorIsValid(this.source); + if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new Error(msg); + } + if (ctx.implicitKey) + return `${src} `; + } + return src; + } +}; +function getAliasCount(doc, node, anchors) { + if (isAlias(node)) { + const source = node.resolve(doc); + const anchor = anchors && source && anchors.get(source); + return anchor ? anchor.count * anchor.aliasCount : 0; + } else if (isCollection(node)) { + let count = 0; + for (const item of node.items) { + const c3 = getAliasCount(doc, item, anchors); + if (c3 > count) + count = c3; + } + return count; + } else if (isPair(node)) { + const kc = getAliasCount(doc, node.key, anchors); + const vc = getAliasCount(doc, node.value, anchors); + return Math.max(kc, vc); + } + return 1; +} + +// node_modules/yaml/browser/dist/nodes/toJS.js +function toJS(value, arg, ctx) { + if (Array.isArray(value)) + return value.map((v2, i4) => toJS(v2, String(i4), ctx)); + if (value && typeof value.toJSON === "function") { + if (!ctx || !hasAnchor(value)) + return value.toJSON(arg, ctx); + const data = { aliasCount: 0, count: 1, res: void 0 }; + ctx.anchors.set(value, data); + ctx.onCreate = (res2) => { + data.res = res2; + delete ctx.onCreate; + }; + const res = value.toJSON(arg, ctx); + if (ctx.onCreate) + ctx.onCreate(res); + return res; + } + if (typeof value === "bigint" && !(ctx == null ? void 0 : ctx.keep)) + return Number(value); + return value; +} + +// node_modules/yaml/browser/dist/nodes/Scalar.js +var isScalarValue = (value) => !value || typeof value !== "function" && typeof value !== "object"; +var Scalar = class extends NodeBase { + constructor(value) { + super(SCALAR); + this.value = value; + } + toJSON(arg, ctx) { + return (ctx == null ? void 0 : ctx.keep) ? this.value : toJS(this.value, arg, ctx); + } + toString() { + return String(this.value); + } +}; +Scalar.BLOCK_FOLDED = "BLOCK_FOLDED"; +Scalar.BLOCK_LITERAL = "BLOCK_LITERAL"; +Scalar.PLAIN = "PLAIN"; +Scalar.QUOTE_DOUBLE = "QUOTE_DOUBLE"; +Scalar.QUOTE_SINGLE = "QUOTE_SINGLE"; + +// node_modules/yaml/browser/dist/doc/createNode.js +var defaultTagPrefix = "tag:yaml.org,2002:"; +function findTagObject(value, tagName, tags) { + var _a; + if (tagName) { + const match = tags.filter((t3) => t3.tag === tagName); + const tagObj = (_a = match.find((t3) => !t3.format)) != null ? _a : match[0]; + if (!tagObj) + throw new Error(`Tag ${tagName} not found`); + return tagObj; + } + return tags.find((t3) => { + var _a2; + return ((_a2 = t3.identify) == null ? void 0 : _a2.call(t3, value)) && !t3.format; + }); +} +function createNode(value, tagName, ctx) { + var _a, _b; + if (isDocument(value)) + value = value.contents; + if (isNode(value)) + return value; + if (isPair(value)) { + const map2 = (_b = (_a = ctx.schema[MAP]).createNode) == null ? void 0 : _b.call(_a, ctx.schema, null, ctx); + map2.items.push(value); + return map2; + } + if (value instanceof String || value instanceof Number || value instanceof Boolean || typeof BigInt === "function" && value instanceof BigInt) { + value = value.valueOf(); + } + const { aliasDuplicateObjects, onAnchor, onTagObj, schema: schema4, sourceObjects } = ctx; + let ref = void 0; + if (aliasDuplicateObjects && value && typeof value === "object") { + ref = sourceObjects.get(value); + if (ref) { + if (!ref.anchor) + ref.anchor = onAnchor(value); + return new Alias(ref.anchor); + } else { + ref = { anchor: null, node: null }; + sourceObjects.set(value, ref); + } + } + if (tagName == null ? void 0 : tagName.startsWith("!!")) + tagName = defaultTagPrefix + tagName.slice(2); + let tagObj = findTagObject(value, tagName, schema4.tags); + if (!tagObj) { + if (value && typeof value.toJSON === "function") { + value = value.toJSON(); + } + if (!value || typeof value !== "object") { + const node2 = new Scalar(value); + if (ref) + ref.node = node2; + return node2; + } + tagObj = value instanceof Map ? schema4[MAP] : Symbol.iterator in Object(value) ? schema4[SEQ] : schema4[MAP]; + } + if (onTagObj) { + onTagObj(tagObj); + delete ctx.onTagObj; + } + const node = (tagObj == null ? void 0 : tagObj.createNode) ? tagObj.createNode(ctx.schema, value, ctx) : new Scalar(value); + if (tagName) + node.tag = tagName; + if (ref) + ref.node = node; + return node; +} + +// node_modules/yaml/browser/dist/nodes/Collection.js +function collectionFromPath(schema4, path, value) { + let v2 = value; + for (let i4 = path.length - 1; i4 >= 0; --i4) { + const k2 = path[i4]; + if (typeof k2 === "number" && Number.isInteger(k2) && k2 >= 0) { + const a3 = []; + a3[k2] = v2; + v2 = a3; + } else { + v2 = /* @__PURE__ */ new Map([[k2, v2]]); + } + } + return createNode(v2, void 0, { + aliasDuplicateObjects: false, + keepUndefined: false, + onAnchor: () => { + throw new Error("This should not happen, please report a bug."); + }, + schema: schema4, + sourceObjects: /* @__PURE__ */ new Map() + }); +} +var isEmptyPath = (path) => path == null || typeof path === "object" && !!path[Symbol.iterator]().next().done; +var Collection = class extends NodeBase { + constructor(type, schema4) { + super(type); + Object.defineProperty(this, "schema", { + value: schema4, + configurable: true, + enumerable: false, + writable: true + }); + } + clone(schema4) { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (schema4) + copy.schema = schema4; + copy.items = copy.items.map((it) => isNode(it) || isPair(it) ? it.clone(schema4) : it); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + addIn(path, value) { + if (isEmptyPath(path)) + this.add(value); + else { + const [key, ...rest] = path; + const node = this.get(key, true); + if (isCollection(node)) + node.addIn(rest, value); + else if (node === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } + deleteIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.delete(key); + const node = this.get(key, true); + if (isCollection(node)) + return node.deleteIn(rest); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + getIn(path, keepScalar) { + const [key, ...rest] = path; + const node = this.get(key, true); + if (rest.length === 0) + return !keepScalar && isScalar(node) ? node.value : node; + else + return isCollection(node) ? node.getIn(rest, keepScalar) : void 0; + } + hasAllNullValues(allowScalar) { + return this.items.every((node) => { + if (!isPair(node)) + return false; + const n6 = node.value; + return n6 == null || allowScalar && isScalar(n6) && n6.value == null && !n6.commentBefore && !n6.comment && !n6.tag; + }); + } + hasIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.has(key); + const node = this.get(key, true); + return isCollection(node) ? node.hasIn(rest) : false; + } + setIn(path, value) { + const [key, ...rest] = path; + if (rest.length === 0) { + this.set(key, value); + } else { + const node = this.get(key, true); + if (isCollection(node)) + node.setIn(rest, value); + else if (node === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } +}; +Collection.maxFlowStringSingleLineLength = 60; + +// node_modules/yaml/browser/dist/stringify/stringifyComment.js +var stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#"); +function indentComment(comment, indent) { + if (/^\n+$/.test(comment)) + return comment.substring(1); + return indent ? comment.replace(/^(?! *$)/gm, indent) : comment; +} +var lineComment = (str, indent, comment) => str.endsWith("\n") ? indentComment(comment, indent) : comment.includes("\n") ? "\n" + indentComment(comment, indent) : (str.endsWith(" ") ? "" : " ") + comment; + +// node_modules/yaml/browser/dist/stringify/foldFlowLines.js +var FOLD_FLOW = "flow"; +var FOLD_BLOCK = "block"; +var FOLD_QUOTED = "quoted"; +function foldFlowLines(text, indent, mode = "flow", { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) { + if (!lineWidth || lineWidth < 0) + return text; + const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length); + if (text.length <= endStep) + return text; + const folds = []; + const escapedFolds = {}; + let end = lineWidth - indent.length; + if (typeof indentAtStart === "number") { + if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) + folds.push(0); + else + end = lineWidth - indentAtStart; + } + let split = void 0; + let prev = void 0; + let overflow = false; + let i4 = -1; + let escStart = -1; + let escEnd = -1; + if (mode === FOLD_BLOCK) { + i4 = consumeMoreIndentedLines(text, i4); + if (i4 !== -1) + end = i4 + endStep; + } + for (let ch; ch = text[i4 += 1]; ) { + if (mode === FOLD_QUOTED && ch === "\\") { + escStart = i4; + switch (text[i4 + 1]) { + case "x": + i4 += 3; + break; + case "u": + i4 += 5; + break; + case "U": + i4 += 9; + break; + default: + i4 += 1; + } + escEnd = i4; + } + if (ch === "\n") { + if (mode === FOLD_BLOCK) + i4 = consumeMoreIndentedLines(text, i4); + end = i4 + endStep; + split = void 0; + } else { + if (ch === " " && prev && prev !== " " && prev !== "\n" && prev !== " ") { + const next = text[i4 + 1]; + if (next && next !== " " && next !== "\n" && next !== " ") + split = i4; + } + if (i4 >= end) { + if (split) { + folds.push(split); + end = split + endStep; + split = void 0; + } else if (mode === FOLD_QUOTED) { + while (prev === " " || prev === " ") { + prev = ch; + ch = text[i4 += 1]; + overflow = true; + } + const j = i4 > escEnd + 1 ? i4 - 2 : escStart - 1; + if (escapedFolds[j]) + return text; + folds.push(j); + escapedFolds[j] = true; + end = j + endStep; + split = void 0; + } else { + overflow = true; + } + } + } + prev = ch; + } + if (overflow && onOverflow) + onOverflow(); + if (folds.length === 0) + return text; + if (onFold) + onFold(); + let res = text.slice(0, folds[0]); + for (let i5 = 0; i5 < folds.length; ++i5) { + const fold = folds[i5]; + const end2 = folds[i5 + 1] || text.length; + if (fold === 0) + res = ` +${indent}${text.slice(0, end2)}`; + else { + if (mode === FOLD_QUOTED && escapedFolds[fold]) + res += `${text[fold]}\\`; + res += ` +${indent}${text.slice(fold + 1, end2)}`; + } + } + return res; +} +function consumeMoreIndentedLines(text, i4) { + let ch = text[i4 + 1]; + while (ch === " " || ch === " ") { + do { + ch = text[i4 += 1]; + } while (ch && ch !== "\n"); + ch = text[i4 + 1]; + } + return i4; +} + +// node_modules/yaml/browser/dist/stringify/stringifyString.js +var getFoldOptions = (ctx) => ({ + indentAtStart: ctx.indentAtStart, + lineWidth: ctx.options.lineWidth, + minContentWidth: ctx.options.minContentWidth +}); +var containsDocumentMarker = (str) => /^(%|---|\.\.\.)/m.test(str); +function lineLengthOverLimit(str, lineWidth, indentLength) { + if (!lineWidth || lineWidth < 0) + return false; + const limit = lineWidth - indentLength; + const strLen = str.length; + if (strLen <= limit) + return false; + for (let i4 = 0, start = 0; i4 < strLen; ++i4) { + if (str[i4] === "\n") { + if (i4 - start > limit) + return true; + start = i4 + 1; + if (strLen - start <= limit) + return false; + } + } + return true; +} +function doubleQuotedString(value, ctx) { + const json = JSON.stringify(value); + if (ctx.options.doubleQuotedAsJSON) + return json; + const { implicitKey } = ctx; + const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength; + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + let str = ""; + let start = 0; + for (let i4 = 0, ch = json[i4]; ch; ch = json[++i4]) { + if (ch === " " && json[i4 + 1] === "\\" && json[i4 + 2] === "n") { + str += json.slice(start, i4) + "\\ "; + i4 += 1; + start = i4; + ch = "\\"; + } + if (ch === "\\") + switch (json[i4 + 1]) { + case "u": + { + str += json.slice(start, i4); + const code = json.substr(i4 + 2, 4); + switch (code) { + case "0000": + str += "\\0"; + break; + case "0007": + str += "\\a"; + break; + case "000b": + str += "\\v"; + break; + case "001b": + str += "\\e"; + break; + case "0085": + str += "\\N"; + break; + case "00a0": + str += "\\_"; + break; + case "2028": + str += "\\L"; + break; + case "2029": + str += "\\P"; + break; + default: + if (code.substr(0, 2) === "00") + str += "\\x" + code.substr(2); + else + str += json.substr(i4, 6); + } + i4 += 5; + start = i4 + 1; + } + break; + case "n": + if (implicitKey || json[i4 + 2] === '"' || json.length < minMultiLineLength) { + i4 += 1; + } else { + str += json.slice(start, i4) + "\n\n"; + while (json[i4 + 2] === "\\" && json[i4 + 3] === "n" && json[i4 + 4] !== '"') { + str += "\n"; + i4 += 2; + } + str += indent; + if (json[i4 + 2] === " ") + str += "\\"; + i4 += 1; + start = i4 + 1; + } + break; + default: + i4 += 1; + } + } + str = start ? str + json.slice(start) : json; + return implicitKey ? str : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx)); +} +function singleQuotedString(value, ctx) { + if (ctx.options.singleQuote === false || ctx.implicitKey && value.includes("\n") || /[ \t]\n|\n[ \t]/.test(value)) + return doubleQuotedString(value, ctx); + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + const res = "'" + value.replace(/'/g, "''").replace(/\n+/g, `$& +${indent}`) + "'"; + return ctx.implicitKey ? res : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx)); +} +function quotedString(value, ctx) { + const { singleQuote } = ctx.options; + let qs; + if (singleQuote === false) + qs = doubleQuotedString; + else { + const hasDouble = value.includes('"'); + const hasSingle = value.includes("'"); + if (hasDouble && !hasSingle) + qs = singleQuotedString; + else if (hasSingle && !hasDouble) + qs = doubleQuotedString; + else + qs = singleQuote ? singleQuotedString : doubleQuotedString; + } + return qs(value, ctx); +} +function blockString({ comment, type, value }, ctx, onComment, onChompKeep) { + const { blockQuote, commentString, lineWidth } = ctx.options; + if (!blockQuote || /\n[\t ]+$/.test(value) || /^\s*$/.test(value)) { + return quotedString(value, ctx); + } + const indent = ctx.indent || (ctx.forceBlockIndent || containsDocumentMarker(value) ? " " : ""); + const literal = blockQuote === "literal" ? true : blockQuote === "folded" || type === Scalar.BLOCK_FOLDED ? false : type === Scalar.BLOCK_LITERAL ? true : !lineLengthOverLimit(value, lineWidth, indent.length); + if (!value) + return literal ? "|\n" : ">\n"; + let chomp; + let endStart; + for (endStart = value.length; endStart > 0; --endStart) { + const ch = value[endStart - 1]; + if (ch !== "\n" && ch !== " " && ch !== " ") + break; + } + let end = value.substring(endStart); + const endNlPos = end.indexOf("\n"); + if (endNlPos === -1) { + chomp = "-"; + } else if (value === end || endNlPos !== end.length - 1) { + chomp = "+"; + if (onChompKeep) + onChompKeep(); + } else { + chomp = ""; + } + if (end) { + value = value.slice(0, -end.length); + if (end[end.length - 1] === "\n") + end = end.slice(0, -1); + end = end.replace(/\n+(?!\n|$)/g, `$&${indent}`); + } + let startWithSpace = false; + let startEnd; + let startNlPos = -1; + for (startEnd = 0; startEnd < value.length; ++startEnd) { + const ch = value[startEnd]; + if (ch === " ") + startWithSpace = true; + else if (ch === "\n") + startNlPos = startEnd; + else + break; + } + let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd); + if (start) { + value = value.substring(start.length); + start = start.replace(/\n+/g, `$&${indent}`); + } + const indentSize = indent ? "2" : "1"; + let header = (literal ? "|" : ">") + (startWithSpace ? indentSize : "") + chomp; + if (comment) { + header += " " + commentString(comment.replace(/ ?[\r\n]+/g, " ")); + if (onComment) + onComment(); + } + if (literal) { + value = value.replace(/\n+/g, `$&${indent}`); + return `${header} +${indent}${start}${value}${end}`; + } + value = value.replace(/\n+/g, "\n$&").replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, "$1$2").replace(/\n+/g, `$&${indent}`); + const body = foldFlowLines(`${start}${value}${end}`, indent, FOLD_BLOCK, getFoldOptions(ctx)); + return `${header} +${indent}${body}`; +} +function plainString(item, ctx, onComment, onChompKeep) { + const { type, value } = item; + const { actualString, implicitKey, indent, inFlow } = ctx; + if (implicitKey && /[\n[\]{},]/.test(value) || inFlow && /[[\]{},]/.test(value)) { + return quotedString(value, ctx); + } + if (!value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) { + return implicitKey || inFlow || !value.includes("\n") ? quotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep); + } + if (!implicitKey && !inFlow && type !== Scalar.PLAIN && value.includes("\n")) { + return blockString(item, ctx, onComment, onChompKeep); + } + if (indent === "" && containsDocumentMarker(value)) { + ctx.forceBlockIndent = true; + return blockString(item, ctx, onComment, onChompKeep); + } + const str = value.replace(/\n+/g, `$& +${indent}`); + if (actualString) { + const test = (tag) => { + var _a; + return tag.default && tag.tag !== "tag:yaml.org,2002:str" && ((_a = tag.test) == null ? void 0 : _a.test(str)); + }; + const { compat, tags } = ctx.doc.schema; + if (tags.some(test) || (compat == null ? void 0 : compat.some(test))) + return quotedString(value, ctx); + } + return implicitKey ? str : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx)); +} +function stringifyString(item, ctx, onComment, onChompKeep) { + const { implicitKey, inFlow } = ctx; + const ss = typeof item.value === "string" ? item : Object.assign({}, item, { value: String(item.value) }); + let { type } = item; + if (type !== Scalar.QUOTE_DOUBLE) { + if (/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value)) + type = Scalar.QUOTE_DOUBLE; + } + const _stringify = (_type) => { + switch (_type) { + case Scalar.BLOCK_FOLDED: + case Scalar.BLOCK_LITERAL: + return implicitKey || inFlow ? quotedString(ss.value, ctx) : blockString(ss, ctx, onComment, onChompKeep); + case Scalar.QUOTE_DOUBLE: + return doubleQuotedString(ss.value, ctx); + case Scalar.QUOTE_SINGLE: + return singleQuotedString(ss.value, ctx); + case Scalar.PLAIN: + return plainString(ss, ctx, onComment, onChompKeep); + default: + return null; + } + }; + let res = _stringify(type); + if (res === null) { + const { defaultKeyType, defaultStringType } = ctx.options; + const t3 = implicitKey && defaultKeyType || defaultStringType; + res = _stringify(t3); + if (res === null) + throw new Error(`Unsupported default string type ${t3}`); + } + return res; +} + +// node_modules/yaml/browser/dist/stringify/stringify.js +function createStringifyContext(doc, options) { + const opt = Object.assign({ + blockQuote: true, + commentString: stringifyComment, + defaultKeyType: null, + defaultStringType: "PLAIN", + directives: null, + doubleQuotedAsJSON: false, + doubleQuotedMinMultiLineLength: 40, + falseStr: "false", + indentSeq: true, + lineWidth: 80, + minContentWidth: 20, + nullStr: "null", + simpleKeys: false, + singleQuote: null, + trueStr: "true", + verifyAliasOrder: true + }, doc.schema.toStringOptions, options); + let inFlow; + switch (opt.collectionStyle) { + case "block": + inFlow = false; + break; + case "flow": + inFlow = true; + break; + default: + inFlow = null; + } + return { + anchors: /* @__PURE__ */ new Set(), + doc, + indent: "", + indentStep: typeof opt.indent === "number" ? " ".repeat(opt.indent) : " ", + inFlow, + options: opt + }; +} +function getTagObject(tags, item) { + var _a, _b, _c, _d; + if (item.tag) { + const match = tags.filter((t3) => t3.tag === item.tag); + if (match.length > 0) + return (_a = match.find((t3) => t3.format === item.format)) != null ? _a : match[0]; + } + let tagObj = void 0; + let obj; + if (isScalar(item)) { + obj = item.value; + const match = tags.filter((t3) => { + var _a2; + return (_a2 = t3.identify) == null ? void 0 : _a2.call(t3, obj); + }); + tagObj = (_b = match.find((t3) => t3.format === item.format)) != null ? _b : match.find((t3) => !t3.format); + } else { + obj = item; + tagObj = tags.find((t3) => t3.nodeClass && obj instanceof t3.nodeClass); + } + if (!tagObj) { + const name = (_d = (_c = obj == null ? void 0 : obj.constructor) == null ? void 0 : _c.name) != null ? _d : typeof obj; + throw new Error(`Tag not resolved for ${name} value`); + } + return tagObj; +} +function stringifyProps(node, tagObj, { anchors, doc }) { + if (!doc.directives) + return ""; + const props = []; + const anchor = (isScalar(node) || isCollection(node)) && node.anchor; + if (anchor && anchorIsValid(anchor)) { + anchors.add(anchor); + props.push(`&${anchor}`); + } + const tag = node.tag ? node.tag : tagObj.default ? null : tagObj.tag; + if (tag) + props.push(doc.directives.tagString(tag)); + return props.join(" "); +} +function stringify(item, ctx, onComment, onChompKeep) { + var _a, _b; + if (isPair(item)) + return item.toString(ctx, onComment, onChompKeep); + if (isAlias(item)) { + if (ctx.doc.directives) + return item.toString(ctx); + if ((_a = ctx.resolvedAliases) == null ? void 0 : _a.has(item)) { + throw new TypeError(`Cannot stringify circular structure without alias nodes`); + } else { + if (ctx.resolvedAliases) + ctx.resolvedAliases.add(item); + else + ctx.resolvedAliases = /* @__PURE__ */ new Set([item]); + item = item.resolve(ctx.doc); + } + } + let tagObj = void 0; + const node = isNode(item) ? item : ctx.doc.createNode(item, { onTagObj: (o6) => tagObj = o6 }); + if (!tagObj) + tagObj = getTagObject(ctx.doc.schema.tags, node); + const props = stringifyProps(node, tagObj, ctx); + if (props.length > 0) + ctx.indentAtStart = ((_b = ctx.indentAtStart) != null ? _b : 0) + props.length + 1; + const str = typeof tagObj.stringify === "function" ? tagObj.stringify(node, ctx, onComment, onChompKeep) : isScalar(node) ? stringifyString(node, ctx, onComment, onChompKeep) : node.toString(ctx, onComment, onChompKeep); + if (!props) + return str; + return isScalar(node) || str[0] === "{" || str[0] === "[" ? `${props} ${str}` : `${props} +${ctx.indent}${str}`; +} + +// node_modules/yaml/browser/dist/stringify/stringifyPair.js +function stringifyPair({ key, value }, ctx, onComment, onChompKeep) { + const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx; + let keyComment = isNode(key) && key.comment || null; + if (simpleKeys) { + if (keyComment) { + throw new Error("With simple keys, key nodes cannot have comments"); + } + if (isCollection(key)) { + const msg = "With simple keys, collection cannot be used as a key value"; + throw new Error(msg); + } + } + let explicitKey = !simpleKeys && (!key || keyComment && value == null && !ctx.inFlow || isCollection(key) || (isScalar(key) ? key.type === Scalar.BLOCK_FOLDED || key.type === Scalar.BLOCK_LITERAL : typeof key === "object")); + ctx = Object.assign({}, ctx, { + allNullValues: false, + implicitKey: !explicitKey && (simpleKeys || !allNullValues), + indent: indent + indentStep + }); + let keyCommentDone = false; + let chompKeep = false; + let str = stringify(key, ctx, () => keyCommentDone = true, () => chompKeep = true); + if (!explicitKey && !ctx.inFlow && str.length > 1024) { + if (simpleKeys) + throw new Error("With simple keys, single line scalar must not span more than 1024 characters"); + explicitKey = true; + } + if (ctx.inFlow) { + if (allNullValues || value == null) { + if (keyCommentDone && onComment) + onComment(); + return str === "" ? "?" : explicitKey ? `? ${str}` : str; + } + } else if (allNullValues && !simpleKeys || value == null && explicitKey) { + str = `? ${str}`; + if (keyComment && !keyCommentDone) { + str += lineComment(str, ctx.indent, commentString(keyComment)); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; + } + if (keyCommentDone) + keyComment = null; + if (explicitKey) { + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + str = `? ${str} +${indent}:`; + } else { + str = `${str}:`; + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + } + let vcb = ""; + let valueComment = null; + if (isNode(value)) { + if (value.spaceBefore) + vcb = "\n"; + if (value.commentBefore) { + const cs = commentString(value.commentBefore); + vcb += ` +${indentComment(cs, ctx.indent)}`; + } + valueComment = value.comment; + } else if (value && typeof value === "object") { + value = doc.createNode(value); + } + ctx.implicitKey = false; + if (!explicitKey && !keyComment && isScalar(value)) + ctx.indentAtStart = str.length + 1; + chompKeep = false; + if (!indentSeq && indentStep.length >= 2 && !ctx.inFlow && !explicitKey && isSeq(value) && !value.flow && !value.tag && !value.anchor) { + ctx.indent = ctx.indent.substr(2); + } + let valueCommentDone = false; + const valueStr = stringify(value, ctx, () => valueCommentDone = true, () => chompKeep = true); + let ws = " "; + if (vcb || keyComment) { + if (valueStr === "" && !ctx.inFlow) + ws = vcb === "\n" ? "\n\n" : vcb; + else + ws = `${vcb} +${ctx.indent}`; + } else if (!explicitKey && isCollection(value)) { + const flow = valueStr[0] === "[" || valueStr[0] === "{"; + if (!flow || valueStr.includes("\n")) + ws = ` +${ctx.indent}`; + } else if (valueStr === "" || valueStr[0] === "\n") + ws = ""; + str += ws + valueStr; + if (ctx.inFlow) { + if (valueCommentDone && onComment) + onComment(); + } else if (valueComment && !valueCommentDone) { + str += lineComment(str, ctx.indent, commentString(valueComment)); + } else if (chompKeep && onChompKeep) { + onChompKeep(); + } + return str; +} + +// node_modules/yaml/browser/dist/log.js +function warn(logLevel, warning) { + if (logLevel === "debug" || logLevel === "warn") { + if (typeof process !== "undefined" && process.emitWarning) + process.emitWarning(warning); + else + console.warn(warning); + } +} + +// node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +var MERGE_KEY = "<<"; +function addPairToJSMap(ctx, map2, { key, value }) { + if ((ctx == null ? void 0 : ctx.doc.schema.merge) && isMergeKey(key)) { + value = isAlias(value) ? value.resolve(ctx.doc) : value; + if (isSeq(value)) + for (const it of value.items) + mergeToJSMap(ctx, map2, it); + else if (Array.isArray(value)) + for (const it of value) + mergeToJSMap(ctx, map2, it); + else + mergeToJSMap(ctx, map2, value); + } else { + const jsKey = toJS(key, "", ctx); + if (map2 instanceof Map) { + map2.set(jsKey, toJS(value, jsKey, ctx)); + } else if (map2 instanceof Set) { + map2.add(jsKey); + } else { + const stringKey = stringifyKey(key, jsKey, ctx); + const jsValue = toJS(value, stringKey, ctx); + if (stringKey in map2) + Object.defineProperty(map2, stringKey, { + value: jsValue, + writable: true, + enumerable: true, + configurable: true + }); + else + map2[stringKey] = jsValue; + } + } + return map2; +} +var isMergeKey = (key) => key === MERGE_KEY || isScalar(key) && key.value === MERGE_KEY && (!key.type || key.type === Scalar.PLAIN); +function mergeToJSMap(ctx, map2, value) { + const source = ctx && isAlias(value) ? value.resolve(ctx.doc) : value; + if (!isMap(source)) + throw new Error("Merge sources must be maps or map aliases"); + const srcMap = source.toJSON(null, ctx, Map); + for (const [key, value2] of srcMap) { + if (map2 instanceof Map) { + if (!map2.has(key)) + map2.set(key, value2); + } else if (map2 instanceof Set) { + map2.add(key); + } else if (!Object.prototype.hasOwnProperty.call(map2, key)) { + Object.defineProperty(map2, key, { + value: value2, + writable: true, + enumerable: true, + configurable: true + }); + } + } + return map2; +} +function stringifyKey(key, jsKey, ctx) { + if (jsKey === null) + return ""; + if (typeof jsKey !== "object") + return String(jsKey); + if (isNode(key) && ctx && ctx.doc) { + const strCtx = createStringifyContext(ctx.doc, {}); + strCtx.anchors = /* @__PURE__ */ new Set(); + for (const node of ctx.anchors.keys()) + strCtx.anchors.add(node.anchor); + strCtx.inFlow = true; + strCtx.inStringifyKey = true; + const strKey = key.toString(strCtx); + if (!ctx.mapKeyWarned) { + let jsonStr = JSON.stringify(strKey); + if (jsonStr.length > 40) + jsonStr = jsonStr.substring(0, 36) + '..."'; + warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`); + ctx.mapKeyWarned = true; + } + return strKey; + } + return JSON.stringify(jsKey); +} + +// node_modules/yaml/browser/dist/nodes/Pair.js +function createPair(key, value, ctx) { + const k2 = createNode(key, void 0, ctx); + const v2 = createNode(value, void 0, ctx); + return new Pair(k2, v2); +} +var Pair = class { + constructor(key, value = null) { + Object.defineProperty(this, NODE_TYPE, { value: PAIR }); + this.key = key; + this.value = value; + } + clone(schema4) { + let { key, value } = this; + if (isNode(key)) + key = key.clone(schema4); + if (isNode(value)) + value = value.clone(schema4); + return new Pair(key, value); + } + toJSON(_2, ctx) { + const pair = (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + return addPairToJSMap(ctx, pair, this); + } + toString(ctx, onComment, onChompKeep) { + return (ctx == null ? void 0 : ctx.doc) ? stringifyPair(this, ctx, onComment, onChompKeep) : JSON.stringify(this); + } +}; + +// node_modules/yaml/browser/dist/stringify/stringifyCollection.js +function stringifyCollection(collection, ctx, options) { + var _a; + const flow = (_a = ctx.inFlow) != null ? _a : collection.flow; + const stringify4 = flow ? stringifyFlowCollection : stringifyBlockCollection; + return stringify4(collection, ctx, options); +} +function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) { + const { indent, options: { commentString } } = ctx; + const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null }); + let chompKeep = false; + const lines = []; + for (let i4 = 0; i4 < items.length; ++i4) { + const item = items[i4]; + let comment2 = null; + if (isNode(item)) { + if (!chompKeep && item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, chompKeep); + if (item.comment) + comment2 = item.comment; + } else if (isPair(item)) { + const ik = isNode(item.key) ? item.key : null; + if (ik) { + if (!chompKeep && ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, chompKeep); + } + } + chompKeep = false; + let str2 = stringify(item, itemCtx, () => comment2 = null, () => chompKeep = true); + if (comment2) + str2 += lineComment(str2, itemIndent, commentString(comment2)); + if (chompKeep && comment2) + chompKeep = false; + lines.push(blockItemPrefix + str2); + } + let str; + if (lines.length === 0) { + str = flowChars.start + flowChars.end; + } else { + str = lines[0]; + for (let i4 = 1; i4 < lines.length; ++i4) { + const line = lines[i4]; + str += line ? ` +${indent}${line}` : "\n"; + } + } + if (comment) { + str += "\n" + indentComment(commentString(comment), indent); + if (onComment) + onComment(); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; +} +function stringifyFlowCollection({ comment, items }, ctx, { flowChars, itemIndent, onComment }) { + const { indent, indentStep, options: { commentString } } = ctx; + itemIndent += indentStep; + const itemCtx = Object.assign({}, ctx, { + indent: itemIndent, + inFlow: true, + type: null + }); + let reqNewline = false; + let linesAtValue = 0; + const lines = []; + for (let i4 = 0; i4 < items.length; ++i4) { + const item = items[i4]; + let comment2 = null; + if (isNode(item)) { + if (item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, false); + if (item.comment) + comment2 = item.comment; + } else if (isPair(item)) { + const ik = isNode(item.key) ? item.key : null; + if (ik) { + if (ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, false); + if (ik.comment) + reqNewline = true; + } + const iv = isNode(item.value) ? item.value : null; + if (iv) { + if (iv.comment) + comment2 = iv.comment; + if (iv.commentBefore) + reqNewline = true; + } else if (item.value == null && ik && ik.comment) { + comment2 = ik.comment; + } + } + if (comment2) + reqNewline = true; + let str2 = stringify(item, itemCtx, () => comment2 = null); + if (i4 < items.length - 1) + str2 += ","; + if (comment2) + str2 += lineComment(str2, itemIndent, commentString(comment2)); + if (!reqNewline && (lines.length > linesAtValue || str2.includes("\n"))) + reqNewline = true; + lines.push(str2); + linesAtValue = lines.length; + } + let str; + const { start, end } = flowChars; + if (lines.length === 0) { + str = start + end; + } else { + if (!reqNewline) { + const len = lines.reduce((sum, line) => sum + line.length + 2, 2); + reqNewline = len > Collection.maxFlowStringSingleLineLength; + } + if (reqNewline) { + str = start; + for (const line of lines) + str += line ? ` +${indentStep}${indent}${line}` : "\n"; + str += ` +${indent}${end}`; + } else { + str = `${start} ${lines.join(" ")} ${end}`; + } + } + if (comment) { + str += lineComment(str, commentString(comment), indent); + if (onComment) + onComment(); + } + return str; +} +function addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) { + if (comment && chompKeep) + comment = comment.replace(/^\n+/, ""); + if (comment) { + const ic = indentComment(commentString(comment), indent); + lines.push(ic.trimStart()); + } +} + +// node_modules/yaml/browser/dist/nodes/YAMLMap.js +function findPair(items, key) { + const k2 = isScalar(key) ? key.value : key; + for (const it of items) { + if (isPair(it)) { + if (it.key === key || it.key === k2) + return it; + if (isScalar(it.key) && it.key.value === k2) + return it; + } + } + return void 0; +} +var YAMLMap = class extends Collection { + constructor(schema4) { + super(MAP, schema4); + this.items = []; + } + static get tagName() { + return "tag:yaml.org,2002:map"; + } + add(pair, overwrite) { + var _a; + let _pair; + if (isPair(pair)) + _pair = pair; + else if (!pair || typeof pair !== "object" || !("key" in pair)) { + _pair = new Pair(pair, pair == null ? void 0 : pair.value); + } else + _pair = new Pair(pair.key, pair.value); + const prev = findPair(this.items, _pair.key); + const sortEntries = (_a = this.schema) == null ? void 0 : _a.sortMapEntries; + if (prev) { + if (!overwrite) + throw new Error(`Key ${_pair.key} already set`); + if (isScalar(prev.value) && isScalarValue(_pair.value)) + prev.value.value = _pair.value; + else + prev.value = _pair.value; + } else if (sortEntries) { + const i4 = this.items.findIndex((item) => sortEntries(_pair, item) < 0); + if (i4 === -1) + this.items.push(_pair); + else + this.items.splice(i4, 0, _pair); + } else { + this.items.push(_pair); + } + } + delete(key) { + const it = findPair(this.items, key); + if (!it) + return false; + const del = this.items.splice(this.items.indexOf(it), 1); + return del.length > 0; + } + get(key, keepScalar) { + var _a; + const it = findPair(this.items, key); + const node = it == null ? void 0 : it.value; + return (_a = !keepScalar && isScalar(node) ? node.value : node) != null ? _a : void 0; + } + has(key) { + return !!findPair(this.items, key); + } + set(key, value) { + this.add(new Pair(key, value), true); + } + toJSON(_2, ctx, Type) { + const map2 = Type ? new Type() : (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map2); + for (const item of this.items) + addPairToJSMap(ctx, map2, item); + return map2; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + for (const item of this.items) { + if (!isPair(item)) + throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`); + } + if (!ctx.allNullValues && this.hasAllNullValues(false)) + ctx = Object.assign({}, ctx, { allNullValues: true }); + return stringifyCollection(this, ctx, { + blockItemPrefix: "", + flowChars: { start: "{", end: "}" }, + itemIndent: ctx.indent || "", + onChompKeep, + onComment + }); + } +}; + +// node_modules/yaml/browser/dist/schema/common/map.js +function createMap(schema4, obj, ctx) { + const { keepUndefined, replacer } = ctx; + const map2 = new YAMLMap(schema4); + const add = (key, value) => { + if (typeof replacer === "function") + value = replacer.call(obj, key, value); + else if (Array.isArray(replacer) && !replacer.includes(key)) + return; + if (value !== void 0 || keepUndefined) + map2.items.push(createPair(key, value, ctx)); + }; + if (obj instanceof Map) { + for (const [key, value] of obj) + add(key, value); + } else if (obj && typeof obj === "object") { + for (const key of Object.keys(obj)) + add(key, obj[key]); + } + if (typeof schema4.sortMapEntries === "function") { + map2.items.sort(schema4.sortMapEntries); + } + return map2; +} +var map = { + collection: "map", + createNode: createMap, + default: true, + nodeClass: YAMLMap, + tag: "tag:yaml.org,2002:map", + resolve(map2, onError) { + if (!isMap(map2)) + onError("Expected a mapping for this tag"); + return map2; + } +}; + +// node_modules/yaml/browser/dist/nodes/YAMLSeq.js +var YAMLSeq = class extends Collection { + constructor(schema4) { + super(SEQ, schema4); + this.items = []; + } + static get tagName() { + return "tag:yaml.org,2002:seq"; + } + add(value) { + this.items.push(value); + } + delete(key) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return false; + const del = this.items.splice(idx, 1); + return del.length > 0; + } + get(key, keepScalar) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return void 0; + const it = this.items[idx]; + return !keepScalar && isScalar(it) ? it.value : it; + } + has(key) { + const idx = asItemIndex(key); + return typeof idx === "number" && idx < this.items.length; + } + set(key, value) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + throw new Error(`Expected a valid index, not ${key}.`); + const prev = this.items[idx]; + if (isScalar(prev) && isScalarValue(value)) + prev.value = value; + else + this.items[idx] = value; + } + toJSON(_2, ctx) { + const seq2 = []; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(seq2); + let i4 = 0; + for (const item of this.items) + seq2.push(toJS(item, String(i4++), ctx)); + return seq2; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + return stringifyCollection(this, ctx, { + blockItemPrefix: "- ", + flowChars: { start: "[", end: "]" }, + itemIndent: (ctx.indent || "") + " ", + onChompKeep, + onComment + }); + } +}; +function asItemIndex(key) { + let idx = isScalar(key) ? key.value : key; + if (idx && typeof idx === "string") + idx = Number(idx); + return typeof idx === "number" && Number.isInteger(idx) && idx >= 0 ? idx : null; +} + +// node_modules/yaml/browser/dist/schema/common/seq.js +function createSeq(schema4, obj, ctx) { + const { replacer } = ctx; + const seq2 = new YAMLSeq(schema4); + if (obj && Symbol.iterator in Object(obj)) { + let i4 = 0; + for (let it of obj) { + if (typeof replacer === "function") { + const key = obj instanceof Set ? it : String(i4++); + it = replacer.call(obj, key, it); + } + seq2.items.push(createNode(it, void 0, ctx)); + } + } + return seq2; +} +var seq = { + collection: "seq", + createNode: createSeq, + default: true, + nodeClass: YAMLSeq, + tag: "tag:yaml.org,2002:seq", + resolve(seq2, onError) { + if (!isSeq(seq2)) + onError("Expected a sequence for this tag"); + return seq2; + } +}; + +// node_modules/yaml/browser/dist/schema/common/string.js +var string = { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify(item, ctx, onComment, onChompKeep) { + ctx = Object.assign({ actualString: true }, ctx); + return stringifyString(item, ctx, onComment, onChompKeep); + } +}; + +// node_modules/yaml/browser/dist/schema/common/null.js +var nullTag = { + identify: (value) => value == null, + createNode: () => new Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^(?:~|[Nn]ull|NULL)?$/, + resolve: () => new Scalar(null), + stringify: ({ source }, ctx) => typeof source === "string" && nullTag.test.test(source) ? source : ctx.options.nullStr +}; + +// node_modules/yaml/browser/dist/schema/core/bool.js +var boolTag = { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/, + resolve: (str) => new Scalar(str[0] === "t" || str[0] === "T"), + stringify({ source, value }, ctx) { + if (source && boolTag.test.test(source)) { + const sv = source[0] === "t" || source[0] === "T"; + if (value === sv) + return source; + } + return value ? ctx.options.trueStr : ctx.options.falseStr; + } +}; + +// node_modules/yaml/browser/dist/stringify/stringifyNumber.js +function stringifyNumber({ format, minFractionDigits, tag, value }) { + if (typeof value === "bigint") + return String(value); + const num = typeof value === "number" ? value : Number(value); + if (!isFinite(num)) + return isNaN(num) ? ".nan" : num < 0 ? "-.inf" : ".inf"; + let n6 = JSON.stringify(value); + if (!format && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") && /^\d/.test(n6)) { + let i4 = n6.indexOf("."); + if (i4 < 0) { + i4 = n6.length; + n6 += "."; + } + let d3 = minFractionDigits - (n6.length - i4 - 1); + while (d3-- > 0) + n6 += "0"; + } + return n6; +} + +// node_modules/yaml/browser/dist/schema/core/float.js +var floatNaN = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN))$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber +}; +var floatExp = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node); + } +}; +var float = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/, + resolve(str) { + const node = new Scalar(parseFloat(str)); + const dot = str.indexOf("."); + if (dot !== -1 && str[str.length - 1] === "0") + node.minFractionDigits = str.length - dot - 1; + return node; + }, + stringify: stringifyNumber +}; + +// node_modules/yaml/browser/dist/schema/core/int.js +var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value); +var intResolve = (str, offset, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix); +function intStringify(node, radix, prefix) { + const { value } = node; + if (intIdentify(value) && value >= 0) + return prefix + value.toString(radix); + return stringifyNumber(node); +} +var intOct = { + identify: (value) => intIdentify(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^0o[0-7]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 8, opt), + stringify: (node) => intStringify(node, 8, "0o") +}; +var int = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9]+$/, + resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), + stringify: stringifyNumber +}; +var intHex = { + identify: (value) => intIdentify(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^0x[0-9a-fA-F]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), + stringify: (node) => intStringify(node, 16, "0x") +}; + +// node_modules/yaml/browser/dist/schema/core/schema.js +var schema = [ + map, + seq, + string, + nullTag, + boolTag, + intOct, + int, + intHex, + floatNaN, + floatExp, + float +]; + +// node_modules/yaml/browser/dist/schema/json/schema.js +function intIdentify2(value) { + return typeof value === "bigint" || Number.isInteger(value); +} +var stringifyJSON = ({ value }) => JSON.stringify(value); +var jsonScalars = [ + { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify: stringifyJSON + }, + { + identify: (value) => value == null, + createNode: () => new Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^null$/, + resolve: () => null, + stringify: stringifyJSON + }, + { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^true|false$/, + resolve: (str) => str === "true", + stringify: stringifyJSON + }, + { + identify: intIdentify2, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^-?(?:0|[1-9][0-9]*)$/, + resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10), + stringify: ({ value }) => intIdentify2(value) ? value.toString() : JSON.stringify(value) + }, + { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/, + resolve: (str) => parseFloat(str), + stringify: stringifyJSON + } +]; +var jsonError = { + default: true, + tag: "", + test: /^/, + resolve(str, onError) { + onError(`Unresolved plain scalar ${JSON.stringify(str)}`); + return str; + } +}; +var schema2 = [map, seq].concat(jsonScalars, jsonError); + +// node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +var binary = { + identify: (value) => value instanceof Uint8Array, + default: false, + tag: "tag:yaml.org,2002:binary", + resolve(src, onError) { + if (typeof Buffer === "function") { + return Buffer.from(src, "base64"); + } else if (typeof atob === "function") { + const str = atob(src.replace(/[\n\r]/g, "")); + const buffer = new Uint8Array(str.length); + for (let i4 = 0; i4 < str.length; ++i4) + buffer[i4] = str.charCodeAt(i4); + return buffer; + } else { + onError("This environment does not support reading binary tags; either Buffer or atob is required"); + return src; + } + }, + stringify({ comment, type, value }, ctx, onComment, onChompKeep) { + const buf = value; + let str; + if (typeof Buffer === "function") { + str = buf instanceof Buffer ? buf.toString("base64") : Buffer.from(buf.buffer).toString("base64"); + } else if (typeof btoa === "function") { + let s5 = ""; + for (let i4 = 0; i4 < buf.length; ++i4) + s5 += String.fromCharCode(buf[i4]); + str = btoa(s5); + } else { + throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required"); + } + if (!type) + type = Scalar.BLOCK_LITERAL; + if (type !== Scalar.QUOTE_DOUBLE) { + const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth); + const n6 = Math.ceil(str.length / lineWidth); + const lines = new Array(n6); + for (let i4 = 0, o6 = 0; i4 < n6; ++i4, o6 += lineWidth) { + lines[i4] = str.substr(o6, lineWidth); + } + str = lines.join(type === Scalar.BLOCK_LITERAL ? "\n" : " "); + } + return stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep); + } +}; + +// node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +function resolvePairs(seq2, onError) { + var _a; + if (isSeq(seq2)) { + for (let i4 = 0; i4 < seq2.items.length; ++i4) { + let item = seq2.items[i4]; + if (isPair(item)) + continue; + else if (isMap(item)) { + if (item.items.length > 1) + onError("Each pair must have its own sequence indicator"); + const pair = item.items[0] || new Pair(new Scalar(null)); + if (item.commentBefore) + pair.key.commentBefore = pair.key.commentBefore ? `${item.commentBefore} +${pair.key.commentBefore}` : item.commentBefore; + if (item.comment) { + const cn = (_a = pair.value) != null ? _a : pair.key; + cn.comment = cn.comment ? `${item.comment} +${cn.comment}` : item.comment; + } + item = pair; + } + seq2.items[i4] = isPair(item) ? item : new Pair(item); + } + } else + onError("Expected a sequence for this tag"); + return seq2; +} +function createPairs(schema4, iterable, ctx) { + const { replacer } = ctx; + const pairs2 = new YAMLSeq(schema4); + pairs2.tag = "tag:yaml.org,2002:pairs"; + let i4 = 0; + if (iterable && Symbol.iterator in Object(iterable)) + for (let it of iterable) { + if (typeof replacer === "function") + it = replacer.call(iterable, String(i4++), it); + let key, value; + if (Array.isArray(it)) { + if (it.length === 2) { + key = it[0]; + value = it[1]; + } else + throw new TypeError(`Expected [key, value] tuple: ${it}`); + } else if (it && it instanceof Object) { + const keys = Object.keys(it); + if (keys.length === 1) { + key = keys[0]; + value = it[key]; + } else + throw new TypeError(`Expected { key: value } tuple: ${it}`); + } else { + key = it; + } + pairs2.items.push(createPair(key, value, ctx)); + } + return pairs2; +} +var pairs = { + collection: "seq", + default: false, + tag: "tag:yaml.org,2002:pairs", + resolve: resolvePairs, + createNode: createPairs +}; + +// node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +var YAMLOMap = class extends YAMLSeq { + constructor() { + super(); + this.add = YAMLMap.prototype.add.bind(this); + this.delete = YAMLMap.prototype.delete.bind(this); + this.get = YAMLMap.prototype.get.bind(this); + this.has = YAMLMap.prototype.has.bind(this); + this.set = YAMLMap.prototype.set.bind(this); + this.tag = YAMLOMap.tag; + } + toJSON(_2, ctx) { + if (!ctx) + return super.toJSON(_2); + const map2 = /* @__PURE__ */ new Map(); + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map2); + for (const pair of this.items) { + let key, value; + if (isPair(pair)) { + key = toJS(pair.key, "", ctx); + value = toJS(pair.value, key, ctx); + } else { + key = toJS(pair, "", ctx); + } + if (map2.has(key)) + throw new Error("Ordered maps must not include duplicate keys"); + map2.set(key, value); + } + return map2; + } +}; +YAMLOMap.tag = "tag:yaml.org,2002:omap"; +var omap = { + collection: "seq", + identify: (value) => value instanceof Map, + nodeClass: YAMLOMap, + default: false, + tag: "tag:yaml.org,2002:omap", + resolve(seq2, onError) { + const pairs2 = resolvePairs(seq2, onError); + const seenKeys = []; + for (const { key } of pairs2.items) { + if (isScalar(key)) { + if (seenKeys.includes(key.value)) { + onError(`Ordered maps must not include duplicate keys: ${key.value}`); + } else { + seenKeys.push(key.value); + } + } + } + return Object.assign(new YAMLOMap(), pairs2); + }, + createNode(schema4, iterable, ctx) { + const pairs2 = createPairs(schema4, iterable, ctx); + const omap2 = new YAMLOMap(); + omap2.items = pairs2.items; + return omap2; + } +}; + +// node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +function boolStringify({ value, source }, ctx) { + const boolObj = value ? trueTag : falseTag; + if (source && boolObj.test.test(source)) + return source; + return value ? ctx.options.trueStr : ctx.options.falseStr; +} +var trueTag = { + identify: (value) => value === true, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/, + resolve: () => new Scalar(true), + stringify: boolStringify +}; +var falseTag = { + identify: (value) => value === false, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/i, + resolve: () => new Scalar(false), + stringify: boolStringify +}; + +// node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +var floatNaN2 = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber +}; +var floatExp2 = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str.replace(/_/g, "")), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node); + } +}; +var float2 = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/, + resolve(str) { + const node = new Scalar(parseFloat(str.replace(/_/g, ""))); + const dot = str.indexOf("."); + if (dot !== -1) { + const f2 = str.substring(dot + 1).replace(/_/g, ""); + if (f2[f2.length - 1] === "0") + node.minFractionDigits = f2.length; + } + return node; + }, + stringify: stringifyNumber +}; + +// node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +var intIdentify3 = (value) => typeof value === "bigint" || Number.isInteger(value); +function intResolve2(str, offset, radix, { intAsBigInt }) { + const sign = str[0]; + if (sign === "-" || sign === "+") + offset += 1; + str = str.substring(offset).replace(/_/g, ""); + if (intAsBigInt) { + switch (radix) { + case 2: + str = `0b${str}`; + break; + case 8: + str = `0o${str}`; + break; + case 16: + str = `0x${str}`; + break; + } + const n7 = BigInt(str); + return sign === "-" ? BigInt(-1) * n7 : n7; + } + const n6 = parseInt(str, radix); + return sign === "-" ? -1 * n6 : n6; +} +function intStringify2(node, radix, prefix) { + const { value } = node; + if (intIdentify3(value)) { + const str = value.toString(radix); + return value < 0 ? "-" + prefix + str.substr(1) : prefix + str; + } + return stringifyNumber(node); +} +var intBin = { + identify: intIdentify3, + default: true, + tag: "tag:yaml.org,2002:int", + format: "BIN", + test: /^[-+]?0b[0-1_]+$/, + resolve: (str, _onError, opt) => intResolve2(str, 2, 2, opt), + stringify: (node) => intStringify2(node, 2, "0b") +}; +var intOct2 = { + identify: intIdentify3, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^[-+]?0[0-7_]+$/, + resolve: (str, _onError, opt) => intResolve2(str, 1, 8, opt), + stringify: (node) => intStringify2(node, 8, "0") +}; +var int2 = { + identify: intIdentify3, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9][0-9_]*$/, + resolve: (str, _onError, opt) => intResolve2(str, 0, 10, opt), + stringify: stringifyNumber +}; +var intHex2 = { + identify: intIdentify3, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^[-+]?0x[0-9a-fA-F_]+$/, + resolve: (str, _onError, opt) => intResolve2(str, 2, 16, opt), + stringify: (node) => intStringify2(node, 16, "0x") +}; + +// node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +var YAMLSet = class extends YAMLMap { + constructor(schema4) { + super(schema4); + this.tag = YAMLSet.tag; + } + add(key) { + let pair; + if (isPair(key)) + pair = key; + else if (typeof key === "object" && "key" in key && "value" in key && key.value === null) + pair = new Pair(key.key, null); + else + pair = new Pair(key, null); + const prev = findPair(this.items, pair.key); + if (!prev) + this.items.push(pair); + } + get(key, keepPair) { + const pair = findPair(this.items, key); + return !keepPair && isPair(pair) ? isScalar(pair.key) ? pair.key.value : pair.key : pair; + } + set(key, value) { + if (typeof value !== "boolean") + throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`); + const prev = findPair(this.items, key); + if (prev && !value) { + this.items.splice(this.items.indexOf(prev), 1); + } else if (!prev && value) { + this.items.push(new Pair(key)); + } + } + toJSON(_2, ctx) { + return super.toJSON(_2, ctx, Set); + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + if (this.hasAllNullValues(true)) + return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep); + else + throw new Error("Set items must all have null values"); + } +}; +YAMLSet.tag = "tag:yaml.org,2002:set"; +var set = { + collection: "map", + identify: (value) => value instanceof Set, + nodeClass: YAMLSet, + default: false, + tag: "tag:yaml.org,2002:set", + resolve(map2, onError) { + if (isMap(map2)) { + if (map2.hasAllNullValues(true)) + return Object.assign(new YAMLSet(), map2); + else + onError("Set items must all have null values"); + } else + onError("Expected a mapping for this tag"); + return map2; + }, + createNode(schema4, iterable, ctx) { + const { replacer } = ctx; + const set2 = new YAMLSet(schema4); + if (iterable && Symbol.iterator in Object(iterable)) + for (let value of iterable) { + if (typeof replacer === "function") + value = replacer.call(iterable, value, value); + set2.items.push(createPair(value, null, ctx)); + } + return set2; + } +}; + +// node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +function parseSexagesimal(str, asBigInt) { + const sign = str[0]; + const parts = sign === "-" || sign === "+" ? str.substring(1) : str; + const num = (n6) => asBigInt ? BigInt(n6) : Number(n6); + const res = parts.replace(/_/g, "").split(":").reduce((res2, p2) => res2 * num(60) + num(p2), num(0)); + return sign === "-" ? num(-1) * res : res; +} +function stringifySexagesimal(node) { + let { value } = node; + let num = (n6) => n6; + if (typeof value === "bigint") + num = (n6) => BigInt(n6); + else if (isNaN(value) || !isFinite(value)) + return stringifyNumber(node); + let sign = ""; + if (value < 0) { + sign = "-"; + value *= num(-1); + } + const _60 = num(60); + const parts = [value % _60]; + if (value < 60) { + parts.unshift(0); + } else { + value = (value - parts[0]) / _60; + parts.unshift(value % _60); + if (value >= 60) { + value = (value - parts[0]) / _60; + parts.unshift(value); + } + } + return sign + parts.map((n6) => n6 < 10 ? "0" + String(n6) : String(n6)).join(":").replace(/000000\d*$/, ""); +} +var intTime = { + identify: (value) => typeof value === "bigint" || Number.isInteger(value), + default: true, + tag: "tag:yaml.org,2002:int", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/, + resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt), + stringify: stringifySexagesimal +}; +var floatTime = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/, + resolve: (str) => parseSexagesimal(str, false), + stringify: stringifySexagesimal +}; +var timestamp = { + identify: (value) => value instanceof Date, + default: true, + tag: "tag:yaml.org,2002:timestamp", + test: RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"), + resolve(str) { + const match = str.match(timestamp.test); + if (!match) + throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd"); + const [, year, month, day, hour, minute, second] = match.map(Number); + const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0; + let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec); + const tz = match[8]; + if (tz && tz !== "Z") { + let d3 = parseSexagesimal(tz, false); + if (Math.abs(d3) < 30) + d3 *= 60; + date -= 6e4 * d3; + } + return new Date(date); + }, + stringify: ({ value }) => value.toISOString().replace(/((T00:00)?:00)?\.000Z$/, "") +}; + +// node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +var schema3 = [ + map, + seq, + string, + nullTag, + trueTag, + falseTag, + intBin, + intOct2, + int2, + intHex2, + floatNaN2, + floatExp2, + float2, + binary, + omap, + pairs, + set, + intTime, + floatTime, + timestamp +]; + +// node_modules/yaml/browser/dist/schema/tags.js +var schemas = /* @__PURE__ */ new Map([ + ["core", schema], + ["failsafe", [map, seq, string]], + ["json", schema2], + ["yaml11", schema3], + ["yaml-1.1", schema3] +]); +var tagsByName = { + binary, + bool: boolTag, + float, + floatExp, + floatNaN, + floatTime, + int, + intHex, + intOct, + intTime, + map, + null: nullTag, + omap, + pairs, + seq, + set, + timestamp +}; +var coreKnownTags = { + "tag:yaml.org,2002:binary": binary, + "tag:yaml.org,2002:omap": omap, + "tag:yaml.org,2002:pairs": pairs, + "tag:yaml.org,2002:set": set, + "tag:yaml.org,2002:timestamp": timestamp +}; +function getTags(customTags, schemaName) { + let tags = schemas.get(schemaName); + if (!tags) { + if (Array.isArray(customTags)) + tags = []; + else { + const keys = Array.from(schemas.keys()).filter((key) => key !== "yaml11").map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`); + } + } + if (Array.isArray(customTags)) { + for (const tag of customTags) + tags = tags.concat(tag); + } else if (typeof customTags === "function") { + tags = customTags(tags.slice()); + } + return tags.map((tag) => { + if (typeof tag !== "string") + return tag; + const tagObj = tagsByName[tag]; + if (tagObj) + return tagObj; + const keys = Object.keys(tagsByName).map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown custom tag "${tag}"; use one of ${keys}`); + }); +} + +// node_modules/yaml/browser/dist/schema/Schema.js +var sortMapEntriesByKey = (a3, b2) => a3.key < b2.key ? -1 : a3.key > b2.key ? 1 : 0; +var Schema = class { + constructor({ compat, customTags, merge, resolveKnownTags, schema: schema4, sortMapEntries, toStringDefaults }) { + this.compat = Array.isArray(compat) ? getTags(compat, "compat") : compat ? getTags(null, compat) : null; + this.merge = !!merge; + this.name = typeof schema4 === "string" && schema4 || "core"; + this.knownTags = resolveKnownTags ? coreKnownTags : {}; + this.tags = getTags(customTags, this.name); + this.toStringOptions = toStringDefaults != null ? toStringDefaults : null; + Object.defineProperty(this, MAP, { value: map }); + Object.defineProperty(this, SCALAR, { value: string }); + Object.defineProperty(this, SEQ, { value: seq }); + this.sortMapEntries = typeof sortMapEntries === "function" ? sortMapEntries : sortMapEntries === true ? sortMapEntriesByKey : null; + } + clone() { + const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this)); + copy.tags = this.tags.slice(); + return copy; + } +}; + +// node_modules/yaml/browser/dist/stringify/stringifyDocument.js +function stringifyDocument(doc, options) { + var _a; + const lines = []; + let hasDirectives = options.directives === true; + if (options.directives !== false && doc.directives) { + const dir = doc.directives.toString(doc); + if (dir) { + lines.push(dir); + hasDirectives = true; + } else if (doc.directives.docStart) + hasDirectives = true; + } + if (hasDirectives) + lines.push("---"); + const ctx = createStringifyContext(doc, options); + const { commentString } = ctx.options; + if (doc.commentBefore) { + if (lines.length !== 1) + lines.unshift(""); + const cs = commentString(doc.commentBefore); + lines.unshift(indentComment(cs, "")); + } + let chompKeep = false; + let contentComment = null; + if (doc.contents) { + if (isNode(doc.contents)) { + if (doc.contents.spaceBefore && hasDirectives) + lines.push(""); + if (doc.contents.commentBefore) { + const cs = commentString(doc.contents.commentBefore); + lines.push(indentComment(cs, "")); + } + ctx.forceBlockIndent = !!doc.comment; + contentComment = doc.contents.comment; + } + const onChompKeep = contentComment ? void 0 : () => chompKeep = true; + let body = stringify(doc.contents, ctx, () => contentComment = null, onChompKeep); + if (contentComment) + body += lineComment(body, "", commentString(contentComment)); + if ((body[0] === "|" || body[0] === ">") && lines[lines.length - 1] === "---") { + lines[lines.length - 1] = `--- ${body}`; + } else + lines.push(body); + } else { + lines.push(stringify(doc.contents, ctx)); + } + if ((_a = doc.directives) == null ? void 0 : _a.docEnd) { + if (doc.comment) { + const cs = commentString(doc.comment); + if (cs.includes("\n")) { + lines.push("..."); + lines.push(indentComment(cs, "")); + } else { + lines.push(`... ${cs}`); + } + } else { + lines.push("..."); + } + } else { + let dc = doc.comment; + if (dc && chompKeep) + dc = dc.replace(/^\n+/, ""); + if (dc) { + if ((!chompKeep || contentComment) && lines[lines.length - 1] !== "") + lines.push(""); + lines.push(indentComment(commentString(dc), "")); + } + } + return lines.join("\n") + "\n"; +} + +// node_modules/yaml/browser/dist/doc/applyReviver.js +function applyReviver(reviver, obj, key, val) { + if (val && typeof val === "object") { + if (Array.isArray(val)) { + for (let i4 = 0, len = val.length; i4 < len; ++i4) { + const v0 = val[i4]; + const v1 = applyReviver(reviver, val, String(i4), v0); + if (v1 === void 0) + delete val[i4]; + else if (v1 !== v0) + val[i4] = v1; + } + } else if (val instanceof Map) { + for (const k2 of Array.from(val.keys())) { + const v0 = val.get(k2); + const v1 = applyReviver(reviver, val, k2, v0); + if (v1 === void 0) + val.delete(k2); + else if (v1 !== v0) + val.set(k2, v1); + } + } else if (val instanceof Set) { + for (const v0 of Array.from(val)) { + const v1 = applyReviver(reviver, val, v0, v0); + if (v1 === void 0) + val.delete(v0); + else if (v1 !== v0) { + val.delete(v0); + val.add(v1); + } + } + } else { + for (const [k2, v0] of Object.entries(val)) { + const v1 = applyReviver(reviver, val, k2, v0); + if (v1 === void 0) + delete val[k2]; + else if (v1 !== v0) + val[k2] = v1; + } + } + } + return reviver.call(obj, key, val); +} + +// node_modules/yaml/browser/dist/doc/Document.js +var Document2 = class { + constructor(value, replacer, options) { + this.commentBefore = null; + this.comment = null; + this.errors = []; + this.warnings = []; + Object.defineProperty(this, NODE_TYPE, { value: DOC }); + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + replacer = void 0; + } + const opt = Object.assign({ + intAsBigInt: false, + keepSourceTokens: false, + logLevel: "warn", + prettyErrors: true, + strict: true, + uniqueKeys: true, + version: "1.2" + }, options); + this.options = opt; + let { version } = opt; + if (options == null ? void 0 : options._directives) { + this.directives = options._directives.atDocument(); + if (this.directives.yaml.explicit) + version = this.directives.yaml.version; + } else + this.directives = new Directives({ version }); + this.setSchema(version, options); + if (value === void 0) + this.contents = null; + else { + this.contents = this.createNode(value, _replacer, options); + } + } + clone() { + const copy = Object.create(Document2.prototype, { + [NODE_TYPE]: { value: DOC } + }); + copy.commentBefore = this.commentBefore; + copy.comment = this.comment; + copy.errors = this.errors.slice(); + copy.warnings = this.warnings.slice(); + copy.options = Object.assign({}, this.options); + if (this.directives) + copy.directives = this.directives.clone(); + copy.schema = this.schema.clone(); + copy.contents = isNode(this.contents) ? this.contents.clone(copy.schema) : this.contents; + if (this.range) + copy.range = this.range.slice(); + return copy; + } + add(value) { + if (assertCollection(this.contents)) + this.contents.add(value); + } + addIn(path, value) { + if (assertCollection(this.contents)) + this.contents.addIn(path, value); + } + createAlias(node, name) { + if (!node.anchor) { + const prev = anchorNames(this); + node.anchor = !name || prev.has(name) ? findNewAnchor(name || "a", prev) : name; + } + return new Alias(node.anchor); + } + createNode(value, replacer, options) { + let _replacer = void 0; + if (typeof replacer === "function") { + value = replacer.call({ "": value }, "", value); + _replacer = replacer; + } else if (Array.isArray(replacer)) { + const keyToStr = (v2) => typeof v2 === "number" || v2 instanceof String || v2 instanceof Number; + const asStr = replacer.filter(keyToStr).map(String); + if (asStr.length > 0) + replacer = replacer.concat(asStr); + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + replacer = void 0; + } + const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options != null ? options : {}; + const { onAnchor, setAnchors, sourceObjects } = createNodeAnchors(this, anchorPrefix || "a"); + const ctx = { + aliasDuplicateObjects: aliasDuplicateObjects != null ? aliasDuplicateObjects : true, + keepUndefined: keepUndefined != null ? keepUndefined : false, + onAnchor, + onTagObj, + replacer: _replacer, + schema: this.schema, + sourceObjects + }; + const node = createNode(value, tag, ctx); + if (flow && isCollection(node)) + node.flow = true; + setAnchors(); + return node; + } + createPair(key, value, options = {}) { + const k2 = this.createNode(key, null, options); + const v2 = this.createNode(value, null, options); + return new Pair(k2, v2); + } + delete(key) { + return assertCollection(this.contents) ? this.contents.delete(key) : false; + } + deleteIn(path) { + if (isEmptyPath(path)) { + if (this.contents == null) + return false; + this.contents = null; + return true; + } + return assertCollection(this.contents) ? this.contents.deleteIn(path) : false; + } + get(key, keepScalar) { + return isCollection(this.contents) ? this.contents.get(key, keepScalar) : void 0; + } + getIn(path, keepScalar) { + if (isEmptyPath(path)) + return !keepScalar && isScalar(this.contents) ? this.contents.value : this.contents; + return isCollection(this.contents) ? this.contents.getIn(path, keepScalar) : void 0; + } + has(key) { + return isCollection(this.contents) ? this.contents.has(key) : false; + } + hasIn(path) { + if (isEmptyPath(path)) + return this.contents !== void 0; + return isCollection(this.contents) ? this.contents.hasIn(path) : false; + } + set(key, value) { + if (this.contents == null) { + this.contents = collectionFromPath(this.schema, [key], value); + } else if (assertCollection(this.contents)) { + this.contents.set(key, value); + } + } + setIn(path, value) { + if (isEmptyPath(path)) + this.contents = value; + else if (this.contents == null) { + this.contents = collectionFromPath(this.schema, Array.from(path), value); + } else if (assertCollection(this.contents)) { + this.contents.setIn(path, value); + } + } + setSchema(version, options = {}) { + if (typeof version === "number") + version = String(version); + let opt; + switch (version) { + case "1.1": + if (this.directives) + this.directives.yaml.version = "1.1"; + else + this.directives = new Directives({ version: "1.1" }); + opt = { merge: true, resolveKnownTags: false, schema: "yaml-1.1" }; + break; + case "1.2": + case "next": + if (this.directives) + this.directives.yaml.version = version; + else + this.directives = new Directives({ version }); + opt = { merge: false, resolveKnownTags: true, schema: "core" }; + break; + case null: + if (this.directives) + delete this.directives; + opt = null; + break; + default: { + const sv = JSON.stringify(version); + throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`); + } + } + if (options.schema instanceof Object) + this.schema = options.schema; + else if (opt) + this.schema = new Schema(Object.assign(opt, options)); + else + throw new Error(`With a null YAML version, the { schema: Schema } option is required`); + } + toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc: this, + keep: !json, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100, + stringify + }; + const res = toJS(this.contents, jsonArg != null ? jsonArg : "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver(reviver, { "": res }, "", res) : res; + } + toJSON(jsonArg, onAnchor) { + return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor }); + } + toString(options = {}) { + if (this.errors.length > 0) + throw new Error("Document with errors cannot be stringified"); + if ("indent" in options && (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) { + const s5 = JSON.stringify(options.indent); + throw new Error(`"indent" option must be a positive integer, not ${s5}`); + } + return stringifyDocument(this, options); + } +}; +function assertCollection(contents) { + if (isCollection(contents)) + return true; + throw new Error("Expected a YAML collection as document contents"); +} + +// node_modules/yaml/browser/dist/errors.js +var YAMLError = class extends Error { + constructor(name, pos, code, message) { + super(); + this.name = name; + this.code = code; + this.message = message; + this.pos = pos; + } +}; +var YAMLParseError = class extends YAMLError { + constructor(pos, code, message) { + super("YAMLParseError", pos, code, message); + } +}; +var YAMLWarning = class extends YAMLError { + constructor(pos, code, message) { + super("YAMLWarning", pos, code, message); + } +}; +var prettifyError = (src, lc) => (error) => { + if (error.pos[0] === -1) + return; + error.linePos = error.pos.map((pos) => lc.linePos(pos)); + const { line, col } = error.linePos[0]; + error.message += ` at line ${line}, column ${col}`; + let ci = col - 1; + let lineStr = src.substring(lc.lineStarts[line - 1], lc.lineStarts[line]).replace(/[\n\r]+$/, ""); + if (ci >= 60 && lineStr.length > 80) { + const trimStart = Math.min(ci - 39, lineStr.length - 79); + lineStr = "\u2026" + lineStr.substring(trimStart); + ci -= trimStart - 1; + } + if (lineStr.length > 80) + lineStr = lineStr.substring(0, 79) + "\u2026"; + if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) { + let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]); + if (prev.length > 80) + prev = prev.substring(0, 79) + "\u2026\n"; + lineStr = prev + lineStr; + } + if (/[^ ]/.test(lineStr)) { + let count = 1; + const end = error.linePos[1]; + if (end && end.line === line && end.col > col) { + count = Math.min(end.col - col, 80 - ci); + } + const pointer = " ".repeat(ci) + "^".repeat(count); + error.message += `: + +${lineStr} +${pointer} +`; + } +}; + +// node_modules/yaml/browser/dist/compose/resolve-props.js +function resolveProps(tokens, { flow, indicator, next, offset, onError, startOnNewline }) { + let spaceBefore = false; + let atNewline = startOnNewline; + let hasSpace = startOnNewline; + let comment = ""; + let commentSep = ""; + let hasNewline = false; + let hasNewlineAfterProp = false; + let reqSpace = false; + let anchor = null; + let tag = null; + let comma = null; + let found = null; + let start = null; + for (const token of tokens) { + if (reqSpace) { + if (token.type !== "space" && token.type !== "newline" && token.type !== "comma") + onError(token.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + reqSpace = false; + } + switch (token.type) { + case "space": + if (!flow && atNewline && indicator !== "doc-start" && token.source[0] === " ") + onError(token, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + hasSpace = true; + break; + case "comment": { + if (!hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = token.source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += commentSep + cb; + commentSep = ""; + atNewline = false; + break; + } + case "newline": + if (atNewline) { + if (comment) + comment += token.source; + else + spaceBefore = true; + } else + commentSep += token.source; + atNewline = true; + hasNewline = true; + if (anchor || tag) + hasNewlineAfterProp = true; + hasSpace = true; + break; + case "anchor": + if (anchor) + onError(token, "MULTIPLE_ANCHORS", "A node can have at most one anchor"); + if (token.source.endsWith(":")) + onError(token.offset + token.source.length - 1, "BAD_ALIAS", "Anchor ending in : is ambiguous", true); + anchor = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + case "tag": { + if (tag) + onError(token, "MULTIPLE_TAGS", "A node can have at most one tag"); + tag = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + } + case indicator: + if (anchor || tag) + onError(token, "BAD_PROP_ORDER", `Anchors and tags must be after the ${token.source} indicator`); + if (found) + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.source} in ${flow != null ? flow : "collection"}`); + found = token; + atNewline = false; + hasSpace = false; + break; + case "comma": + if (flow) { + if (comma) + onError(token, "UNEXPECTED_TOKEN", `Unexpected , in ${flow}`); + comma = token; + atNewline = false; + hasSpace = false; + break; + } + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.type} token`); + atNewline = false; + hasSpace = false; + } + } + const last = tokens[tokens.length - 1]; + const end = last ? last.offset + last.source.length : offset; + if (reqSpace && next && next.type !== "space" && next.type !== "newline" && next.type !== "comma" && (next.type !== "scalar" || next.source !== "")) + onError(next.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + return { + comma, + found, + spaceBefore, + comment, + hasNewline, + hasNewlineAfterProp, + anchor, + tag, + end, + start: start != null ? start : end + }; +} + +// node_modules/yaml/browser/dist/compose/util-contains-newline.js +function containsNewline(key) { + if (!key) + return null; + switch (key.type) { + case "alias": + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + if (key.source.includes("\n")) + return true; + if (key.end) { + for (const st of key.end) + if (st.type === "newline") + return true; + } + return false; + case "flow-collection": + for (const it of key.items) { + for (const st of it.start) + if (st.type === "newline") + return true; + if (it.sep) { + for (const st of it.sep) + if (st.type === "newline") + return true; + } + if (containsNewline(it.key) || containsNewline(it.value)) + return true; + } + return false; + default: + return true; + } +} + +// node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +function flowIndentCheck(indent, fc, onError) { + if ((fc == null ? void 0 : fc.type) === "flow-collection") { + const end = fc.end[0]; + if (end.indent === indent && (end.source === "]" || end.source === "}") && containsNewline(fc)) { + const msg = "Flow end indicator should be more indented than parent"; + onError(end, "BAD_INDENT", msg, true); + } + } +} + +// node_modules/yaml/browser/dist/compose/util-map-includes.js +function mapIncludes(ctx, items, search) { + const { uniqueKeys } = ctx.options; + if (uniqueKeys === false) + return false; + const isEqual = typeof uniqueKeys === "function" ? uniqueKeys : (a3, b2) => a3 === b2 || isScalar(a3) && isScalar(b2) && a3.value === b2.value && !(a3.value === "<<" && ctx.schema.merge); + return items.some((pair) => isEqual(pair.key, search)); +} + +// node_modules/yaml/browser/dist/compose/resolve-block-map.js +var startColMsg = "All mapping items must start at the same column"; +function resolveBlockMap({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, bm, onError) { + var _a; + const map2 = new YAMLMap(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset = bm.offset; + for (const collItem of bm.items) { + const { start, key, sep, value } = collItem; + const keyProps = resolveProps(start, { + indicator: "explicit-key-ind", + next: key != null ? key : sep == null ? void 0 : sep[0], + offset, + onError, + startOnNewline: true + }); + const implicitKey = !keyProps.found; + if (implicitKey) { + if (key) { + if (key.type === "block-seq") + onError(offset, "BLOCK_AS_IMPLICIT_KEY", "A block sequence may not be used as an implicit map key"); + else if ("indent" in key && key.indent !== bm.indent) + onError(offset, "BAD_INDENT", startColMsg); + } + if (!keyProps.anchor && !keyProps.tag && !sep) { + if (keyProps.comment) { + if (map2.comment) + map2.comment += "\n" + keyProps.comment; + else + map2.comment = keyProps.comment; + } + continue; + } + if (keyProps.hasNewlineAfterProp || containsNewline(key)) { + onError(key != null ? key : start[start.length - 1], "MULTILINE_IMPLICIT_KEY", "Implicit keys need to be on a single line"); + } + } else if (((_a = keyProps.found) == null ? void 0 : _a.indent) !== bm.indent) { + onError(offset, "BAD_INDENT", startColMsg); + } + const keyStart = keyProps.end; + const keyNode = key ? composeNode2(ctx, key, keyProps, onError) : composeEmptyNode2(ctx, keyStart, start, null, keyProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, key, onError); + if (mapIncludes(ctx, map2.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + const valueProps = resolveProps(sep != null ? sep : [], { + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + startOnNewline: !key || key.type === "block-scalar" + }); + offset = valueProps.end; + if (valueProps.found) { + if (implicitKey) { + if ((value == null ? void 0 : value.type) === "block-map" && !valueProps.hasNewline) + onError(offset, "BLOCK_AS_IMPLICIT_KEY", "Nested mappings are not allowed in compact mappings"); + if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024) + onError(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key"); + } + const valueNode = value ? composeNode2(ctx, value, valueProps, onError) : composeEmptyNode2(ctx, offset, sep, null, valueProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, value, onError); + offset = valueNode.range[2]; + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map2.items.push(pair); + } else { + if (implicitKey) + onError(keyNode.range, "MISSING_CHAR", "Implicit map keys need to be followed by map values"); + if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map2.items.push(pair); + } + } + map2.range = [bm.offset, offset, offset]; + return map2; +} + +// node_modules/yaml/browser/dist/compose/resolve-block-seq.js +function resolveBlockSeq({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, bs, onError) { + const seq2 = new YAMLSeq(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset = bs.offset; + for (const { start, value } of bs.items) { + const props = resolveProps(start, { + indicator: "seq-item-ind", + next: value, + offset, + onError, + startOnNewline: true + }); + offset = props.end; + if (!props.found) { + if (props.anchor || props.tag || value) { + if (value && value.type === "block-seq") + onError(offset, "BAD_INDENT", "All sequence items must start at the same column"); + else + onError(offset, "MISSING_CHAR", "Sequence item without - indicator"); + } else { + if (props.comment) + seq2.comment = props.comment; + continue; + } + } + const node = value ? composeNode2(ctx, value, props, onError) : composeEmptyNode2(ctx, offset, start, null, props, onError); + if (ctx.schema.compat) + flowIndentCheck(bs.indent, value, onError); + offset = node.range[2]; + seq2.items.push(node); + } + seq2.range = [bs.offset, offset, offset]; + return seq2; +} + +// node_modules/yaml/browser/dist/compose/resolve-end.js +function resolveEnd(end, offset, reqSpace, onError) { + let comment = ""; + if (end) { + let hasSpace = false; + let sep = ""; + for (const token of end) { + const { source, type } = token; + switch (type) { + case "space": + hasSpace = true; + break; + case "comment": { + if (reqSpace && !hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += sep + cb; + sep = ""; + break; + } + case "newline": + if (comment) + sep += source; + hasSpace = true; + break; + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${type} at node end`); + } + offset += source.length; + } + } + return { comment, offset }; +} + +// node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +var blockMsg = "Block collections are not allowed within flow collections"; +var isBlock = (token) => token && (token.type === "block-map" || token.type === "block-seq"); +function resolveFlowCollection({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, fc, onError) { + var _a; + const isMap2 = fc.start.source === "{"; + const fcName = isMap2 ? "flow map" : "flow sequence"; + const coll = isMap2 ? new YAMLMap(ctx.schema) : new YAMLSeq(ctx.schema); + coll.flow = true; + const atRoot = ctx.atRoot; + if (atRoot) + ctx.atRoot = false; + let offset = fc.offset + fc.start.source.length; + for (let i4 = 0; i4 < fc.items.length; ++i4) { + const collItem = fc.items[i4]; + const { start, key, sep, value } = collItem; + const props = resolveProps(start, { + flow: fcName, + indicator: "explicit-key-ind", + next: key != null ? key : sep == null ? void 0 : sep[0], + offset, + onError, + startOnNewline: false + }); + if (!props.found) { + if (!props.anchor && !props.tag && !sep && !value) { + if (i4 === 0 && props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + else if (i4 < fc.items.length - 1) + onError(props.start, "UNEXPECTED_TOKEN", `Unexpected empty item in ${fcName}`); + if (props.comment) { + if (coll.comment) + coll.comment += "\n" + props.comment; + else + coll.comment = props.comment; + } + offset = props.end; + continue; + } + if (!isMap2 && ctx.options.strict && containsNewline(key)) + onError(key, "MULTILINE_IMPLICIT_KEY", "Implicit keys of flow sequence pairs need to be on a single line"); + } + if (i4 === 0) { + if (props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + } else { + if (!props.comma) + onError(props.start, "MISSING_CHAR", `Missing , between ${fcName} items`); + if (props.comment) { + let prevItemComment = ""; + loop: + for (const st of start) { + switch (st.type) { + case "comma": + case "space": + break; + case "comment": + prevItemComment = st.source.substring(1); + break loop; + default: + break loop; + } + } + if (prevItemComment) { + let prev = coll.items[coll.items.length - 1]; + if (isPair(prev)) + prev = (_a = prev.value) != null ? _a : prev.key; + if (prev.comment) + prev.comment += "\n" + prevItemComment; + else + prev.comment = prevItemComment; + props.comment = props.comment.substring(prevItemComment.length + 1); + } + } + } + if (!isMap2 && !sep && !props.found) { + const valueNode = value ? composeNode2(ctx, value, props, onError) : composeEmptyNode2(ctx, props.end, sep, null, props, onError); + coll.items.push(valueNode); + offset = valueNode.range[2]; + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else { + const keyStart = props.end; + const keyNode = key ? composeNode2(ctx, key, props, onError) : composeEmptyNode2(ctx, keyStart, start, null, props, onError); + if (isBlock(key)) + onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg); + const valueProps = resolveProps(sep != null ? sep : [], { + flow: fcName, + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + startOnNewline: false + }); + if (valueProps.found) { + if (!isMap2 && !props.found && ctx.options.strict) { + if (sep) + for (const st of sep) { + if (st === valueProps.found) + break; + if (st.type === "newline") { + onError(st, "MULTILINE_IMPLICIT_KEY", "Implicit keys of flow sequence pairs need to be on a single line"); + break; + } + } + if (props.start < valueProps.found.offset - 1024) + onError(valueProps.found, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit flow sequence key"); + } + } else if (value) { + if ("source" in value && value.source && value.source[0] === ":") + onError(value, "MISSING_CHAR", `Missing space after : in ${fcName}`); + else + onError(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`); + } + const valueNode = value ? composeNode2(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode2(ctx, valueProps.end, sep, null, valueProps, onError) : null; + if (valueNode) { + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + if (isMap2) { + const map2 = coll; + if (mapIncludes(ctx, map2.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + map2.items.push(pair); + } else { + const map2 = new YAMLMap(ctx.schema); + map2.flow = true; + map2.items.push(pair); + coll.items.push(map2); + } + offset = valueNode ? valueNode.range[2] : valueProps.end; + } + } + const expectedEnd = isMap2 ? "}" : "]"; + const [ce, ...ee] = fc.end; + let cePos = offset; + if (ce && ce.source === expectedEnd) + cePos = ce.offset + ce.source.length; + else { + const name = fcName[0].toUpperCase() + fcName.substring(1); + const msg = atRoot ? `${name} must end with a ${expectedEnd}` : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`; + onError(offset, atRoot ? "MISSING_CHAR" : "BAD_INDENT", msg); + if (ce && ce.source.length !== 1) + ee.unshift(ce); + } + if (ee.length > 0) { + const end = resolveEnd(ee, cePos, ctx.options.strict, onError); + if (end.comment) { + if (coll.comment) + coll.comment += "\n" + end.comment; + else + coll.comment = end.comment; + } + coll.range = [fc.offset, cePos, end.offset]; + } else { + coll.range = [fc.offset, cePos, cePos]; + } + return coll; +} + +// node_modules/yaml/browser/dist/compose/compose-collection.js +function composeCollection(CN2, ctx, token, tagToken, onError) { + let coll; + switch (token.type) { + case "block-map": { + coll = resolveBlockMap(CN2, ctx, token, onError); + break; + } + case "block-seq": { + coll = resolveBlockSeq(CN2, ctx, token, onError); + break; + } + case "flow-collection": { + coll = resolveFlowCollection(CN2, ctx, token, onError); + break; + } + } + if (!tagToken) + return coll; + const tagName = ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)); + if (!tagName) + return coll; + const Coll = coll.constructor; + if (tagName === "!" || tagName === Coll.tagName) { + coll.tag = Coll.tagName; + return coll; + } + const expType = isMap(coll) ? "map" : "seq"; + let tag = ctx.schema.tags.find((t3) => t3.collection === expType && t3.tag === tagName); + if (!tag) { + const kt = ctx.schema.knownTags[tagName]; + if (kt && kt.collection === expType) { + ctx.schema.tags.push(Object.assign({}, kt, { default: false })); + tag = kt; + } else { + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, true); + coll.tag = tagName; + return coll; + } + } + const res = tag.resolve(coll, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg), ctx.options); + const node = isNode(res) ? res : new Scalar(res); + node.range = coll.range; + node.tag = tagName; + if (tag == null ? void 0 : tag.format) + node.format = tag.format; + return node; +} + +// node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +function resolveBlockScalar(scalar, strict, onError) { + const start = scalar.offset; + const header = parseBlockScalarHeader(scalar, strict, onError); + if (!header) + return { value: "", type: null, comment: "", range: [start, start, start] }; + const type = header.mode === ">" ? Scalar.BLOCK_FOLDED : Scalar.BLOCK_LITERAL; + const lines = scalar.source ? splitLines(scalar.source) : []; + let chompStart = lines.length; + for (let i4 = lines.length - 1; i4 >= 0; --i4) { + const content = lines[i4][1]; + if (content === "" || content === "\r") + chompStart = i4; + else + break; + } + if (chompStart === 0) { + const value2 = header.chomp === "+" && lines.length > 0 ? "\n".repeat(Math.max(1, lines.length - 1)) : ""; + let end2 = start + header.length; + if (scalar.source) + end2 += scalar.source.length; + return { value: value2, type, comment: header.comment, range: [start, end2, end2] }; + } + let trimIndent = scalar.indent + header.indent; + let offset = scalar.offset + header.length; + let contentStart = 0; + for (let i4 = 0; i4 < chompStart; ++i4) { + const [indent, content] = lines[i4]; + if (content === "" || content === "\r") { + if (header.indent === 0 && indent.length > trimIndent) + trimIndent = indent.length; + } else { + if (indent.length < trimIndent) { + const message = "Block scalars with more-indented leading empty lines must use an explicit indentation indicator"; + onError(offset + indent.length, "MISSING_CHAR", message); + } + if (header.indent === 0) + trimIndent = indent.length; + contentStart = i4; + break; + } + offset += indent.length + content.length + 1; + } + for (let i4 = lines.length - 1; i4 >= chompStart; --i4) { + if (lines[i4][0].length > trimIndent) + chompStart = i4 + 1; + } + let value = ""; + let sep = ""; + let prevMoreIndented = false; + for (let i4 = 0; i4 < contentStart; ++i4) + value += lines[i4][0].slice(trimIndent) + "\n"; + for (let i4 = contentStart; i4 < chompStart; ++i4) { + let [indent, content] = lines[i4]; + offset += indent.length + content.length + 1; + const crlf = content[content.length - 1] === "\r"; + if (crlf) + content = content.slice(0, -1); + if (content && indent.length < trimIndent) { + const src = header.indent ? "explicit indentation indicator" : "first line"; + const message = `Block scalar lines must not be less indented than their ${src}`; + onError(offset - content.length - (crlf ? 2 : 1), "BAD_INDENT", message); + indent = ""; + } + if (type === Scalar.BLOCK_LITERAL) { + value += sep + indent.slice(trimIndent) + content; + sep = "\n"; + } else if (indent.length > trimIndent || content[0] === " ") { + if (sep === " ") + sep = "\n"; + else if (!prevMoreIndented && sep === "\n") + sep = "\n\n"; + value += sep + indent.slice(trimIndent) + content; + sep = "\n"; + prevMoreIndented = true; + } else if (content === "") { + if (sep === "\n") + value += "\n"; + else + sep = "\n"; + } else { + value += sep + content; + sep = " "; + prevMoreIndented = false; + } + } + switch (header.chomp) { + case "-": + break; + case "+": + for (let i4 = chompStart; i4 < lines.length; ++i4) + value += "\n" + lines[i4][0].slice(trimIndent); + if (value[value.length - 1] !== "\n") + value += "\n"; + break; + default: + value += "\n"; + } + const end = start + header.length + scalar.source.length; + return { value, type, comment: header.comment, range: [start, end, end] }; +} +function parseBlockScalarHeader({ offset, props }, strict, onError) { + if (props[0].type !== "block-scalar-header") { + onError(props[0], "IMPOSSIBLE", "Block scalar header not found"); + return null; + } + const { source } = props[0]; + const mode = source[0]; + let indent = 0; + let chomp = ""; + let error = -1; + for (let i4 = 1; i4 < source.length; ++i4) { + const ch = source[i4]; + if (!chomp && (ch === "-" || ch === "+")) + chomp = ch; + else { + const n6 = Number(ch); + if (!indent && n6) + indent = n6; + else if (error === -1) + error = offset + i4; + } + } + if (error !== -1) + onError(error, "UNEXPECTED_TOKEN", `Block scalar header includes extra characters: ${source}`); + let hasSpace = false; + let comment = ""; + let length = source.length; + for (let i4 = 1; i4 < props.length; ++i4) { + const token = props[i4]; + switch (token.type) { + case "space": + hasSpace = true; + case "newline": + length += token.source.length; + break; + case "comment": + if (strict && !hasSpace) { + const message = "Comments must be separated from other tokens by white space characters"; + onError(token, "MISSING_CHAR", message); + } + length += token.source.length; + comment = token.source.substring(1); + break; + case "error": + onError(token, "UNEXPECTED_TOKEN", token.message); + length += token.source.length; + break; + default: { + const message = `Unexpected token in block scalar header: ${token.type}`; + onError(token, "UNEXPECTED_TOKEN", message); + const ts = token.source; + if (ts && typeof ts === "string") + length += ts.length; + } + } + } + return { mode, indent, chomp, comment, length }; +} +function splitLines(source) { + const split = source.split(/\n( *)/); + const first = split[0]; + const m2 = first.match(/^( *)/); + const line0 = (m2 == null ? void 0 : m2[1]) ? [m2[1], first.slice(m2[1].length)] : ["", first]; + const lines = [line0]; + for (let i4 = 1; i4 < split.length; i4 += 2) + lines.push([split[i4], split[i4 + 1]]); + return lines; +} + +// node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +function resolveFlowScalar(scalar, strict, onError) { + const { offset, type, source, end } = scalar; + let _type; + let value; + const _onError = (rel, code, msg) => onError(offset + rel, code, msg); + switch (type) { + case "scalar": + _type = Scalar.PLAIN; + value = plainValue(source, _onError); + break; + case "single-quoted-scalar": + _type = Scalar.QUOTE_SINGLE; + value = singleQuotedValue(source, _onError); + break; + case "double-quoted-scalar": + _type = Scalar.QUOTE_DOUBLE; + value = doubleQuotedValue(source, _onError); + break; + default: + onError(scalar, "UNEXPECTED_TOKEN", `Expected a flow scalar value, but found: ${type}`); + return { + value: "", + type: null, + comment: "", + range: [offset, offset + source.length, offset + source.length] + }; + } + const valueEnd = offset + source.length; + const re = resolveEnd(end, valueEnd, strict, onError); + return { + value, + type: _type, + comment: re.comment, + range: [offset, valueEnd, re.offset] + }; +} +function plainValue(source, onError) { + let badChar = ""; + switch (source[0]) { + case " ": + badChar = "a tab character"; + break; + case ",": + badChar = "flow indicator character ,"; + break; + case "%": + badChar = "directive indicator character %"; + break; + case "|": + case ">": { + badChar = `block scalar indicator ${source[0]}`; + break; + } + case "@": + case "`": { + badChar = `reserved character ${source[0]}`; + break; + } + } + if (badChar) + onError(0, "BAD_SCALAR_START", `Plain value cannot start with ${badChar}`); + return foldLines(source); +} +function singleQuotedValue(source, onError) { + if (source[source.length - 1] !== "'" || source.length === 1) + onError(source.length, "MISSING_CHAR", "Missing closing 'quote"); + return foldLines(source.slice(1, -1)).replace(/''/g, "'"); +} +function foldLines(source) { + var _a; + let first, line; + try { + first = new RegExp("(.*?)(? wsStart ? source.slice(wsStart, i4 + 1) : ch; + } else { + res += ch; + } + } + if (source[source.length - 1] !== '"' || source.length === 1) + onError(source.length, "MISSING_CHAR", 'Missing closing "quote'); + return res; +} +function foldNewline(source, offset) { + let fold = ""; + let ch = source[offset + 1]; + while (ch === " " || ch === " " || ch === "\n" || ch === "\r") { + if (ch === "\r" && source[offset + 2] !== "\n") + break; + if (ch === "\n") + fold += "\n"; + offset += 1; + ch = source[offset + 1]; + } + if (!fold) + fold = " "; + return { fold, offset }; +} +var escapeCodes = { + "0": "\0", + a: "\x07", + b: "\b", + e: "\x1B", + f: "\f", + n: "\n", + r: "\r", + t: " ", + v: "\v", + N: "\x85", + _: "\xA0", + L: "\u2028", + P: "\u2029", + " ": " ", + '"': '"', + "/": "/", + "\\": "\\", + " ": " " +}; +function parseCharCode(source, offset, length, onError) { + const cc = source.substr(offset, length); + const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc); + const code = ok ? parseInt(cc, 16) : NaN; + if (isNaN(code)) { + const raw = source.substr(offset - 2, length + 2); + onError(offset - 2, "BAD_DQ_ESCAPE", `Invalid escape sequence ${raw}`); + return raw; + } + return String.fromCodePoint(code); +} + +// node_modules/yaml/browser/dist/compose/compose-scalar.js +function composeScalar(ctx, token, tagToken, onError) { + const { value, type, comment, range } = token.type === "block-scalar" ? resolveBlockScalar(token, ctx.options.strict, onError) : resolveFlowScalar(token, ctx.options.strict, onError); + const tagName = tagToken ? ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)) : null; + const tag = tagToken && tagName ? findScalarTagByName(ctx.schema, value, tagName, tagToken, onError) : token.type === "scalar" ? findScalarTagByTest(ctx, value, token, onError) : ctx.schema[SCALAR]; + let scalar; + try { + const res = tag.resolve(value, (msg) => onError(tagToken != null ? tagToken : token, "TAG_RESOLVE_FAILED", msg), ctx.options); + scalar = isScalar(res) ? res : new Scalar(res); + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + onError(tagToken != null ? tagToken : token, "TAG_RESOLVE_FAILED", msg); + scalar = new Scalar(value); + } + scalar.range = range; + scalar.source = value; + if (type) + scalar.type = type; + if (tagName) + scalar.tag = tagName; + if (tag.format) + scalar.format = tag.format; + if (comment) + scalar.comment = comment; + return scalar; +} +function findScalarTagByName(schema4, value, tagName, tagToken, onError) { + var _a; + if (tagName === "!") + return schema4[SCALAR]; + const matchWithTest = []; + for (const tag of schema4.tags) { + if (!tag.collection && tag.tag === tagName) { + if (tag.default && tag.test) + matchWithTest.push(tag); + else + return tag; + } + } + for (const tag of matchWithTest) + if ((_a = tag.test) == null ? void 0 : _a.test(value)) + return tag; + const kt = schema4.knownTags[tagName]; + if (kt && !kt.collection) { + schema4.tags.push(Object.assign({}, kt, { default: false, test: void 0 })); + return kt; + } + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, tagName !== "tag:yaml.org,2002:str"); + return schema4[SCALAR]; +} +function findScalarTagByTest({ directives, schema: schema4 }, value, token, onError) { + var _a; + const tag = schema4.tags.find((tag2) => { + var _a2; + return tag2.default && ((_a2 = tag2.test) == null ? void 0 : _a2.test(value)); + }) || schema4[SCALAR]; + if (schema4.compat) { + const compat = (_a = schema4.compat.find((tag2) => { + var _a2; + return tag2.default && ((_a2 = tag2.test) == null ? void 0 : _a2.test(value)); + })) != null ? _a : schema4[SCALAR]; + if (tag.tag !== compat.tag) { + const ts = directives.tagString(tag.tag); + const cs = directives.tagString(compat.tag); + const msg = `Value may be parsed as either ${ts} or ${cs}`; + onError(token, "TAG_RESOLVE_FAILED", msg, true); + } + } + return tag; +} + +// node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +function emptyScalarPosition(offset, before, pos) { + if (before) { + if (pos === null) + pos = before.length; + for (let i4 = pos - 1; i4 >= 0; --i4) { + let st = before[i4]; + switch (st.type) { + case "space": + case "comment": + case "newline": + offset -= st.source.length; + continue; + } + st = before[++i4]; + while ((st == null ? void 0 : st.type) === "space") { + offset += st.source.length; + st = before[++i4]; + } + break; + } + } + return offset; +} + +// node_modules/yaml/browser/dist/compose/compose-node.js +var CN = { composeNode, composeEmptyNode }; +function composeNode(ctx, token, props, onError) { + const { spaceBefore, comment, anchor, tag } = props; + let node; + let isSrcToken = true; + switch (token.type) { + case "alias": + node = composeAlias(ctx, token, onError); + if (anchor || tag) + onError(token, "ALIAS_PROPS", "An alias node must not specify any properties"); + break; + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "block-scalar": + node = composeScalar(ctx, token, tag, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + case "block-map": + case "block-seq": + case "flow-collection": + node = composeCollection(CN, ctx, token, tag, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + default: { + const message = token.type === "error" ? token.message : `Unsupported token (type: ${token.type})`; + onError(token, "UNEXPECTED_TOKEN", message); + node = composeEmptyNode(ctx, token.offset, void 0, null, props, onError); + isSrcToken = false; + } + } + if (anchor && node.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + if (spaceBefore) + node.spaceBefore = true; + if (comment) { + if (token.type === "scalar" && token.source === "") + node.comment = comment; + else + node.commentBefore = comment; + } + if (ctx.options.keepSourceTokens && isSrcToken) + node.srcToken = token; + return node; +} +function composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag }, onError) { + const token = { + type: "scalar", + offset: emptyScalarPosition(offset, before, pos), + indent: -1, + source: "" + }; + const node = composeScalar(ctx, token, tag, onError); + if (anchor) { + node.anchor = anchor.source.substring(1); + if (node.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + } + if (spaceBefore) + node.spaceBefore = true; + if (comment) + node.comment = comment; + return node; +} +function composeAlias({ options }, { offset, source, end }, onError) { + const alias = new Alias(source.substring(1)); + if (alias.source === "") + onError(offset, "BAD_ALIAS", "Alias cannot be an empty string"); + if (alias.source.endsWith(":")) + onError(offset + source.length - 1, "BAD_ALIAS", "Alias ending in : is ambiguous", true); + const valueEnd = offset + source.length; + const re = resolveEnd(end, valueEnd, options.strict, onError); + alias.range = [offset, valueEnd, re.offset]; + if (re.comment) + alias.comment = re.comment; + return alias; +} + +// node_modules/yaml/browser/dist/compose/compose-doc.js +function composeDoc(options, directives, { offset, start, value, end }, onError) { + const opts = Object.assign({ _directives: directives }, options); + const doc = new Document2(void 0, opts); + const ctx = { + atRoot: true, + directives: doc.directives, + options: doc.options, + schema: doc.schema + }; + const props = resolveProps(start, { + indicator: "doc-start", + next: value != null ? value : end == null ? void 0 : end[0], + offset, + onError, + startOnNewline: true + }); + if (props.found) { + doc.directives.docStart = true; + if (value && (value.type === "block-map" || value.type === "block-seq") && !props.hasNewline) + onError(props.end, "MISSING_CHAR", "Block collection cannot start on same line with directives-end marker"); + } + doc.contents = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, start, null, props, onError); + const contentEnd = doc.contents.range[2]; + const re = resolveEnd(end, contentEnd, false, onError); + if (re.comment) + doc.comment = re.comment; + doc.range = [offset, contentEnd, re.offset]; + return doc; +} + +// node_modules/yaml/browser/dist/compose/composer.js +function getErrorPos(src) { + if (typeof src === "number") + return [src, src + 1]; + if (Array.isArray(src)) + return src.length === 2 ? src : [src[0], src[1]]; + const { offset, source } = src; + return [offset, offset + (typeof source === "string" ? source.length : 1)]; +} +function parsePrelude(prelude) { + var _a; + let comment = ""; + let atComment = false; + let afterEmptyLine = false; + for (let i4 = 0; i4 < prelude.length; ++i4) { + const source = prelude[i4]; + switch (source[0]) { + case "#": + comment += (comment === "" ? "" : afterEmptyLine ? "\n\n" : "\n") + (source.substring(1) || " "); + atComment = true; + afterEmptyLine = false; + break; + case "%": + if (((_a = prelude[i4 + 1]) == null ? void 0 : _a[0]) !== "#") + i4 += 1; + atComment = false; + break; + default: + if (!atComment) + afterEmptyLine = true; + atComment = false; + } + } + return { comment, afterEmptyLine }; +} +var Composer = class { + constructor(options = {}) { + this.doc = null; + this.atDirectives = false; + this.prelude = []; + this.errors = []; + this.warnings = []; + this.onError = (source, code, message, warning) => { + const pos = getErrorPos(source); + if (warning) + this.warnings.push(new YAMLWarning(pos, code, message)); + else + this.errors.push(new YAMLParseError(pos, code, message)); + }; + this.directives = new Directives({ version: options.version || "1.2" }); + this.options = options; + } + decorate(doc, afterDoc) { + const { comment, afterEmptyLine } = parsePrelude(this.prelude); + if (comment) { + const dc = doc.contents; + if (afterDoc) { + doc.comment = doc.comment ? `${doc.comment} +${comment}` : comment; + } else if (afterEmptyLine || doc.directives.docStart || !dc) { + doc.commentBefore = comment; + } else if (isCollection(dc) && !dc.flow && dc.items.length > 0) { + let it = dc.items[0]; + if (isPair(it)) + it = it.key; + const cb = it.commentBefore; + it.commentBefore = cb ? `${comment} +${cb}` : comment; + } else { + const cb = dc.commentBefore; + dc.commentBefore = cb ? `${comment} +${cb}` : comment; + } + } + if (afterDoc) { + Array.prototype.push.apply(doc.errors, this.errors); + Array.prototype.push.apply(doc.warnings, this.warnings); + } else { + doc.errors = this.errors; + doc.warnings = this.warnings; + } + this.prelude = []; + this.errors = []; + this.warnings = []; + } + streamInfo() { + return { + comment: parsePrelude(this.prelude).comment, + directives: this.directives, + errors: this.errors, + warnings: this.warnings + }; + } + *compose(tokens, forceDoc = false, endOffset = -1) { + for (const token of tokens) + yield* this.next(token); + yield* this.end(forceDoc, endOffset); + } + *next(token) { + switch (token.type) { + case "directive": + this.directives.add(token.source, (offset, message, warning) => { + const pos = getErrorPos(token); + pos[0] += offset; + this.onError(pos, "BAD_DIRECTIVE", message, warning); + }); + this.prelude.push(token.source); + this.atDirectives = true; + break; + case "document": { + const doc = composeDoc(this.options, this.directives, token, this.onError); + if (this.atDirectives && !doc.directives.docStart) + this.onError(token, "MISSING_CHAR", "Missing directives-end/doc-start indicator line"); + this.decorate(doc, false); + if (this.doc) + yield this.doc; + this.doc = doc; + this.atDirectives = false; + break; + } + case "byte-order-mark": + case "space": + break; + case "comment": + case "newline": + this.prelude.push(token.source); + break; + case "error": { + const msg = token.source ? `${token.message}: ${JSON.stringify(token.source)}` : token.message; + const error = new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg); + if (this.atDirectives || !this.doc) + this.errors.push(error); + else + this.doc.errors.push(error); + break; + } + case "doc-end": { + if (!this.doc) { + const msg = "Unexpected doc-end without preceding document"; + this.errors.push(new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg)); + break; + } + this.doc.directives.docEnd = true; + const end = resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError); + this.decorate(this.doc, true); + if (end.comment) { + const dc = this.doc.comment; + this.doc.comment = dc ? `${dc} +${end.comment}` : end.comment; + } + this.doc.range[2] = end.offset; + break; + } + default: + this.errors.push(new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", `Unsupported token ${token.type}`)); + } + } + *end(forceDoc = false, endOffset = -1) { + if (this.doc) { + this.decorate(this.doc, true); + yield this.doc; + this.doc = null; + } else if (forceDoc) { + const opts = Object.assign({ _directives: this.directives }, this.options); + const doc = new Document2(void 0, opts); + if (this.atDirectives) + this.onError(endOffset, "MISSING_CHAR", "Missing directives-end indicator line"); + doc.range = [0, endOffset, endOffset]; + this.decorate(doc, false); + yield doc; + } + } +}; + +// node_modules/yaml/browser/dist/parse/cst-visit.js +var BREAK2 = Symbol("break visit"); +var SKIP2 = Symbol("skip children"); +var REMOVE2 = Symbol("remove item"); +function visit2(cst, visitor) { + if ("type" in cst && cst.type === "document") + cst = { start: cst.start, value: cst.value }; + _visit(Object.freeze([]), cst, visitor); +} +visit2.BREAK = BREAK2; +visit2.SKIP = SKIP2; +visit2.REMOVE = REMOVE2; +visit2.itemAtPath = (cst, path) => { + let item = cst; + for (const [field, index] of path) { + const tok = item == null ? void 0 : item[field]; + if (tok && "items" in tok) { + item = tok.items[index]; + } else + return void 0; + } + return item; +}; +visit2.parentCollection = (cst, path) => { + const parent = visit2.itemAtPath(cst, path.slice(0, -1)); + const field = path[path.length - 1][0]; + const coll = parent == null ? void 0 : parent[field]; + if (coll && "items" in coll) + return coll; + throw new Error("Parent collection not found"); +}; +function _visit(path, item, visitor) { + let ctrl = visitor(item, path); + if (typeof ctrl === "symbol") + return ctrl; + for (const field of ["key", "value"]) { + const token = item[field]; + if (token && "items" in token) { + for (let i4 = 0; i4 < token.items.length; ++i4) { + const ci = _visit(Object.freeze(path.concat([[field, i4]])), token.items[i4], visitor); + if (typeof ci === "number") + i4 = ci - 1; + else if (ci === BREAK2) + return BREAK2; + else if (ci === REMOVE2) { + token.items.splice(i4, 1); + i4 -= 1; + } + } + if (typeof ctrl === "function" && field === "key") + ctrl = ctrl(item, path); + } + } + return typeof ctrl === "function" ? ctrl(item, path) : ctrl; +} + +// node_modules/yaml/browser/dist/parse/cst.js +var BOM = "\uFEFF"; +var DOCUMENT = ""; +var FLOW_END = ""; +var SCALAR2 = ""; +function tokenType(source) { + switch (source) { + case BOM: + return "byte-order-mark"; + case DOCUMENT: + return "doc-mode"; + case FLOW_END: + return "flow-error-end"; + case SCALAR2: + return "scalar"; + case "---": + return "doc-start"; + case "...": + return "doc-end"; + case "": + case "\n": + case "\r\n": + return "newline"; + case "-": + return "seq-item-ind"; + case "?": + return "explicit-key-ind"; + case ":": + return "map-value-ind"; + case "{": + return "flow-map-start"; + case "}": + return "flow-map-end"; + case "[": + return "flow-seq-start"; + case "]": + return "flow-seq-end"; + case ",": + return "comma"; + } + switch (source[0]) { + case " ": + case " ": + return "space"; + case "#": + return "comment"; + case "%": + return "directive-line"; + case "*": + return "alias"; + case "&": + return "anchor"; + case "!": + return "tag"; + case "'": + return "single-quoted-scalar"; + case '"': + return "double-quoted-scalar"; + case "|": + case ">": + return "block-scalar-header"; + } + return null; +} + +// node_modules/yaml/browser/dist/parse/lexer.js +function isEmpty(ch) { + switch (ch) { + case void 0: + case " ": + case "\n": + case "\r": + case " ": + return true; + default: + return false; + } +} +var hexDigits = "0123456789ABCDEFabcdef".split(""); +var tagChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()".split(""); +var invalidFlowScalarChars = ",[]{}".split(""); +var invalidAnchorChars = " ,[]{}\n\r ".split(""); +var isNotAnchorChar = (ch) => !ch || invalidAnchorChars.includes(ch); +var Lexer = class { + constructor() { + this.atEnd = false; + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + this.buffer = ""; + this.flowKey = false; + this.flowLevel = 0; + this.indentNext = 0; + this.indentValue = 0; + this.lineEndPos = null; + this.next = null; + this.pos = 0; + } + *lex(source, incomplete = false) { + var _a; + if (source) { + this.buffer = this.buffer ? this.buffer + source : source; + this.lineEndPos = null; + } + this.atEnd = !incomplete; + let next = (_a = this.next) != null ? _a : "stream"; + while (next && (incomplete || this.hasChars(1))) + next = yield* this.parseNext(next); + } + atLineEnd() { + let i4 = this.pos; + let ch = this.buffer[i4]; + while (ch === " " || ch === " ") + ch = this.buffer[++i4]; + if (!ch || ch === "#" || ch === "\n") + return true; + if (ch === "\r") + return this.buffer[i4 + 1] === "\n"; + return false; + } + charAt(n6) { + return this.buffer[this.pos + n6]; + } + continueScalar(offset) { + let ch = this.buffer[offset]; + if (this.indentNext > 0) { + let indent = 0; + while (ch === " ") + ch = this.buffer[++indent + offset]; + if (ch === "\r") { + const next = this.buffer[indent + offset + 1]; + if (next === "\n" || !next && !this.atEnd) + return offset + indent + 1; + } + return ch === "\n" || indent >= this.indentNext || !ch && !this.atEnd ? offset + indent : -1; + } + if (ch === "-" || ch === ".") { + const dt = this.buffer.substr(offset, 3); + if ((dt === "---" || dt === "...") && isEmpty(this.buffer[offset + 3])) + return -1; + } + return offset; + } + getLine() { + let end = this.lineEndPos; + if (typeof end !== "number" || end !== -1 && end < this.pos) { + end = this.buffer.indexOf("\n", this.pos); + this.lineEndPos = end; + } + if (end === -1) + return this.atEnd ? this.buffer.substring(this.pos) : null; + if (this.buffer[end - 1] === "\r") + end -= 1; + return this.buffer.substring(this.pos, end); + } + hasChars(n6) { + return this.pos + n6 <= this.buffer.length; + } + setNext(state) { + this.buffer = this.buffer.substring(this.pos); + this.pos = 0; + this.lineEndPos = null; + this.next = state; + return null; + } + peek(n6) { + return this.buffer.substr(this.pos, n6); + } + *parseNext(next) { + switch (next) { + case "stream": + return yield* this.parseStream(); + case "line-start": + return yield* this.parseLineStart(); + case "block-start": + return yield* this.parseBlockStart(); + case "doc": + return yield* this.parseDocument(); + case "flow": + return yield* this.parseFlowCollection(); + case "quoted-scalar": + return yield* this.parseQuotedScalar(); + case "block-scalar": + return yield* this.parseBlockScalar(); + case "plain-scalar": + return yield* this.parsePlainScalar(); + } + } + *parseStream() { + let line = this.getLine(); + if (line === null) + return this.setNext("stream"); + if (line[0] === BOM) { + yield* this.pushCount(1); + line = line.substring(1); + } + if (line[0] === "%") { + let dirEnd = line.length; + const cs = line.indexOf("#"); + if (cs !== -1) { + const ch = line[cs - 1]; + if (ch === " " || ch === " ") + dirEnd = cs - 1; + } + while (true) { + const ch = line[dirEnd - 1]; + if (ch === " " || ch === " ") + dirEnd -= 1; + else + break; + } + const n6 = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true)); + yield* this.pushCount(line.length - n6); + this.pushNewline(); + return "stream"; + } + if (this.atLineEnd()) { + const sp = yield* this.pushSpaces(true); + yield* this.pushCount(line.length - sp); + yield* this.pushNewline(); + return "stream"; + } + yield DOCUMENT; + return yield* this.parseLineStart(); + } + *parseLineStart() { + const ch = this.charAt(0); + if (!ch && !this.atEnd) + return this.setNext("line-start"); + if (ch === "-" || ch === ".") { + if (!this.atEnd && !this.hasChars(4)) + return this.setNext("line-start"); + const s5 = this.peek(3); + if (s5 === "---" && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + this.indentValue = 0; + this.indentNext = 0; + return "doc"; + } else if (s5 === "..." && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + return "stream"; + } + } + this.indentValue = yield* this.pushSpaces(false); + if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1))) + this.indentNext = this.indentValue; + return yield* this.parseBlockStart(); + } + *parseBlockStart() { + const [ch0, ch1] = this.peek(2); + if (!ch1 && !this.atEnd) + return this.setNext("block-start"); + if ((ch0 === "-" || ch0 === "?" || ch0 === ":") && isEmpty(ch1)) { + const n6 = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)); + this.indentNext = this.indentValue + 1; + this.indentValue += n6; + return yield* this.parseBlockStart(); + } + return "doc"; + } + *parseDocument() { + yield* this.pushSpaces(true); + const line = this.getLine(); + if (line === null) + return this.setNext("doc"); + let n6 = yield* this.pushIndicators(); + switch (line[n6]) { + case "#": + yield* this.pushCount(line.length - n6); + case void 0: + yield* this.pushNewline(); + return yield* this.parseLineStart(); + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel = 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + return "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "doc"; + case '"': + case "'": + return yield* this.parseQuotedScalar(); + case "|": + case ">": + n6 += yield* this.parseBlockScalarHeader(); + n6 += yield* this.pushSpaces(true); + yield* this.pushCount(line.length - n6); + yield* this.pushNewline(); + return yield* this.parseBlockScalar(); + default: + return yield* this.parsePlainScalar(); + } + } + *parseFlowCollection() { + let nl, sp; + let indent = -1; + do { + nl = yield* this.pushNewline(); + if (nl > 0) { + sp = yield* this.pushSpaces(false); + this.indentValue = indent = sp; + } else { + sp = 0; + } + sp += yield* this.pushSpaces(true); + } while (nl + sp > 0); + const line = this.getLine(); + if (line === null) + return this.setNext("flow"); + if (indent !== -1 && indent < this.indentNext && line[0] !== "#" || indent === 0 && (line.startsWith("---") || line.startsWith("...")) && isEmpty(line[3])) { + const atFlowEndMarker = indent === this.indentNext - 1 && this.flowLevel === 1 && (line[0] === "]" || line[0] === "}"); + if (!atFlowEndMarker) { + this.flowLevel = 0; + yield FLOW_END; + return yield* this.parseLineStart(); + } + } + let n6 = 0; + while (line[n6] === ",") { + n6 += yield* this.pushCount(1); + n6 += yield* this.pushSpaces(true); + this.flowKey = false; + } + n6 += yield* this.pushIndicators(); + switch (line[n6]) { + case void 0: + return "flow"; + case "#": + yield* this.pushCount(line.length - n6); + return "flow"; + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel += 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + this.flowKey = true; + this.flowLevel -= 1; + return this.flowLevel ? "flow" : "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "flow"; + case '"': + case "'": + this.flowKey = true; + return yield* this.parseQuotedScalar(); + case ":": { + const next = this.charAt(1); + if (this.flowKey || isEmpty(next) || next === ",") { + this.flowKey = false; + yield* this.pushCount(1); + yield* this.pushSpaces(true); + return "flow"; + } + } + default: + this.flowKey = false; + return yield* this.parsePlainScalar(); + } + } + *parseQuotedScalar() { + const quote = this.charAt(0); + let end = this.buffer.indexOf(quote, this.pos + 1); + if (quote === "'") { + while (end !== -1 && this.buffer[end + 1] === "'") + end = this.buffer.indexOf("'", end + 2); + } else { + while (end !== -1) { + let n6 = 0; + while (this.buffer[end - 1 - n6] === "\\") + n6 += 1; + if (n6 % 2 === 0) + break; + end = this.buffer.indexOf('"', end + 1); + } + } + const qb = this.buffer.substring(0, end); + let nl = qb.indexOf("\n", this.pos); + if (nl !== -1) { + while (nl !== -1) { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = qb.indexOf("\n", cs); + } + if (nl !== -1) { + end = nl - (qb[nl - 1] === "\r" ? 2 : 1); + } + } + if (end === -1) { + if (!this.atEnd) + return this.setNext("quoted-scalar"); + end = this.buffer.length; + } + yield* this.pushToIndex(end + 1, false); + return this.flowLevel ? "flow" : "doc"; + } + *parseBlockScalarHeader() { + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + let i4 = this.pos; + while (true) { + const ch = this.buffer[++i4]; + if (ch === "+") + this.blockScalarKeep = true; + else if (ch > "0" && ch <= "9") + this.blockScalarIndent = Number(ch) - 1; + else if (ch !== "-") + break; + } + return yield* this.pushUntil((ch) => isEmpty(ch) || ch === "#"); + } + *parseBlockScalar() { + let nl = this.pos - 1; + let indent = 0; + let ch; + loop: + for (let i4 = this.pos; ch = this.buffer[i4]; ++i4) { + switch (ch) { + case " ": + indent += 1; + break; + case "\n": + nl = i4; + indent = 0; + break; + case "\r": { + const next = this.buffer[i4 + 1]; + if (!next && !this.atEnd) + return this.setNext("block-scalar"); + if (next === "\n") + break; + } + default: + break loop; + } + } + if (!ch && !this.atEnd) + return this.setNext("block-scalar"); + if (indent >= this.indentNext) { + if (this.blockScalarIndent === -1) + this.indentNext = indent; + else + this.indentNext += this.blockScalarIndent; + do { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = this.buffer.indexOf("\n", cs); + } while (nl !== -1); + if (nl === -1) { + if (!this.atEnd) + return this.setNext("block-scalar"); + nl = this.buffer.length; + } + } + if (!this.blockScalarKeep) { + do { + let i4 = nl - 1; + let ch2 = this.buffer[i4]; + if (ch2 === "\r") + ch2 = this.buffer[--i4]; + const lastChar = i4; + while (ch2 === " " || ch2 === " ") + ch2 = this.buffer[--i4]; + if (ch2 === "\n" && i4 >= this.pos && i4 + 1 + indent > lastChar) + nl = i4; + else + break; + } while (true); + } + yield SCALAR2; + yield* this.pushToIndex(nl + 1, true); + return yield* this.parseLineStart(); + } + *parsePlainScalar() { + const inFlow = this.flowLevel > 0; + let end = this.pos - 1; + let i4 = this.pos - 1; + let ch; + while (ch = this.buffer[++i4]) { + if (ch === ":") { + const next = this.buffer[i4 + 1]; + if (isEmpty(next) || inFlow && next === ",") + break; + end = i4; + } else if (isEmpty(ch)) { + let next = this.buffer[i4 + 1]; + if (ch === "\r") { + if (next === "\n") { + i4 += 1; + ch = "\n"; + next = this.buffer[i4 + 1]; + } else + end = i4; + } + if (next === "#" || inFlow && invalidFlowScalarChars.includes(next)) + break; + if (ch === "\n") { + const cs = this.continueScalar(i4 + 1); + if (cs === -1) + break; + i4 = Math.max(i4, cs - 2); + } + } else { + if (inFlow && invalidFlowScalarChars.includes(ch)) + break; + end = i4; + } + } + if (!ch && !this.atEnd) + return this.setNext("plain-scalar"); + yield SCALAR2; + yield* this.pushToIndex(end + 1, true); + return inFlow ? "flow" : "doc"; + } + *pushCount(n6) { + if (n6 > 0) { + yield this.buffer.substr(this.pos, n6); + this.pos += n6; + return n6; + } + return 0; + } + *pushToIndex(i4, allowEmpty) { + const s5 = this.buffer.slice(this.pos, i4); + if (s5) { + yield s5; + this.pos += s5.length; + return s5.length; + } else if (allowEmpty) + yield ""; + return 0; + } + *pushIndicators() { + switch (this.charAt(0)) { + case "!": + return (yield* this.pushTag()) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "&": + return (yield* this.pushUntil(isNotAnchorChar)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "-": + case "?": + case ":": { + const inFlow = this.flowLevel > 0; + const ch1 = this.charAt(1); + if (isEmpty(ch1) || inFlow && invalidFlowScalarChars.includes(ch1)) { + if (!inFlow) + this.indentNext = this.indentValue + 1; + else if (this.flowKey) + this.flowKey = false; + return (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + } + } + } + return 0; + } + *pushTag() { + if (this.charAt(1) === "<") { + let i4 = this.pos + 2; + let ch = this.buffer[i4]; + while (!isEmpty(ch) && ch !== ">") + ch = this.buffer[++i4]; + return yield* this.pushToIndex(ch === ">" ? i4 + 1 : i4, false); + } else { + let i4 = this.pos + 1; + let ch = this.buffer[i4]; + while (ch) { + if (tagChars.includes(ch)) + ch = this.buffer[++i4]; + else if (ch === "%" && hexDigits.includes(this.buffer[i4 + 1]) && hexDigits.includes(this.buffer[i4 + 2])) { + ch = this.buffer[i4 += 3]; + } else + break; + } + return yield* this.pushToIndex(i4, false); + } + } + *pushNewline() { + const ch = this.buffer[this.pos]; + if (ch === "\n") + return yield* this.pushCount(1); + else if (ch === "\r" && this.charAt(1) === "\n") + return yield* this.pushCount(2); + else + return 0; + } + *pushSpaces(allowTabs) { + let i4 = this.pos - 1; + let ch; + do { + ch = this.buffer[++i4]; + } while (ch === " " || allowTabs && ch === " "); + const n6 = i4 - this.pos; + if (n6 > 0) { + yield this.buffer.substr(this.pos, n6); + this.pos = i4; + } + return n6; + } + *pushUntil(test) { + let i4 = this.pos; + let ch = this.buffer[i4]; + while (!test(ch)) + ch = this.buffer[++i4]; + return yield* this.pushToIndex(i4, false); + } +}; + +// node_modules/yaml/browser/dist/parse/line-counter.js +var LineCounter = class { + constructor() { + this.lineStarts = []; + this.addNewLine = (offset) => this.lineStarts.push(offset); + this.linePos = (offset) => { + let low = 0; + let high = this.lineStarts.length; + while (low < high) { + const mid = low + high >> 1; + if (this.lineStarts[mid] < offset) + low = mid + 1; + else + high = mid; + } + if (this.lineStarts[low] === offset) + return { line: low + 1, col: 1 }; + if (low === 0) + return { line: 0, col: offset }; + const start = this.lineStarts[low - 1]; + return { line: low, col: offset - start + 1 }; + }; + } +}; + +// node_modules/yaml/browser/dist/parse/parser.js +function includesToken(list, type) { + for (let i4 = 0; i4 < list.length; ++i4) + if (list[i4].type === type) + return true; + return false; +} +function findNonEmptyIndex(list) { + for (let i4 = 0; i4 < list.length; ++i4) { + switch (list[i4].type) { + case "space": + case "comment": + case "newline": + break; + default: + return i4; + } + } + return -1; +} +function isFlowToken(token) { + switch (token == null ? void 0 : token.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "flow-collection": + return true; + default: + return false; + } +} +function getPrevProps(parent) { + var _a; + switch (parent.type) { + case "document": + return parent.start; + case "block-map": { + const it = parent.items[parent.items.length - 1]; + return (_a = it.sep) != null ? _a : it.start; + } + case "block-seq": + return parent.items[parent.items.length - 1].start; + default: + return []; + } +} +function getFirstKeyStartProps(prev) { + var _a; + if (prev.length === 0) + return []; + let i4 = prev.length; + loop: + while (--i4 >= 0) { + switch (prev[i4].type) { + case "doc-start": + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + case "newline": + break loop; + } + } + while (((_a = prev[++i4]) == null ? void 0 : _a.type) === "space") { + } + return prev.splice(i4, prev.length); +} +function fixFlowSeqItems(fc) { + if (fc.start.type === "flow-seq-start") { + for (const it of fc.items) { + if (it.sep && !it.value && !includesToken(it.start, "explicit-key-ind") && !includesToken(it.sep, "map-value-ind")) { + if (it.key) + it.value = it.key; + delete it.key; + if (isFlowToken(it.value)) { + if (it.value.end) + Array.prototype.push.apply(it.value.end, it.sep); + else + it.value.end = it.sep; + } else + Array.prototype.push.apply(it.start, it.sep); + delete it.sep; + } + } + } +} +var Parser = class { + constructor(onNewLine) { + this.atNewLine = true; + this.atScalar = false; + this.indent = 0; + this.offset = 0; + this.onKeyLine = false; + this.stack = []; + this.source = ""; + this.type = ""; + this.lexer = new Lexer(); + this.onNewLine = onNewLine; + } + *parse(source, incomplete = false) { + if (this.onNewLine && this.offset === 0) + this.onNewLine(0); + for (const lexeme of this.lexer.lex(source, incomplete)) + yield* this.next(lexeme); + if (!incomplete) + yield* this.end(); + } + *next(source) { + this.source = source; + if (this.atScalar) { + this.atScalar = false; + yield* this.step(); + this.offset += source.length; + return; + } + const type = tokenType(source); + if (!type) { + const message = `Not a YAML token: ${source}`; + yield* this.pop({ type: "error", offset: this.offset, message, source }); + this.offset += source.length; + } else if (type === "scalar") { + this.atNewLine = false; + this.atScalar = true; + this.type = "scalar"; + } else { + this.type = type; + yield* this.step(); + switch (type) { + case "newline": + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) + this.onNewLine(this.offset + source.length); + break; + case "space": + if (this.atNewLine && source[0] === " ") + this.indent += source.length; + break; + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + if (this.atNewLine) + this.indent += source.length; + break; + case "doc-mode": + case "flow-error-end": + return; + default: + this.atNewLine = false; + } + this.offset += source.length; + } + } + *end() { + while (this.stack.length > 0) + yield* this.pop(); + } + get sourceToken() { + const st = { + type: this.type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + return st; + } + *step() { + const top = this.peek(1); + if (this.type === "doc-end" && (!top || top.type !== "doc-end")) { + while (this.stack.length > 0) + yield* this.pop(); + this.stack.push({ + type: "doc-end", + offset: this.offset, + source: this.source + }); + return; + } + if (!top) + return yield* this.stream(); + switch (top.type) { + case "document": + return yield* this.document(top); + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return yield* this.scalar(top); + case "block-scalar": + return yield* this.blockScalar(top); + case "block-map": + return yield* this.blockMap(top); + case "block-seq": + return yield* this.blockSequence(top); + case "flow-collection": + return yield* this.flowCollection(top); + case "doc-end": + return yield* this.documentEnd(top); + } + yield* this.pop(); + } + peek(n6) { + return this.stack[this.stack.length - n6]; + } + *pop(error) { + const token = error != null ? error : this.stack.pop(); + if (!token) { + const message = "Tried to pop an empty stack"; + yield { type: "error", offset: this.offset, source: "", message }; + } else if (this.stack.length === 0) { + yield token; + } else { + const top = this.peek(1); + if (token.type === "block-scalar") { + token.indent = "indent" in top ? top.indent : 0; + } else if (token.type === "flow-collection" && top.type === "document") { + token.indent = 0; + } + if (token.type === "flow-collection") + fixFlowSeqItems(token); + switch (top.type) { + case "document": + top.value = token; + break; + case "block-scalar": + top.props.push(token); + break; + case "block-map": { + const it = top.items[top.items.length - 1]; + if (it.value) { + top.items.push({ start: [], key: token, sep: [] }); + this.onKeyLine = true; + return; + } else if (it.sep) { + it.value = token; + } else { + Object.assign(it, { key: token, sep: [] }); + this.onKeyLine = !includesToken(it.start, "explicit-key-ind"); + return; + } + break; + } + case "block-seq": { + const it = top.items[top.items.length - 1]; + if (it.value) + top.items.push({ start: [], value: token }); + else + it.value = token; + break; + } + case "flow-collection": { + const it = top.items[top.items.length - 1]; + if (!it || it.value) + top.items.push({ start: [], key: token, sep: [] }); + else if (it.sep) + it.value = token; + else + Object.assign(it, { key: token, sep: [] }); + return; + } + default: + yield* this.pop(); + yield* this.pop(token); + } + if ((top.type === "document" || top.type === "block-map" || top.type === "block-seq") && (token.type === "block-map" || token.type === "block-seq")) { + const last = token.items[token.items.length - 1]; + if (last && !last.sep && !last.value && last.start.length > 0 && findNonEmptyIndex(last.start) === -1 && (token.indent === 0 || last.start.every((st) => st.type !== "comment" || st.indent < token.indent))) { + if (top.type === "document") + top.end = last.start; + else + top.items.push({ start: last.start }); + token.items.splice(-1, 1); + } + } + } + } + *stream() { + switch (this.type) { + case "directive-line": + yield { type: "directive", offset: this.offset, source: this.source }; + return; + case "byte-order-mark": + case "space": + case "comment": + case "newline": + yield this.sourceToken; + return; + case "doc-mode": + case "doc-start": { + const doc = { + type: "document", + offset: this.offset, + start: [] + }; + if (this.type === "doc-start") + doc.start.push(this.sourceToken); + this.stack.push(doc); + return; + } + } + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML stream`, + source: this.source + }; + } + *document(doc) { + if (doc.value) + return yield* this.lineEnd(doc); + switch (this.type) { + case "doc-start": { + if (findNonEmptyIndex(doc.start) !== -1) { + yield* this.pop(); + yield* this.step(); + } else + doc.start.push(this.sourceToken); + return; + } + case "anchor": + case "tag": + case "space": + case "comment": + case "newline": + doc.start.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(doc); + if (bv) + this.stack.push(bv); + else { + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML document`, + source: this.source + }; + } + } + *scalar(scalar) { + if (this.type === "map-value-ind") { + const prev = getPrevProps(this.peek(2)); + const start = getFirstKeyStartProps(prev); + let sep; + if (scalar.end) { + sep = scalar.end; + sep.push(this.sourceToken); + delete scalar.end; + } else + sep = [this.sourceToken]; + const map2 = { + type: "block-map", + offset: scalar.offset, + indent: scalar.indent, + items: [{ start, key: scalar, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map2; + } else + yield* this.lineEnd(scalar); + } + *blockScalar(scalar) { + switch (this.type) { + case "space": + case "comment": + case "newline": + scalar.props.push(this.sourceToken); + return; + case "scalar": + scalar.source = this.source; + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + yield* this.pop(); + break; + default: + yield* this.pop(); + yield* this.step(); + } + } + *blockMap(map2) { + var _a; + const it = map2.items[map2.items.length - 1]; + switch (this.type) { + case "newline": + this.onKeyLine = false; + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + map2.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "space": + case "comment": + if (it.value) { + map2.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + if (this.atIndentedComment(it.start, map2.indent)) { + const prev = map2.items[map2.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + map2.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + } + if (this.indent >= map2.indent) { + const atNextItem = !this.onKeyLine && this.indent === map2.indent && it.sep; + let start = []; + if (atNextItem && it.sep && !it.value) { + const nl = []; + for (let i4 = 0; i4 < it.sep.length; ++i4) { + const st = it.sep[i4]; + switch (st.type) { + case "newline": + nl.push(i4); + break; + case "space": + break; + case "comment": + if (st.indent > map2.indent) + nl.length = 0; + break; + default: + nl.length = 0; + } + } + if (nl.length >= 2) + start = it.sep.splice(nl[1]); + } + switch (this.type) { + case "anchor": + case "tag": + if (atNextItem || it.value) { + start.push(this.sourceToken); + map2.items.push({ start }); + this.onKeyLine = true; + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "explicit-key-ind": + if (!it.sep && !includesToken(it.start, "explicit-key-ind")) { + it.start.push(this.sourceToken); + } else if (atNextItem || it.value) { + start.push(this.sourceToken); + map2.items.push({ start }); + } else { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }); + } + this.onKeyLine = true; + return; + case "map-value-ind": + if (includesToken(it.start, "explicit-key-ind")) { + if (!it.sep) { + if (includesToken(it.start, "newline")) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else { + const start2 = getFirstKeyStartProps(it.start); + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key: null, sep: [this.sourceToken] }] + }); + } + } else if (it.value) { + map2.items.push({ start: [], key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }); + } else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) { + const start2 = getFirstKeyStartProps(it.start); + const key = it.key; + const sep = it.sep; + sep.push(this.sourceToken); + delete it.key, delete it.sep; + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key, sep }] + }); + } else if (start.length > 0) { + it.sep = it.sep.concat(start, this.sourceToken); + } else { + it.sep.push(this.sourceToken); + } + } else { + if (!it.sep) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else if (it.value || atNextItem) { + map2.items.push({ start, key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [], key: null, sep: [this.sourceToken] }] + }); + } else { + it.sep.push(this.sourceToken); + } + } + this.onKeyLine = true; + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs = this.flowScalar(this.type); + if (atNextItem || it.value) { + map2.items.push({ start, key: fs, sep: [] }); + this.onKeyLine = true; + } else if (it.sep) { + this.stack.push(fs); + } else { + Object.assign(it, { key: fs, sep: [] }); + this.onKeyLine = true; + } + return; + } + default: { + const bv = this.startBlockValue(map2); + if (bv) { + if (atNextItem && bv.type !== "block-seq" && includesToken(it.start, "explicit-key-ind")) { + map2.items.push({ start }); + } + this.stack.push(bv); + return; + } + } + } + } + yield* this.pop(); + yield* this.step(); + } + *blockSequence(seq2) { + var _a; + const it = seq2.items[seq2.items.length - 1]; + switch (this.type) { + case "newline": + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + seq2.items.push({ start: [this.sourceToken] }); + } else + it.start.push(this.sourceToken); + return; + case "space": + case "comment": + if (it.value) + seq2.items.push({ start: [this.sourceToken] }); + else { + if (this.atIndentedComment(it.start, seq2.indent)) { + const prev = seq2.items[seq2.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + seq2.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + case "anchor": + case "tag": + if (it.value || this.indent <= seq2.indent) + break; + it.start.push(this.sourceToken); + return; + case "seq-item-ind": + if (this.indent !== seq2.indent) + break; + if (it.value || includesToken(it.start, "seq-item-ind")) + seq2.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + } + if (this.indent > seq2.indent) { + const bv = this.startBlockValue(seq2); + if (bv) { + this.stack.push(bv); + return; + } + } + yield* this.pop(); + yield* this.step(); + } + *flowCollection(fc) { + const it = fc.items[fc.items.length - 1]; + if (this.type === "flow-error-end") { + let top; + do { + yield* this.pop(); + top = this.peek(1); + } while (top && top.type === "flow-collection"); + } else if (fc.end.length === 0) { + switch (this.type) { + case "comma": + case "explicit-key-ind": + if (!it || it.sep) + fc.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + case "map-value-ind": + if (!it || it.value) + fc.items.push({ start: [], key: null, sep: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + Object.assign(it, { key: null, sep: [this.sourceToken] }); + return; + case "space": + case "comment": + case "newline": + case "anchor": + case "tag": + if (!it || it.value) + fc.items.push({ start: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + it.start.push(this.sourceToken); + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs = this.flowScalar(this.type); + if (!it || it.value) + fc.items.push({ start: [], key: fs, sep: [] }); + else if (it.sep) + this.stack.push(fs); + else + Object.assign(it, { key: fs, sep: [] }); + return; + } + case "flow-map-end": + case "flow-seq-end": + fc.end.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(fc); + if (bv) + this.stack.push(bv); + else { + yield* this.pop(); + yield* this.step(); + } + } else { + const parent = this.peek(2); + if (parent.type === "block-map" && (this.type === "map-value-ind" && parent.indent === fc.indent || this.type === "newline" && !parent.items[parent.items.length - 1].sep)) { + yield* this.pop(); + yield* this.step(); + } else if (this.type === "map-value-ind" && parent.type !== "flow-collection") { + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + fixFlowSeqItems(fc); + const sep = fc.end.splice(1, fc.end.length); + sep.push(this.sourceToken); + const map2 = { + type: "block-map", + offset: fc.offset, + indent: fc.indent, + items: [{ start, key: fc, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map2; + } else { + yield* this.lineEnd(fc); + } + } + } + flowScalar(type) { + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + return { + type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + } + startBlockValue(parent) { + switch (this.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return this.flowScalar(this.type); + case "block-scalar-header": + return { + type: "block-scalar", + offset: this.offset, + indent: this.indent, + props: [this.sourceToken], + source: "" + }; + case "flow-map-start": + case "flow-seq-start": + return { + type: "flow-collection", + offset: this.offset, + indent: this.indent, + start: this.sourceToken, + items: [], + end: [] + }; + case "seq-item-ind": + return { + type: "block-seq", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }; + case "explicit-key-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + start.push(this.sourceToken); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start }] + }; + } + case "map-value-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }; + } + } + return null; + } + atIndentedComment(start, indent) { + if (this.type !== "comment") + return false; + if (this.indent <= indent) + return false; + return start.every((st) => st.type === "newline" || st.type === "space"); + } + *documentEnd(docEnd) { + if (this.type !== "doc-mode") { + if (docEnd.end) + docEnd.end.push(this.sourceToken); + else + docEnd.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } + *lineEnd(token) { + switch (this.type) { + case "comma": + case "doc-start": + case "doc-end": + case "flow-seq-end": + case "flow-map-end": + case "map-value-ind": + yield* this.pop(); + yield* this.step(); + break; + case "newline": + this.onKeyLine = false; + case "space": + case "comment": + default: + if (token.end) + token.end.push(this.sourceToken); + else + token.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } +}; + +// node_modules/yaml/browser/dist/public-api.js +function parseOptions(options) { + const prettyErrors = options.prettyErrors !== false; + const lineCounter = options.lineCounter || prettyErrors && new LineCounter() || null; + return { lineCounter, prettyErrors }; +} +function parseDocument(source, options = {}) { + const { lineCounter, prettyErrors } = parseOptions(options); + const parser = new Parser(lineCounter == null ? void 0 : lineCounter.addNewLine); + const composer = new Composer(options); + let doc = null; + for (const _doc of composer.compose(parser.parse(source), true, source.length)) { + if (!doc) + doc = _doc; + else if (doc.options.logLevel !== "silent") { + doc.errors.push(new YAMLParseError(_doc.range.slice(0, 2), "MULTIPLE_DOCS", "Source contains multiple documents; please use YAML.parseAllDocuments()")); + break; + } + } + if (prettyErrors && lineCounter) { + doc.errors.forEach(prettifyError(source, lineCounter)); + doc.warnings.forEach(prettifyError(source, lineCounter)); + } + return doc; +} +function parse2(src, reviver, options) { + let _reviver = void 0; + if (typeof reviver === "function") { + _reviver = reviver; + } else if (options === void 0 && reviver && typeof reviver === "object") { + options = reviver; + } + const doc = parseDocument(src, options); + if (!doc) + return null; + doc.warnings.forEach((warning) => warn(doc.options.logLevel, warning)); + if (doc.errors.length > 0) { + if (doc.options.logLevel !== "silent") + throw doc.errors[0]; + else + doc.errors = []; + } + return doc.toJS(Object.assign({ reviver: _reviver }, options)); +} + +// node_modules/tslib/modules/index.js +var import_tslib = __toESM(require_tslib(), 1); +var { + __extends, + __assign, + __rest, + __decorate, + __param, + __metadata, + __awaiter, + __generator, + __exportStar, + __createBinding, + __values, + __read, + __spread, + __spreadArrays, + __spreadArray, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet, + __classPrivateFieldIn +} = import_tslib.default; + +// node_modules/rxjs/dist/esm5/internal/util/isFunction.js +function isFunction(value) { + return typeof value === "function"; +} + +// node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js +function createErrorClass(createImpl) { + var _super = function(instance) { + Error.call(instance); + instance.stack = new Error().stack; + }; + var ctorFunc = createImpl(_super); + ctorFunc.prototype = Object.create(Error.prototype); + ctorFunc.prototype.constructor = ctorFunc; + return ctorFunc; +} + +// node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js +var UnsubscriptionError = createErrorClass(function(_super) { + return function UnsubscriptionErrorImpl(errors) { + _super(this); + this.message = errors ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function(err, i4) { + return i4 + 1 + ") " + err.toString(); + }).join("\n ") : ""; + this.name = "UnsubscriptionError"; + this.errors = errors; + }; +}); + +// node_modules/rxjs/dist/esm5/internal/util/arrRemove.js +function arrRemove(arr, item) { + if (arr) { + var index = arr.indexOf(item); + 0 <= index && arr.splice(index, 1); + } +} + +// node_modules/rxjs/dist/esm5/internal/Subscription.js +var Subscription = function() { + function Subscription3(initialTeardown) { + this.initialTeardown = initialTeardown; + this.closed = false; + this._parentage = null; + this._finalizers = null; + } + Subscription3.prototype.unsubscribe = function() { + var e_1, _a, e_2, _b; + var errors; + if (!this.closed) { + this.closed = true; + var _parentage = this._parentage; + if (_parentage) { + this._parentage = null; + if (Array.isArray(_parentage)) { + try { + for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) { + var parent_1 = _parentage_1_1.value; + parent_1.remove(this); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) + _a.call(_parentage_1); + } finally { + if (e_1) + throw e_1.error; + } + } + } else { + _parentage.remove(this); + } + } + var initialFinalizer = this.initialTeardown; + if (isFunction(initialFinalizer)) { + try { + initialFinalizer(); + } catch (e7) { + errors = e7 instanceof UnsubscriptionError ? e7.errors : [e7]; + } + } + var _finalizers = this._finalizers; + if (_finalizers) { + this._finalizers = null; + try { + for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) { + var finalizer = _finalizers_1_1.value; + try { + execFinalizer(finalizer); + } catch (err) { + errors = errors !== null && errors !== void 0 ? errors : []; + if (err instanceof UnsubscriptionError) { + errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors)); + } else { + errors.push(err); + } + } + } + } catch (e_2_1) { + e_2 = { error: e_2_1 }; + } finally { + try { + if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) + _b.call(_finalizers_1); + } finally { + if (e_2) + throw e_2.error; + } + } + } + if (errors) { + throw new UnsubscriptionError(errors); + } + } + }; + Subscription3.prototype.add = function(teardown) { + var _a; + if (teardown && teardown !== this) { + if (this.closed) { + execFinalizer(teardown); + } else { + if (teardown instanceof Subscription3) { + if (teardown.closed || teardown._hasParent(this)) { + return; + } + teardown._addParent(this); + } + (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown); + } + } + }; + Subscription3.prototype._hasParent = function(parent) { + var _parentage = this._parentage; + return _parentage === parent || Array.isArray(_parentage) && _parentage.includes(parent); + }; + Subscription3.prototype._addParent = function(parent) { + var _parentage = this._parentage; + this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent; + }; + Subscription3.prototype._removeParent = function(parent) { + var _parentage = this._parentage; + if (_parentage === parent) { + this._parentage = null; + } else if (Array.isArray(_parentage)) { + arrRemove(_parentage, parent); + } + }; + Subscription3.prototype.remove = function(teardown) { + var _finalizers = this._finalizers; + _finalizers && arrRemove(_finalizers, teardown); + if (teardown instanceof Subscription3) { + teardown._removeParent(this); + } + }; + Subscription3.EMPTY = function() { + var empty = new Subscription3(); + empty.closed = true; + return empty; + }(); + return Subscription3; +}(); +var EMPTY_SUBSCRIPTION = Subscription.EMPTY; +function isSubscription(value) { + return value instanceof Subscription || value && "closed" in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe); +} +function execFinalizer(finalizer) { + if (isFunction(finalizer)) { + finalizer(); + } else { + finalizer.unsubscribe(); + } +} + +// node_modules/rxjs/dist/esm5/internal/config.js +var config = { + onUnhandledError: null, + onStoppedNotification: null, + Promise: void 0, + useDeprecatedSynchronousErrorHandling: false, + useDeprecatedNextContext: false +}; + +// node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js +var timeoutProvider = { + setTimeout: function(handler, timeout) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + var delegate = timeoutProvider.delegate; + if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) { + return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args))); + } + return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args))); + }, + clearTimeout: function(handle) { + var delegate = timeoutProvider.delegate; + return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle); + }, + delegate: void 0 +}; + +// node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js +function reportUnhandledError(err) { + timeoutProvider.setTimeout(function() { + var onUnhandledError = config.onUnhandledError; + if (onUnhandledError) { + onUnhandledError(err); + } else { + throw err; + } + }); +} + +// node_modules/rxjs/dist/esm5/internal/util/noop.js +function noop() { +} + +// node_modules/rxjs/dist/esm5/internal/NotificationFactories.js +var COMPLETE_NOTIFICATION = function() { + return createNotification("C", void 0, void 0); +}(); +function errorNotification(error) { + return createNotification("E", void 0, error); +} +function nextNotification(value) { + return createNotification("N", value, void 0); +} +function createNotification(kind, value, error) { + return { + kind, + value, + error + }; +} + +// node_modules/rxjs/dist/esm5/internal/util/errorContext.js +var context = null; +function errorContext(cb) { + if (config.useDeprecatedSynchronousErrorHandling) { + var isRoot = !context; + if (isRoot) { + context = { errorThrown: false, error: null }; + } + cb(); + if (isRoot) { + var _a = context, errorThrown = _a.errorThrown, error = _a.error; + context = null; + if (errorThrown) { + throw error; + } + } + } else { + cb(); + } +} +function captureError(err) { + if (config.useDeprecatedSynchronousErrorHandling && context) { + context.errorThrown = true; + context.error = err; + } +} + +// node_modules/rxjs/dist/esm5/internal/Subscriber.js +var Subscriber = function(_super) { + __extends(Subscriber2, _super); + function Subscriber2(destination) { + var _this = _super.call(this) || this; + _this.isStopped = false; + if (destination) { + _this.destination = destination; + if (isSubscription(destination)) { + destination.add(_this); + } + } else { + _this.destination = EMPTY_OBSERVER; + } + return _this; + } + Subscriber2.create = function(next, error, complete) { + return new SafeSubscriber(next, error, complete); + }; + Subscriber2.prototype.next = function(value) { + if (this.isStopped) { + handleStoppedNotification(nextNotification(value), this); + } else { + this._next(value); + } + }; + Subscriber2.prototype.error = function(err) { + if (this.isStopped) { + handleStoppedNotification(errorNotification(err), this); + } else { + this.isStopped = true; + this._error(err); + } + }; + Subscriber2.prototype.complete = function() { + if (this.isStopped) { + handleStoppedNotification(COMPLETE_NOTIFICATION, this); + } else { + this.isStopped = true; + this._complete(); + } + }; + Subscriber2.prototype.unsubscribe = function() { + if (!this.closed) { + this.isStopped = true; + _super.prototype.unsubscribe.call(this); + this.destination = null; + } + }; + Subscriber2.prototype._next = function(value) { + this.destination.next(value); + }; + Subscriber2.prototype._error = function(err) { + try { + this.destination.error(err); + } finally { + this.unsubscribe(); + } + }; + Subscriber2.prototype._complete = function() { + try { + this.destination.complete(); + } finally { + this.unsubscribe(); + } + }; + return Subscriber2; +}(Subscription); +var _bind = Function.prototype.bind; +function bind(fn, thisArg) { + return _bind.call(fn, thisArg); +} +var ConsumerObserver = function() { + function ConsumerObserver2(partialObserver) { + this.partialObserver = partialObserver; + } + ConsumerObserver2.prototype.next = function(value) { + var partialObserver = this.partialObserver; + if (partialObserver.next) { + try { + partialObserver.next(value); + } catch (error) { + handleUnhandledError(error); + } + } + }; + ConsumerObserver2.prototype.error = function(err) { + var partialObserver = this.partialObserver; + if (partialObserver.error) { + try { + partialObserver.error(err); + } catch (error) { + handleUnhandledError(error); + } + } else { + handleUnhandledError(err); + } + }; + ConsumerObserver2.prototype.complete = function() { + var partialObserver = this.partialObserver; + if (partialObserver.complete) { + try { + partialObserver.complete(); + } catch (error) { + handleUnhandledError(error); + } + } + }; + return ConsumerObserver2; +}(); +var SafeSubscriber = function(_super) { + __extends(SafeSubscriber2, _super); + function SafeSubscriber2(observerOrNext, error, complete) { + var _this = _super.call(this) || this; + var partialObserver; + if (isFunction(observerOrNext) || !observerOrNext) { + partialObserver = { + next: observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : void 0, + error: error !== null && error !== void 0 ? error : void 0, + complete: complete !== null && complete !== void 0 ? complete : void 0 + }; + } else { + var context_1; + if (_this && config.useDeprecatedNextContext) { + context_1 = Object.create(observerOrNext); + context_1.unsubscribe = function() { + return _this.unsubscribe(); + }; + partialObserver = { + next: observerOrNext.next && bind(observerOrNext.next, context_1), + error: observerOrNext.error && bind(observerOrNext.error, context_1), + complete: observerOrNext.complete && bind(observerOrNext.complete, context_1) + }; + } else { + partialObserver = observerOrNext; + } + } + _this.destination = new ConsumerObserver(partialObserver); + return _this; + } + return SafeSubscriber2; +}(Subscriber); +function handleUnhandledError(error) { + if (config.useDeprecatedSynchronousErrorHandling) { + captureError(error); + } else { + reportUnhandledError(error); + } +} +function defaultErrorHandler(err) { + throw err; +} +function handleStoppedNotification(notification, subscriber) { + var onStoppedNotification = config.onStoppedNotification; + onStoppedNotification && timeoutProvider.setTimeout(function() { + return onStoppedNotification(notification, subscriber); + }); +} +var EMPTY_OBSERVER = { + closed: true, + next: noop, + error: defaultErrorHandler, + complete: noop +}; + +// node_modules/rxjs/dist/esm5/internal/symbol/observable.js +var observable = function() { + return typeof Symbol === "function" && Symbol.observable || "@@observable"; +}(); + +// node_modules/rxjs/dist/esm5/internal/util/identity.js +function identity(x2) { + return x2; +} + +// node_modules/rxjs/dist/esm5/internal/util/pipe.js +function pipeFromArray(fns) { + if (fns.length === 0) { + return identity; + } + if (fns.length === 1) { + return fns[0]; + } + return function piped(input) { + return fns.reduce(function(prev, fn) { + return fn(prev); + }, input); + }; +} + +// node_modules/rxjs/dist/esm5/internal/Observable.js +var Observable = function() { + function Observable2(subscribe) { + if (subscribe) { + this._subscribe = subscribe; + } + } + Observable2.prototype.lift = function(operator) { + var observable2 = new Observable2(); + observable2.source = this; + observable2.operator = operator; + return observable2; + }; + Observable2.prototype.subscribe = function(observerOrNext, error, complete) { + var _this = this; + var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete); + errorContext(function() { + var _a = _this, operator = _a.operator, source = _a.source; + subscriber.add(operator ? operator.call(subscriber, source) : source ? _this._subscribe(subscriber) : _this._trySubscribe(subscriber)); + }); + return subscriber; + }; + Observable2.prototype._trySubscribe = function(sink) { + try { + return this._subscribe(sink); + } catch (err) { + sink.error(err); + } + }; + Observable2.prototype.forEach = function(next, promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function(resolve, reject) { + var subscriber = new SafeSubscriber({ + next: function(value) { + try { + next(value); + } catch (err) { + reject(err); + subscriber.unsubscribe(); + } + }, + error: reject, + complete: resolve + }); + _this.subscribe(subscriber); + }); + }; + Observable2.prototype._subscribe = function(subscriber) { + var _a; + return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber); + }; + Observable2.prototype[observable] = function() { + return this; + }; + Observable2.prototype.pipe = function() { + var operations = []; + for (var _i = 0; _i < arguments.length; _i++) { + operations[_i] = arguments[_i]; + } + return pipeFromArray(operations)(this); + }; + Observable2.prototype.toPromise = function(promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function(resolve, reject) { + var value; + _this.subscribe(function(x2) { + return value = x2; + }, function(err) { + return reject(err); + }, function() { + return resolve(value); + }); + }); + }; + Observable2.create = function(subscribe) { + return new Observable2(subscribe); + }; + return Observable2; +}(); +function getPromiseCtor(promiseCtor) { + var _a; + return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise; +} +function isObserver(value) { + return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete); +} +function isSubscriber(value) { + return value && value instanceof Subscriber || isObserver(value) && isSubscription(value); +} + +// node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js +var dateTimestampProvider = { + now: function() { + return (dateTimestampProvider.delegate || Date).now(); + }, + delegate: void 0 +}; + +// node_modules/rxjs/dist/esm5/internal/scheduler/Action.js +var Action = function(_super) { + __extends(Action2, _super); + function Action2(scheduler, work) { + return _super.call(this) || this; + } + Action2.prototype.schedule = function(state, delay) { + if (delay === void 0) { + delay = 0; + } + return this; + }; + return Action2; +}(Subscription); + +// node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js +var intervalProvider = { + setInterval: function(handler, timeout) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + var delegate = intervalProvider.delegate; + if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) { + return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args))); + } + return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args))); + }, + clearInterval: function(handle) { + var delegate = intervalProvider.delegate; + return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle); + }, + delegate: void 0 +}; + +// node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js +var AsyncAction = function(_super) { + __extends(AsyncAction2, _super); + function AsyncAction2(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + _this.pending = false; + return _this; + } + AsyncAction2.prototype.schedule = function(state, delay) { + if (delay === void 0) { + delay = 0; + } + if (this.closed) { + return this; + } + this.state = state; + var id = this.id; + var scheduler = this.scheduler; + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, delay); + } + this.pending = true; + this.delay = delay; + this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); + return this; + }; + AsyncAction2.prototype.requestAsyncId = function(scheduler, _id, delay) { + if (delay === void 0) { + delay = 0; + } + return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay); + }; + AsyncAction2.prototype.recycleAsyncId = function(_scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if (delay != null && this.delay === delay && this.pending === false) { + return id; + } + intervalProvider.clearInterval(id); + return void 0; + }; + AsyncAction2.prototype.execute = function(state, delay) { + if (this.closed) { + return new Error("executing a cancelled action"); + } + this.pending = false; + var error = this._execute(state, delay); + if (error) { + return error; + } else if (this.pending === false && this.id != null) { + this.id = this.recycleAsyncId(this.scheduler, this.id, null); + } + }; + AsyncAction2.prototype._execute = function(state, _delay) { + var errored = false; + var errorValue; + try { + this.work(state); + } catch (e7) { + errored = true; + errorValue = e7 ? e7 : new Error("Scheduled action threw falsy error"); + } + if (errored) { + this.unsubscribe(); + return errorValue; + } + }; + AsyncAction2.prototype.unsubscribe = function() { + if (!this.closed) { + var _a = this, id = _a.id, scheduler = _a.scheduler; + var actions = scheduler.actions; + this.work = this.state = this.scheduler = null; + this.pending = false; + arrRemove(actions, this); + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, null); + } + this.delay = null; + _super.prototype.unsubscribe.call(this); + } + }; + return AsyncAction2; +}(Action); + +// node_modules/rxjs/dist/esm5/internal/Scheduler.js +var Scheduler = function() { + function Scheduler2(schedulerActionCtor, now) { + if (now === void 0) { + now = Scheduler2.now; + } + this.schedulerActionCtor = schedulerActionCtor; + this.now = now; + } + Scheduler2.prototype.schedule = function(work, delay, state) { + if (delay === void 0) { + delay = 0; + } + return new this.schedulerActionCtor(this, work).schedule(state, delay); + }; + Scheduler2.now = dateTimestampProvider.now; + return Scheduler2; +}(); + +// node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js +var AsyncScheduler = function(_super) { + __extends(AsyncScheduler2, _super); + function AsyncScheduler2(SchedulerAction, now) { + if (now === void 0) { + now = Scheduler.now; + } + var _this = _super.call(this, SchedulerAction, now) || this; + _this.actions = []; + _this._active = false; + _this._scheduled = void 0; + return _this; + } + AsyncScheduler2.prototype.flush = function(action) { + var actions = this.actions; + if (this._active) { + actions.push(action); + return; + } + var error; + this._active = true; + do { + if (error = action.execute(action.state, action.delay)) { + break; + } + } while (action = actions.shift()); + this._active = false; + if (error) { + while (action = actions.shift()) { + action.unsubscribe(); + } + throw error; + } + }; + return AsyncScheduler2; +}(Scheduler); + +// node_modules/rxjs/dist/esm5/internal/scheduler/async.js +var asyncScheduler = new AsyncScheduler(AsyncAction); +var async = asyncScheduler; + +// node_modules/rxjs/dist/esm5/internal/util/isScheduler.js +function isScheduler(value) { + return value && isFunction(value.schedule); +} + +// node_modules/rxjs/dist/esm5/internal/util/isDate.js +function isValidDate(value) { + return value instanceof Date && !isNaN(value); +} + +// node_modules/rxjs/dist/esm5/internal/observable/timer.js +function timer(dueTime, intervalOrScheduler, scheduler) { + if (dueTime === void 0) { + dueTime = 0; + } + if (scheduler === void 0) { + scheduler = async; + } + var intervalDuration = -1; + if (intervalOrScheduler != null) { + if (isScheduler(intervalOrScheduler)) { + scheduler = intervalOrScheduler; + } else { + intervalDuration = intervalOrScheduler; + } + } + return new Observable(function(subscriber) { + var due = isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime; + if (due < 0) { + due = 0; + } + var n6 = 0; + return scheduler.schedule(function() { + if (!subscriber.closed) { + subscriber.next(n6++); + if (0 <= intervalDuration) { + this.schedule(void 0, intervalDuration); + } else { + subscriber.complete(); + } + } + }, due); + }); +} + +// node_modules/rxjs/dist/esm5/internal/observable/interval.js +function interval(period, scheduler) { + if (period === void 0) { + period = 0; + } + if (scheduler === void 0) { + scheduler = asyncScheduler; + } + if (period < 0) { + period = 0; + } + return timer(period, period, scheduler); +} + +// src/main.ts +var AppleRemindersPlugin = class extends import_obsidian4.Plugin { + constructor() { + super(...arguments); + this.elementRegister = {}; + } + message(msg, disappearIn) { + if (disappearIn) { + this.statusBar.setText(msg); + setTimeout(() => { + this.statusBar.setText("\u{1F34E}"); + }, disappearIn); + } else + this.statusBar.setText(msg); + } + onload() { + return __async(this, null, function* () { + yield this.loadSettings(); + this.statusBar = this.addStatusBarItem(); + this.statusBar.setText("Loading Apple Reminders..."); + this.addSettingTab(new SampleSettingTab(this.app, this)); + RemindersDataService.setLogger((x2, timeout) => this.message(x2, timeout)); + RemindersDataService.setSettings(this.settings); + this.registerMarkdownCodeBlockProcessor("apple-reminders", (src, el, ctx) => { + var _a, _b; + const spec = parse2(src.trim()); + if (!spec["list"]) { + new import_obsidian4.Notice("You cannot have an apple-reminders block without a list name!", 3e3); + el.innerHTML = ` +
Please add list name to continue
+ `; + return; + } + let lE = new ListElement(spec); + let fileName = (_b = (_a = ctx.sourcePath.split("\\").last()) == null ? void 0 : _a.split("/").last()) == null ? void 0 : _b.trim().split(".").first(); + lE.fileName = fileName; + let x2 = interval(RemindersDataService.getSettings().autoRefreshTime * 1e4).subscribe(() => { + RemindersDataService.fetchData(spec, fileName).then(([listData, reminders, customReminders]) => { + lE.reminders = reminders; + lE.listMeta = listData; + lE.customReminders = customReminders; + }); + }); + this.elementRegister[src.trim()] = { + list: lE, + spec, + sub: x2 + }; + RemindersDataService.fetchData(spec, fileName).then(([listData, reminders, customReminders]) => { + lE.reminders = reminders; + lE.listMeta = listData; + lE.customReminders = customReminders; + }); + el.appendChild(lE); + }); + }); + } + onunload() { + Object.keys(this.elementRegister).forEach((key) => { + this.elementRegister[key].sub.unsubscribe(); + }); + } + loadSettings() { + return __async(this, null, function* () { + this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); + }); + } + saveSettings() { + return __async(this, null, function* () { + yield this.saveData(this.settings); + }); + } +}; +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/recent-files-obsidian/data.json b/.obsidian/plugins/recent-files-obsidian/data.json index 8dd4cf1a..03a55f07 100644 --- a/.obsidian/plugins/recent-files-obsidian/data.json +++ b/.obsidian/plugins/recent-files-obsidian/data.json @@ -1,5 +1,9 @@ { "recentFiles": [ + { + "basename": "2025-07-18", + "path": "01-工作日记/2025-07-18.md" + }, { "basename": "第29周总结", "path": "50-Memos/2025/weekly/第29周总结.md" @@ -12,10 +16,6 @@ "basename": "技惊四座的Deep Finesse打法", "path": "04-博客发布/043-Bridge/技惊四座的Deep Finesse打法.md" }, - { - "basename": "2025-07-18", - "path": "01-工作日记/2025-07-18.md" - }, { "basename": "2025-07-17", "path": "01-工作日记/2025-07-17.md" diff --git a/.obsidian/plugins/rss-reader/data.json b/.obsidian/plugins/rss-reader/data.json index 39273977..66c348f4 100644 --- a/.obsidian/plugins/rss-reader/data.json +++ b/.obsidian/plugins/rss-reader/data.json @@ -83,226 +83,6 @@ "image": "\n\t", "description": "一旦开始就不会停止", "items": [ - { - "title": "在手机严重同质化的时代,Nothing 希望帮你找回科技的乐趣", - "description": "前不久,Nothing 在北京召开了一场别开生面的新品发布会,推出了 Phone (3) 和 Headphone (1)。我派小分队不仅参加了这场发布会,还获得了访问 Nothing 全球品牌及营销总监 Ryan Latham 的宝贵机会。查看全文", - "content": "前不久,Nothing 在北京召开了一场别开生面的新品发布会,推出了 Phone (3) 和 Headphone (1)。我派小分队不仅参加了这场发布会,还获得了访问 Nothing 全球品牌及营销总监 Ryan Latham 的宝贵机会。查看全文", - "category": "", - "link": "https://sspai.com/post/101101", - "creator": "少数派编辑部", - "pubDate": "Thu, 17 Jul 2025 17:00:00 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "0e47bc72ee7501108b771a67be63b545", - "highlights": [] - }, - { - "title": "异泽 13 合 1 拓展坞体验:或许是适合普通人一步到位的选择", - "description": "异泽 13 合 1 的接口也能满足轻中度用户的需求,为笔记本或迷你主机拓展出更多接口,而简约白色的设计也适合不同风格的桌面。查看全文", - "content": "异泽 13 合 1 的接口也能满足轻中度用户的需求,为笔记本或迷你主机拓展出更多接口,而简约白色的设计也适合不同风格的桌面。查看全文", - "category": "", - "link": "https://sspai.com/post/101076", - "creator": "宛潼", - "pubDate": "Thu, 17 Jul 2025 16:00:00 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "f64dbaf2fe09f4a694c6f11a77ad9fde", - "highlights": [] - }, - { - "title": "一日一技|曲线救国,让 Android 用上 DoH", - "description": "Matrix首页推荐Matrix是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选Matrix最优质的文章,展示来自用户的最真实的体验和观点。文章代表作者个人观点 ...查看全文", - "content": "Matrix首页推荐Matrix是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选Matrix最优质的文章,展示来自用户的最真实的体验和观点。文章代表作者个人观点 ...查看全文", - "category": "", - "link": "https://sspai.com/post/100874", - "creator": "so1ar", - "pubDate": "Thu, 17 Jul 2025 14:20:59 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "15a54a9f812c64112fcc7064ca01f5b2", - "highlights": [] - }, - { - "title": "我们如何优化少数派办公室的无线网络", - "description": "本文分上下两篇,基于为少数派办公室优化无线网络的实际经历,介绍了如何分析复杂无线环境中出现的问题,企业级路由和普通家用路由的不同之处,以及优化无线网络的各个常用手段。

[......]

查看全文

本文为会员文章,出自《单篇文章》,订阅后可阅读全文。

", - "content": "本文分上下两篇,基于为少数派办公室优化无线网络的实际经历,介绍了如何分析复杂无线环境中出现的问题,企业级路由和普通家用路由的不同之处,以及优化无线网络的各个常用手段。

[......]

查看全文

本文为会员文章,出自《单篇文章》,订阅后可阅读全文。

", - "category": "", - "link": "https://sspai.com/prime/story/office-wireless-network-optimization-1", - "creator": "广陵止息", - "pubDate": "Thu, 17 Jul 2025 11:35:17 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "d9dab1ec5c64f9d33af9c234e735cf54", - "highlights": [] - }, - { - "title": "派早报:特斯拉公布 Model Y L、「网络身份证」正式启用等", - "description": "AirPods Pro 2 耳机助听器等功能将在更多市场推出、火狐浏览器将关闭中国公司等。查看全文", - "content": "AirPods Pro 2 耳机助听器等功能将在更多市场推出、火狐浏览器将关闭中国公司等。查看全文", - "category": "", - "link": "https://sspai.com/post/101107", - "creator": "少数派编辑部", - "pubDate": "Thu, 17 Jul 2025 08:25:58 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "9f401d53ea2311e70d5b326f58c1b8e1", - "highlights": [] - }, - { - "title": "查缺补漏时间到,十三张去年你可能错过的华语乐坛好专辑", - "description": "我找出了(至少)十三张或许你还没听过,且在去年的音乐推荐文章中没有收录的,值得一试的专辑,帮你给最近的华语乐坛查缺补漏。查看全文", - "content": "我找出了(至少)十三张或许你还没听过,且在去年的音乐推荐文章中没有收录的,值得一试的专辑,帮你给最近的华语乐坛查缺补漏。查看全文", - "category": "", - "link": "https://sspai.com/post/101091", - "creator": "北鸮", - "pubDate": "Wed, 16 Jul 2025 17:30:00 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "aeb441217ecd05ef805c1b7fc0f252c5", - "highlights": [] - }, - { - "title": "曲中人心、词悦双眼,高颜值 Windows 歌词展示工具:Better Lyrics", - "description": "BetterLyrics 支持从系统播放器、QQ 音乐、酷狗音乐、Spotify、Apple Music 等多个平台读取当前播放的音乐信息,并可实时从本地或在线歌词源获取歌词,配合沉浸式动画流畅呈现。\n查看全文", - "content": "BetterLyrics 支持从系统播放器、QQ 音乐、酷狗音乐、Spotify、Apple Music 等多个平台读取当前播放的音乐信息,并可实时从本地或在线歌词源获取歌词,配合沉浸式动画流畅呈现。\n查看全文", - "category": "", - "link": "https://sspai.com/post/101028", - "creator": "摘叶飞镖", - "pubDate": "Wed, 16 Jul 2025 15:10:04 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "26b4cc70da91c4653d0ce66cba85f30c", - "highlights": [] - }, - { - "title": "一块生不逢时的玻璃:18 年后回望 Vista 的「远景」", - "description": "Windows Vista 就像它的命名「远景」(Vista)所寓意的那样,提前预览了未来 PC 操作系统应有的样子,只不过它自己没能等到那个属于它的时代。查看全文", - "content": "Windows Vista 就像它的命名「远景」(Vista)所寓意的那样,提前预览了未来 PC 操作系统应有的样子,只不过它自己没能等到那个属于它的时代。查看全文", - "category": "", - "link": "https://sspai.com/post/100978", - "creator": "StephenFang", - "pubDate": "Wed, 16 Jul 2025 11:15:22 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "ce3ab217a6a1449665909109b65c0615", - "highlights": [] - }, - { - "title": "派早报:索尼发布 RX1R III、Razer Core X V2 发布等", - "description": "掌阅发布 iReader Neo 3 系列口袋阅读器,荣耀 X70 正式发布等。查看全文", - "content": "掌阅发布 iReader Neo 3 系列口袋阅读器,荣耀 X70 正式发布等。查看全文", - "category": "", - "link": "https://sspai.com/post/101077", - "creator": "少数派编辑部", - "pubDate": "Wed, 16 Jul 2025 08:17:16 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "e23c9f91eeefde0ffebf3fb3db4cb30d", - "highlights": [] - }, - { - "title": "社区速递 101 | 一周热评、新玩意,以及派友们的浏览器标签页整理术", - "description": "除了首页时间流和侧栏的精选展位,少数派Matrix社区还有很多优秀内容因条件所限无法得到有效曝光,因此我们决定重启Matrix周报,并在此基础上添加更多社区内容、作者投稿的新玩意呈现给大家。🔥一周热评 ...查看全文", - "content": "除了首页时间流和侧栏的精选展位,少数派Matrix社区还有很多优秀内容因条件所限无法得到有效曝光,因此我们决定重启Matrix周报,并在此基础上添加更多社区内容、作者投稿的新玩意呈现给大家。🔥一周热评 ...查看全文", - "category": "", - "link": "https://sspai.com/post/101052", - "creator": "Matrix机器人", - "pubDate": "Tue, 15 Jul 2025 16:58:58 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "资讯", - "feed": "少数派", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "ec7a137c759511bd5b81876e90b5734a", - "highlights": [] - }, { "title": "技惊四座的Deep Finesse打法", "description": "欧洲桥牌团体锦标赛公开团体赛在波兰波兹南激战正酣,目前还在预赛阶段,在预赛第7轮的比赛中,我们看到了一副技惊四座的深飞(Deep Finesse)打法,这是罗森塔尔队与齐默尔曼队之间发生的,主打人是挪威明星布格兰德,防守方则是卡酷司机与卡利塔。 南家主打5♦,首攻将牌如何做庄? 叫牌过程显示了不同寻常的进取。北家巴克开叫2♣强牌,南家布格兰德一个点都没有,2♦等待,此时3♠是4张♠+5张以上♦的进局逼叫,布格兰德虽然白皮,但他有3张♦,直叫5♦,因为他不能叫4♦,这会显示更强 […]", @@ -523,6 +303,116 @@ "hash": "3eb98f8ba07190ee1af92f619a345f23", "highlights": [] }, + { + "title": "异泽 13 合 1 拓展坞体验:或许是适合普通人一步到位的选择", + "description": "异泽 13 合 1 的接口也能满足轻中度用户的需求,为笔记本或迷你主机拓展出更多接口,而简约白色的设计也适合不同风格的桌面。查看全文", + "content": "异泽 13 合 1 的接口也能满足轻中度用户的需求,为笔记本或迷你主机拓展出更多接口,而简约白色的设计也适合不同风格的桌面。查看全文", + "category": "", + "link": "https://sspai.com/post/101076", + "creator": "宛潼", + "pubDate": "Thu, 17 Jul 2025 16:00:00 +0800", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "资讯", + "feed": "少数派", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "f64dbaf2fe09f4a694c6f11a77ad9fde", + "highlights": [] + }, + { + "title": "我们如何优化少数派办公室的无线网络", + "description": "本文分上下两篇,基于为少数派办公室优化无线网络的实际经历,介绍了如何分析复杂无线环境中出现的问题,企业级路由和普通家用路由的不同之处,以及优化无线网络的各个常用手段。

[......]

查看全文

本文为会员文章,出自《单篇文章》,订阅后可阅读全文。

", + "content": "本文分上下两篇,基于为少数派办公室优化无线网络的实际经历,介绍了如何分析复杂无线环境中出现的问题,企业级路由和普通家用路由的不同之处,以及优化无线网络的各个常用手段。

[......]

查看全文

本文为会员文章,出自《单篇文章》,订阅后可阅读全文。

", + "category": "", + "link": "https://sspai.com/prime/story/office-wireless-network-optimization-1", + "creator": "广陵止息", + "pubDate": "Thu, 17 Jul 2025 11:35:17 +0800", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "资讯", + "feed": "少数派", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "d9dab1ec5c64f9d33af9c234e735cf54", + "highlights": [] + }, + { + "title": "查缺补漏时间到,十三张去年你可能错过的华语乐坛好专辑", + "description": "我找出了(至少)十三张或许你还没听过,且在去年的音乐推荐文章中没有收录的,值得一试的专辑,帮你给最近的华语乐坛查缺补漏。查看全文", + "content": "我找出了(至少)十三张或许你还没听过,且在去年的音乐推荐文章中没有收录的,值得一试的专辑,帮你给最近的华语乐坛查缺补漏。查看全文", + "category": "", + "link": "https://sspai.com/post/101091", + "creator": "北鸮", + "pubDate": "Wed, 16 Jul 2025 17:30:00 +0800", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "资讯", + "feed": "少数派", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "aeb441217ecd05ef805c1b7fc0f252c5", + "highlights": [] + }, + { + "title": "一块生不逢时的玻璃:18 年后回望 Vista 的「远景」", + "description": "Windows Vista 就像它的命名「远景」(Vista)所寓意的那样,提前预览了未来 PC 操作系统应有的样子,只不过它自己没能等到那个属于它的时代。查看全文", + "content": "Windows Vista 就像它的命名「远景」(Vista)所寓意的那样,提前预览了未来 PC 操作系统应有的样子,只不过它自己没能等到那个属于它的时代。查看全文", + "category": "", + "link": "https://sspai.com/post/100978", + "creator": "StephenFang", + "pubDate": "Wed, 16 Jul 2025 11:15:22 +0800", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "资讯", + "feed": "少数派", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "ce3ab217a6a1449665909109b65c0615", + "highlights": [] + }, + { + "title": "社区速递 101 | 一周热评、新玩意,以及派友们的浏览器标签页整理术", + "description": "除了首页时间流和侧栏的精选展位,少数派Matrix社区还有很多优秀内容因条件所限无法得到有效曝光,因此我们决定重启Matrix周报,并在此基础上添加更多社区内容、作者投稿的新玩意呈现给大家。🔥一周热评 ...查看全文", + "content": "除了首页时间流和侧栏的精选展位,少数派Matrix社区还有很多优秀内容因条件所限无法得到有效曝光,因此我们决定重启Matrix周报,并在此基础上添加更多社区内容、作者投稿的新玩意呈现给大家。🔥一周热评 ...查看全文", + "category": "", + "link": "https://sspai.com/post/101052", + "creator": "Matrix机器人", + "pubDate": "Tue, 15 Jul 2025 16:58:58 +0800", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "资讯", + "feed": "少数派", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "ec7a137c759511bd5b81876e90b5734a", + "highlights": [] + }, { "title": "作为中国人可以不读全部诗词,但至少要会背这些千古名句!", "description": "董卿说: “作为中国人可以不读全部诗词,但至少要会背这些千古名句!” “欲穷千里目,更上一层楼”,“海内存知己,天涯若比邻”…… 这些琅琅上口的诗句,你都知晓吗? 事理哲理类 1、欲穷千里目,更上一层楼。 ——王之涣《登鹳雀楼》 2、人事有代谢,往来成古今。 ——孟浩然《与诸子登岘山》 3、草木本无意,荣枯自有时。 ——孟浩然《江上寄山阴崔少府国辅》 4、蚍蜉撼大树,可笑不自量。 ——韩愈《调张籍》 5、衰兰送客咸阳道,天若有情天亦老。 ——李贺《金铜仙人辞汉歌》 6、读书不 […]", @@ -558,116 +448,6 @@ "image": null, "description": "少数派致力于更好地运用数字产品或科学方法,帮助用户提升工作效率和生活品质", "items": [ - { - "title": "徒步环游世界第一人:中国青年潘德明经历了什么奇幻冒险?", - "description": "



本 文 约 5700 字
阅 读 需 要 19 分钟


1930年,上海。外滩的钟声敲打着黄浦江的晨雾,码头边泊着异国的巨轮,街上是匆匆的黄包车和神色凝重的行人。这是一个山河破碎、强邻环伺的年代。报纸上充斥着有关自然灾害、日本人觊觎东北的负面新闻,空气里弥漫着压抑与屈辱。


在这片阴霾下,一股新的力量正在涌动。新文化运动吹散了思想的尘埃,留学、求知、探索,成为许多人试图改变个人命运、乃至民族未来的路径。


一个在南京经营西餐馆的湖州青年——潘德明,选择了一条更为艰难、也更为孤绝的道路:徒步环游世界。潘德明是谁?为什么要开始这样的冒险?



起点:与命运交点的世界


20世纪20、30年代,出门旅行很受文人、学者的欢迎,他们写下的有关旅行的散文或小说也引发了国内新青年们的拥趸。潘德明应该是自小热爱旅行的,但他也知道自己家境一般,所以在很早的时候,他便给自己制定了“穷游”模式计划。在接受国家人文历史记者采访时,潘德明亲属潘溯讲道:“祖父根据自己当时的现状,设定过两个异域旅行的条件:一是有裁缝的手艺;二是有烹饪的技术。之所以设定这两个条件,是因为在他的观念中,旅行就是衣食住行。有脚便能行,住宿仰大地;而吃穿两样不能张嘴便来、伸手即有,如果自己能有本事解决此两条,即便身无分文,也不致顷刻间威胁生存。他本就生在一个裁缝之家;而烹饪技艺则来自他在南京经营的快活岭西餐馆。



餐馆所在的南京四牌楼是当时整个南京乃至民国,经济最繁荣、文化最多样的地区之一,受附近东南大学的影响,许多进步大学生在此交流思想,一些来此经商的外国商人和授课的外国学者也在此聚集。潘德明的西餐馆成了他与这些人交流的绝佳平台。在此过程中,他凭自己绝佳的语言天赋,基本掌握了主要的几种西方语言。一切都已经准备就绪,现在只差一个契机,一个催促自己迈出第一步、踏上旅程的契机。


1930年夏天,潘德明像往常一样打开店门,做好开张准备工作,泡好一杯茶,拿起《申报》读了起来,一则报道让他的双眼放光:


“中国青年亚细亚步行团”七位男女壮士,于昨晨九时,集中北站,身负行装毛毯杂粮水壶油布背囊指南针等另物,各重三十磅,一律着黄呢童子军服,头戴白色铜盆帽……他们预定的第一期行程是:从上海出发,经杭州、宁波、温州、福清、莆仙、厦门、漳州、汕头、广州、海南岛、越南、泰国、马来半岛、新加坡;第二期行程是:从新加坡乘船至缅甸,经印度、阿富汗、伊朗、阿拉伯等国,到土耳其的伊斯坦布尔;第三期的行程是:从伊斯坦布尔出发,入我国新疆、西藏,经青海、西康、四川、甘肃、陕西,返回上海。步行团出发前的经费,是由团员们平均负担;出发后的经费,就像社会各界人士募集。步行团的目的是:锻炼体魄,调查各地文化、教育、风俗、古迹,以及各国的经济建设情况和华侨在国外的生活状况。



另有《昨日亚细亚步行团出发记》报道刊登了步行团出发前的宣言:


在历史上背负了五千余年文明和创造的中华民族,在他的悠久的继续发展中间,也会产生了不少的冒险家,替我们的历史增进了光荣的材料,不幸到了近世,尤其是当着我们这个政治社会种种设施,尚未全上轨道的的现代,萎靡和颓废,成为青年们普遍的精神病态,一切坚毅有为,勇敢卓绝的伟大雄图,都从我们青年的堕落生活中,被淘汰消灭去了,我们觉得时代的精灵,已在向我们欢呼,我们觉得毫不客气地,把这个伟大的重担,肩起来的时机,是到来了,我们这个小小的集团,虽然人数并不多,财力并不厚,然而我们决以坚毅不拔的勇敢精神,从上海出发,逐步实践我们的目的,在每一步伐中,我们要显出大中华民族历史的光荣,要在每一个步伐中,给社会上以极深刻的印象,一直到我们预定的途程的最终点,谨此 宣言。


从宣言中,潘德明忽然明白了自己这些年认真筹备、向着那个朦朦胧胧的目标坚持不懈的真正动力是什么。他无比真切的认识到,原来旅行不仅是个人的英雄史诗,更是一个民族精神和意志的体现。“步行团的宣言,激活了潘德明幼年时起就想出去看看的渴望。原本只将旅行视为偿愿的潘德明,第一次意识到‘旅行’竟然还能改变国人的精神;如步行团宣言所说的让‘古老民族在世界面前扬威’。”在谈到祖父踏上旅途的动机时,潘溯如是说。


潘德明无可避免地被“中国青年亚细亚步行团”提出的徒步环游世界的梦想所吸引。他知道,是时候去实现那个扎根在心里三年之久的梦想了。


旅途:与世界和文明的对话


当天晚上,潘德明开始着手处理餐馆事务,将其卖出,然后坐上火车直奔上海。此时步行团已经从上海启程,潘德明通过商务印书馆拿到一封介绍信后,立即坐火车南下,最终在杭州追上了步行团。不过,因为条件艰苦和资金分配存在分歧,最初的7人步行团此时仅剩下5人。



原本还在惴惴能否给步行团当厨师的潘德明毫无悬念地被接纳了。到达厦门时,又有2人离开队伍。出发时声势浩大的步行团,只剩下李梦生、胡素娟,和潘德明3人。



到达广州后,潘德明办理好出国护照,便踏上了从香港到越南的游轮。这一阶段,他们面临的最大困难是与队友间在志向上的偏差。我们心目中的旅行家或许是风光的,但实际上,三人从厦门到越南这段旅途,风餐露宿,相当艰苦,就这样咬着牙坚持到了越南,不过是走出国门的第一站。在这里,他们迎来了从未有过的热情款待,本地侨胞倾囊相送巨额旅资,款待演讲应接不暇。起初,华侨的招待让他们感受到家一般的温暖,但随着演讲次数的增多,潘德明逐渐对这样的生活产生疑惑,他在家书中这样写道:


我们步行亚细亚洲原定是要吃苦的,哪里知道如此享福?路上有人迎送,路上有人送很好的菜和饭。到了一个地方即有人大开欢迎会,天天请我们吃大菜,真真出我们预料之外。


不仅如此,三人在未来的计划上也产生了分歧。潘德明在一次演讲中,未经与队友商议便表露了会去美国的想法,李梦生迅速将他打断。事后,李梦生表达了自己对未卜前途的担忧:去美国要多少旅费?美国的华侨有安南的多吗? 如果没有华侨送餐,今天中午吃什么?潘德明极力寻找这些困惑的答案,但终究被队友否定了,三人自此分道扬镳。


就这样,潘德明离开步行团,用旅资购买了自行车和相机,独自踏上探寻世界的旅途。



从新加坡出发,潘德明先到达印度,后穿过印度原始雨林和阿拉伯沙漠,于1932年抵达另一个文明古国埃及。在埃及稍作停留后,向北越过地中海,来到欧洲。在欧洲,潘德明先后游览了希腊、意大利、法国、德国等十数个国家,之后从伦敦坐船横跨大西洋,于1934年到达美国。在美洲游历一年后,潘德明又从夏威夷乘船抵达了澳大利亚。1935年6月,潘德明从澳洲返程,途经印度尼西亚到达新加坡,宣告“徒步环游世界”这一前无古人的壮举的完成。



旅程中,潘德明也接触到了一些身处国际政治漩涡的中国高层人物。在欧洲,他见到了当时的外交官顾维钧和身处海外的张学良。从他们口中,潘德明更清晰地听到了国内的消息:日本悍然发动“九一八”事变侵占东北,又在上海挑起“一二八”事变,1933年更进犯热河,逼迫签订丧权辱国的《塘沽协定》。这些远隔重洋传来的噩耗,经由顾、张这样身处权力中心的人物说出,显得格外沉重和真实。尽管他们位高权重,但在那个国势倾颓、强敌环伺的年代,言谈间也难掩对国家前途的忧虑与迷茫。



在旅行过程中,潘德明会向媒体投送照片和游记以获取旅资,各地的华侨社团和当地媒体也十分关注这位正进行着前无古人的事业的年轻人,当时的《星洲日报》《民国日报》等华文媒体频频报道他的壮举,从而吸引了更多人的关注与赞助。



凭借媒体的力量,潘德明很快成为“顶流人物”。他坚韧不拔的精神赢得了一些外国政要的注意与赞赏。在印度,他通过华侨引荐,拜会了心系亚洲民族独立的文豪泰戈尔和“圣雄”甘地。尽管甘地当时因绝食身体极度虚弱,仍坚持会面,在《留墨集》上签名并赠予手织的印度三色旗,他们都鼓励潘德明为亚洲人完成这一壮举。



在法国,他获得了总统勒布伦的接见。在纳粹党已全面掌权的德国,他甚至短暂见到了希特勒。希特勒对其徒步环游世界的壮举表示惊叹和赞赏。在美国,罗斯福总统会见了他,赠送金牌,并称赞:“荣誉永远属于有奋斗精神的人。”


这些外国政要的“礼遇”,更多是出于对潘德明个人壮举的好奇或欣赏,因此,仅凭潘德明个人的力量,并不能真正改变当时积贫积弱、备受欺凌的中国的国际地位。他们的态度与其说是对一个国家的尊重,不如说是对一个非凡个体的好奇。个人的坚韧可以赢得世界的惊叹,但一个民族的真正尊严与复兴,需要更深层、更艰难的蜕变与奋斗。潘德明在芝加哥参观“芝城百年进步博览会”,深感祖国与美国之间巨大的差距,在由美国华侨创办的《三民画刊》上发文:“我们和美国的差异,绝非天意,乃因我们制度之腐朽……大中国一定会强盛起来。”



七年的环球跋涉,让潘德明拥有了异常广阔的视野。他亲眼见证了世界文明的多样与复杂:从古老的金字塔到工业轰鸣的芝加哥,从甘地的非暴力抗争到纳粹的恐怖统治。他感受到华人华侨对故土的赤诚与期盼,也体会到国家危亡之际高层人士的无奈与迷茫。他获得了外国政要的礼遇,更深知祖国在国际舞台上的真实处境。这一切,都让潘德明对“雪东亚病夫之耻”的初衷有了更深沉的理解。而透过他的旅行,一度陷于阴霾中的世界也在窥探中国强大意志的一角。他证明了中国人无畏的勇气,也向世界昭示着中国必将重新崛起的力量来源。在山雨欲来的20世纪30年代,潘德明就这样用自己的双脚,完成了这场中国与世界文明的漫长对话。


终点:游子的归程与精神的远征


1936年元旦后,潘德明启程从新加坡回国。由于日本全面侵华的意图越来越明显,潘德明放弃了取道日本的想法,选择泰国、缅甸路线,走陆路穿越危险的原始雨林,由云南进入祖国境内。终于,在又一年艰难的跋涉后,1937年,潘德明顺利回到云南。在东下返乡的途中,潘德明还在广西桂林见到了李宗仁。1937年7月,潘德明抵达上海,顺利与家人团聚。



完成环游世界的壮举后,潘德明立即着手准备下一次探险。在考察美国工业时,潘德明注意到,此时工业需要的许多稀有矿石,在青藏高原上有很高的储量。而对于这片人迹罕至的雪域高原,时人足迹所至者几乎未见。因此,潘德明还在美国时,便计划归国后继续完成徒步西藏的挑战,并在过程中完成对整个青藏高原资源的细致考察,从而服务于中国的工业化进程。潘德明的想法一经提出,就受到了海外侨胞的一致支持。从美国回程开始,众多侨胞为他的这一计划捐出储蓄——这也是侨胞们对国家富强、民族复兴毫无保留的赤诚希望。


将这一份份希望装进行囊的潘德明无比迫切地盼望着下一次旅途,然而,他的脚步终究没有快过时局的发展——1937年7月7日,日本发动“七七事变”,全面侵华开始。


空前的民族危机之下,潘德明的个人努力越发显得苍白无力。战火之中的中国已不再适合个人的徒步旅行,潘德明的梦想就这样被日军的炮火击碎。


潘溯在介绍祖父生平时,如此记述了当时潘德明的状态:“他的梦想被战争阻断,如他所言:‘我白行了万里路,白读了万卷书。’当他以世界为学校,读懂了天然与人事,历经荣辱悲欢,他向国内外友人拿来了组建科考队的资金,又以云南作为试验地,确定了自己的身体状况良好,专业知识管用,信心满满地准备踏出第一步的那一刻,他的计划毫无征兆地突然被画上句号。”对于潘德明来说,“在旁人眼中伟大的徒步世界的旅程,实际上只是人生中的一堂课。而他的青藏之旅,则是结课之后第一次真正的考验。他在世界读了7年书,毕业后立即‘待业’,一待就是一生。因此他认为自己的人生是彻底失败的,于是选择了低调生活,放弃了继续抛头露面的机会,默默承受着个人理想破灭的痛苦。”



潘德明再也无心享受“第一位徒步环游世界者”的耀眼光环。此后,他将自己的名字改成“潘子明”,并将一路上为了考察西藏筹集的10万美元旅资全部捐给抗战前线,自己仅留下那本写满世界各地名人政要签名、题字的《名人留墨集》。自此之后,无论报刊杂志上,还是日常生活中,都再也见不到“潘德明”的身影。在民族危机的浪潮中,那个刚刚完成一项前无古人壮举的潘德明,像一滴水珠一样消融了。



在之后的人生里,潘德明不再显现出任何与常人不同的特征。他如寻常人一样成家,在战火中努力地生活,唯一算得上特别的只有在联合国救济署一段不长的工作经历。新中国成立后,他在昆明益兴汽车材料行工作,也凭借熨衣和画宫灯补贴家用。虽然生活清苦,但他依旧乐观、认真和一丝不苟。后来,他将珍贵异常的《名人留墨集》上交,但让儿子抄录了扉页的旅行自述:


“以世界为我之大学校,以天然与人事为我之教科书,以耳闻目见直接的接触为我之读书方法,以风雪雨霜、炎荒烈日、晨星夜月为我之奖励金,要一往无前,表现我中国国民性于世界,使知我中国是向前的,以谋世界上之荣光,必欲达到目的而无退志。”


这是潘德明在1931年抵达新加坡时留下的文字。他用整整7年的青春时光,将这段文字亲身践行。对他而言,这趟旅程远非个人的冒险,而是一场宏大的学习与实践。他将世界视为“大学校”,将自然与人事当作“教科书”,通过亲身的“耳闻目见”去理解这个星球。更重要的是,他怀抱着一份朴素而坚定的信念:要以自己的脚步和行动,“表现我中国国民性于世界”,让世界看到中国并非停滞不前,看到这个民族内在的进取精神与追求荣光的决心。这并非空洞的口号,而是支撑他穿越雨林荒漠、克服万难的精神内核——一个普通青年试图证明中国人“是向前的”。



参考文献:

[1] 潘溯:《我的祖父潘德明:徒步环游世界的第一人》,上海文化出版社2025年

[2] 新华社《国家相册》栏目组编.国家相册 改革开放四十年的家国记忆 典藏版[M].北京:商务印书馆,2018.11.

[3] 章必功著:中国旅游通史 下[M].北京:商务印书馆,2016.07.

[4] 《读者文摘》编辑部编.读者文摘-4:1984总30-41期 合订本[M].兰州:甘肃人民出版社,1992.12.


本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。


\"图片\"
END
作者 | 潇湘水冷 詹茜卉
编辑 | 胡心雅 
 主编 | 周斌
排版 | 曲晨溪(实习)
校对 | 弋雨
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"

\"图片\"

“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "content": "



本 文 约 5700 字
阅 读 需 要 19 分钟


1930年,上海。外滩的钟声敲打着黄浦江的晨雾,码头边泊着异国的巨轮,街上是匆匆的黄包车和神色凝重的行人。这是一个山河破碎、强邻环伺的年代。报纸上充斥着有关自然灾害、日本人觊觎东北的负面新闻,空气里弥漫着压抑与屈辱。


在这片阴霾下,一股新的力量正在涌动。新文化运动吹散了思想的尘埃,留学、求知、探索,成为许多人试图改变个人命运、乃至民族未来的路径。


一个在南京经营西餐馆的湖州青年——潘德明,选择了一条更为艰难、也更为孤绝的道路:徒步环游世界。潘德明是谁?为什么要开始这样的冒险?



起点:与命运交点的世界


20世纪20、30年代,出门旅行很受文人、学者的欢迎,他们写下的有关旅行的散文或小说也引发了国内新青年们的拥趸。潘德明应该是自小热爱旅行的,但他也知道自己家境一般,所以在很早的时候,他便给自己制定了“穷游”模式计划。在接受国家人文历史记者采访时,潘德明亲属潘溯讲道:“祖父根据自己当时的现状,设定过两个异域旅行的条件:一是有裁缝的手艺;二是有烹饪的技术。之所以设定这两个条件,是因为在他的观念中,旅行就是衣食住行。有脚便能行,住宿仰大地;而吃穿两样不能张嘴便来、伸手即有,如果自己能有本事解决此两条,即便身无分文,也不致顷刻间威胁生存。他本就生在一个裁缝之家;而烹饪技艺则来自他在南京经营的快活岭西餐馆。



餐馆所在的南京四牌楼是当时整个南京乃至民国,经济最繁荣、文化最多样的地区之一,受附近东南大学的影响,许多进步大学生在此交流思想,一些来此经商的外国商人和授课的外国学者也在此聚集。潘德明的西餐馆成了他与这些人交流的绝佳平台。在此过程中,他凭自己绝佳的语言天赋,基本掌握了主要的几种西方语言。一切都已经准备就绪,现在只差一个契机,一个催促自己迈出第一步、踏上旅程的契机。


1930年夏天,潘德明像往常一样打开店门,做好开张准备工作,泡好一杯茶,拿起《申报》读了起来,一则报道让他的双眼放光:


“中国青年亚细亚步行团”七位男女壮士,于昨晨九时,集中北站,身负行装毛毯杂粮水壶油布背囊指南针等另物,各重三十磅,一律着黄呢童子军服,头戴白色铜盆帽……他们预定的第一期行程是:从上海出发,经杭州、宁波、温州、福清、莆仙、厦门、漳州、汕头、广州、海南岛、越南、泰国、马来半岛、新加坡;第二期行程是:从新加坡乘船至缅甸,经印度、阿富汗、伊朗、阿拉伯等国,到土耳其的伊斯坦布尔;第三期的行程是:从伊斯坦布尔出发,入我国新疆、西藏,经青海、西康、四川、甘肃、陕西,返回上海。步行团出发前的经费,是由团员们平均负担;出发后的经费,就像社会各界人士募集。步行团的目的是:锻炼体魄,调查各地文化、教育、风俗、古迹,以及各国的经济建设情况和华侨在国外的生活状况。



另有《昨日亚细亚步行团出发记》报道刊登了步行团出发前的宣言:


在历史上背负了五千余年文明和创造的中华民族,在他的悠久的继续发展中间,也会产生了不少的冒险家,替我们的历史增进了光荣的材料,不幸到了近世,尤其是当着我们这个政治社会种种设施,尚未全上轨道的的现代,萎靡和颓废,成为青年们普遍的精神病态,一切坚毅有为,勇敢卓绝的伟大雄图,都从我们青年的堕落生活中,被淘汰消灭去了,我们觉得时代的精灵,已在向我们欢呼,我们觉得毫不客气地,把这个伟大的重担,肩起来的时机,是到来了,我们这个小小的集团,虽然人数并不多,财力并不厚,然而我们决以坚毅不拔的勇敢精神,从上海出发,逐步实践我们的目的,在每一步伐中,我们要显出大中华民族历史的光荣,要在每一个步伐中,给社会上以极深刻的印象,一直到我们预定的途程的最终点,谨此 宣言。


从宣言中,潘德明忽然明白了自己这些年认真筹备、向着那个朦朦胧胧的目标坚持不懈的真正动力是什么。他无比真切的认识到,原来旅行不仅是个人的英雄史诗,更是一个民族精神和意志的体现。“步行团的宣言,激活了潘德明幼年时起就想出去看看的渴望。原本只将旅行视为偿愿的潘德明,第一次意识到‘旅行’竟然还能改变国人的精神;如步行团宣言所说的让‘古老民族在世界面前扬威’。”在谈到祖父踏上旅途的动机时,潘溯如是说。


潘德明无可避免地被“中国青年亚细亚步行团”提出的徒步环游世界的梦想所吸引。他知道,是时候去实现那个扎根在心里三年之久的梦想了。


旅途:与世界和文明的对话


当天晚上,潘德明开始着手处理餐馆事务,将其卖出,然后坐上火车直奔上海。此时步行团已经从上海启程,潘德明通过商务印书馆拿到一封介绍信后,立即坐火车南下,最终在杭州追上了步行团。不过,因为条件艰苦和资金分配存在分歧,最初的7人步行团此时仅剩下5人。



原本还在惴惴能否给步行团当厨师的潘德明毫无悬念地被接纳了。到达厦门时,又有2人离开队伍。出发时声势浩大的步行团,只剩下李梦生、胡素娟,和潘德明3人。



到达广州后,潘德明办理好出国护照,便踏上了从香港到越南的游轮。这一阶段,他们面临的最大困难是与队友间在志向上的偏差。我们心目中的旅行家或许是风光的,但实际上,三人从厦门到越南这段旅途,风餐露宿,相当艰苦,就这样咬着牙坚持到了越南,不过是走出国门的第一站。在这里,他们迎来了从未有过的热情款待,本地侨胞倾囊相送巨额旅资,款待演讲应接不暇。起初,华侨的招待让他们感受到家一般的温暖,但随着演讲次数的增多,潘德明逐渐对这样的生活产生疑惑,他在家书中这样写道:


我们步行亚细亚洲原定是要吃苦的,哪里知道如此享福?路上有人迎送,路上有人送很好的菜和饭。到了一个地方即有人大开欢迎会,天天请我们吃大菜,真真出我们预料之外。


不仅如此,三人在未来的计划上也产生了分歧。潘德明在一次演讲中,未经与队友商议便表露了会去美国的想法,李梦生迅速将他打断。事后,李梦生表达了自己对未卜前途的担忧:去美国要多少旅费?美国的华侨有安南的多吗? 如果没有华侨送餐,今天中午吃什么?潘德明极力寻找这些困惑的答案,但终究被队友否定了,三人自此分道扬镳。


就这样,潘德明离开步行团,用旅资购买了自行车和相机,独自踏上探寻世界的旅途。



从新加坡出发,潘德明先到达印度,后穿过印度原始雨林和阿拉伯沙漠,于1932年抵达另一个文明古国埃及。在埃及稍作停留后,向北越过地中海,来到欧洲。在欧洲,潘德明先后游览了希腊、意大利、法国、德国等十数个国家,之后从伦敦坐船横跨大西洋,于1934年到达美国。在美洲游历一年后,潘德明又从夏威夷乘船抵达了澳大利亚。1935年6月,潘德明从澳洲返程,途经印度尼西亚到达新加坡,宣告“徒步环游世界”这一前无古人的壮举的完成。



旅程中,潘德明也接触到了一些身处国际政治漩涡的中国高层人物。在欧洲,他见到了当时的外交官顾维钧和身处海外的张学良。从他们口中,潘德明更清晰地听到了国内的消息:日本悍然发动“九一八”事变侵占东北,又在上海挑起“一二八”事变,1933年更进犯热河,逼迫签订丧权辱国的《塘沽协定》。这些远隔重洋传来的噩耗,经由顾、张这样身处权力中心的人物说出,显得格外沉重和真实。尽管他们位高权重,但在那个国势倾颓、强敌环伺的年代,言谈间也难掩对国家前途的忧虑与迷茫。



在旅行过程中,潘德明会向媒体投送照片和游记以获取旅资,各地的华侨社团和当地媒体也十分关注这位正进行着前无古人的事业的年轻人,当时的《星洲日报》《民国日报》等华文媒体频频报道他的壮举,从而吸引了更多人的关注与赞助。



凭借媒体的力量,潘德明很快成为“顶流人物”。他坚韧不拔的精神赢得了一些外国政要的注意与赞赏。在印度,他通过华侨引荐,拜会了心系亚洲民族独立的文豪泰戈尔和“圣雄”甘地。尽管甘地当时因绝食身体极度虚弱,仍坚持会面,在《留墨集》上签名并赠予手织的印度三色旗,他们都鼓励潘德明为亚洲人完成这一壮举。



在法国,他获得了总统勒布伦的接见。在纳粹党已全面掌权的德国,他甚至短暂见到了希特勒。希特勒对其徒步环游世界的壮举表示惊叹和赞赏。在美国,罗斯福总统会见了他,赠送金牌,并称赞:“荣誉永远属于有奋斗精神的人。”


这些外国政要的“礼遇”,更多是出于对潘德明个人壮举的好奇或欣赏,因此,仅凭潘德明个人的力量,并不能真正改变当时积贫积弱、备受欺凌的中国的国际地位。他们的态度与其说是对一个国家的尊重,不如说是对一个非凡个体的好奇。个人的坚韧可以赢得世界的惊叹,但一个民族的真正尊严与复兴,需要更深层、更艰难的蜕变与奋斗。潘德明在芝加哥参观“芝城百年进步博览会”,深感祖国与美国之间巨大的差距,在由美国华侨创办的《三民画刊》上发文:“我们和美国的差异,绝非天意,乃因我们制度之腐朽……大中国一定会强盛起来。”



七年的环球跋涉,让潘德明拥有了异常广阔的视野。他亲眼见证了世界文明的多样与复杂:从古老的金字塔到工业轰鸣的芝加哥,从甘地的非暴力抗争到纳粹的恐怖统治。他感受到华人华侨对故土的赤诚与期盼,也体会到国家危亡之际高层人士的无奈与迷茫。他获得了外国政要的礼遇,更深知祖国在国际舞台上的真实处境。这一切,都让潘德明对“雪东亚病夫之耻”的初衷有了更深沉的理解。而透过他的旅行,一度陷于阴霾中的世界也在窥探中国强大意志的一角。他证明了中国人无畏的勇气,也向世界昭示着中国必将重新崛起的力量来源。在山雨欲来的20世纪30年代,潘德明就这样用自己的双脚,完成了这场中国与世界文明的漫长对话。


终点:游子的归程与精神的远征


1936年元旦后,潘德明启程从新加坡回国。由于日本全面侵华的意图越来越明显,潘德明放弃了取道日本的想法,选择泰国、缅甸路线,走陆路穿越危险的原始雨林,由云南进入祖国境内。终于,在又一年艰难的跋涉后,1937年,潘德明顺利回到云南。在东下返乡的途中,潘德明还在广西桂林见到了李宗仁。1937年7月,潘德明抵达上海,顺利与家人团聚。



完成环游世界的壮举后,潘德明立即着手准备下一次探险。在考察美国工业时,潘德明注意到,此时工业需要的许多稀有矿石,在青藏高原上有很高的储量。而对于这片人迹罕至的雪域高原,时人足迹所至者几乎未见。因此,潘德明还在美国时,便计划归国后继续完成徒步西藏的挑战,并在过程中完成对整个青藏高原资源的细致考察,从而服务于中国的工业化进程。潘德明的想法一经提出,就受到了海外侨胞的一致支持。从美国回程开始,众多侨胞为他的这一计划捐出储蓄——这也是侨胞们对国家富强、民族复兴毫无保留的赤诚希望。


将这一份份希望装进行囊的潘德明无比迫切地盼望着下一次旅途,然而,他的脚步终究没有快过时局的发展——1937年7月7日,日本发动“七七事变”,全面侵华开始。


空前的民族危机之下,潘德明的个人努力越发显得苍白无力。战火之中的中国已不再适合个人的徒步旅行,潘德明的梦想就这样被日军的炮火击碎。


潘溯在介绍祖父生平时,如此记述了当时潘德明的状态:“他的梦想被战争阻断,如他所言:‘我白行了万里路,白读了万卷书。’当他以世界为学校,读懂了天然与人事,历经荣辱悲欢,他向国内外友人拿来了组建科考队的资金,又以云南作为试验地,确定了自己的身体状况良好,专业知识管用,信心满满地准备踏出第一步的那一刻,他的计划毫无征兆地突然被画上句号。”对于潘德明来说,“在旁人眼中伟大的徒步世界的旅程,实际上只是人生中的一堂课。而他的青藏之旅,则是结课之后第一次真正的考验。他在世界读了7年书,毕业后立即‘待业’,一待就是一生。因此他认为自己的人生是彻底失败的,于是选择了低调生活,放弃了继续抛头露面的机会,默默承受着个人理想破灭的痛苦。”



潘德明再也无心享受“第一位徒步环游世界者”的耀眼光环。此后,他将自己的名字改成“潘子明”,并将一路上为了考察西藏筹集的10万美元旅资全部捐给抗战前线,自己仅留下那本写满世界各地名人政要签名、题字的《名人留墨集》。自此之后,无论报刊杂志上,还是日常生活中,都再也见不到“潘德明”的身影。在民族危机的浪潮中,那个刚刚完成一项前无古人壮举的潘德明,像一滴水珠一样消融了。



在之后的人生里,潘德明不再显现出任何与常人不同的特征。他如寻常人一样成家,在战火中努力地生活,唯一算得上特别的只有在联合国救济署一段不长的工作经历。新中国成立后,他在昆明益兴汽车材料行工作,也凭借熨衣和画宫灯补贴家用。虽然生活清苦,但他依旧乐观、认真和一丝不苟。后来,他将珍贵异常的《名人留墨集》上交,但让儿子抄录了扉页的旅行自述:


“以世界为我之大学校,以天然与人事为我之教科书,以耳闻目见直接的接触为我之读书方法,以风雪雨霜、炎荒烈日、晨星夜月为我之奖励金,要一往无前,表现我中国国民性于世界,使知我中国是向前的,以谋世界上之荣光,必欲达到目的而无退志。”


这是潘德明在1931年抵达新加坡时留下的文字。他用整整7年的青春时光,将这段文字亲身践行。对他而言,这趟旅程远非个人的冒险,而是一场宏大的学习与实践。他将世界视为“大学校”,将自然与人事当作“教科书”,通过亲身的“耳闻目见”去理解这个星球。更重要的是,他怀抱着一份朴素而坚定的信念:要以自己的脚步和行动,“表现我中国国民性于世界”,让世界看到中国并非停滞不前,看到这个民族内在的进取精神与追求荣光的决心。这并非空洞的口号,而是支撑他穿越雨林荒漠、克服万难的精神内核——一个普通青年试图证明中国人“是向前的”。



参考文献:

[1] 潘溯:《我的祖父潘德明:徒步环游世界的第一人》,上海文化出版社2025年

[2] 新华社《国家相册》栏目组编.国家相册 改革开放四十年的家国记忆 典藏版[M].北京:商务印书馆,2018.11.

[3] 章必功著:中国旅游通史 下[M].北京:商务印书馆,2016.07.

[4] 《读者文摘》编辑部编.读者文摘-4:1984总30-41期 合订本[M].兰州:甘肃人民出版社,1992.12.


本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。


\"图片\"
END
作者 | 潇湘水冷 詹茜卉
编辑 | 胡心雅 
 主编 | 周斌
排版 | 曲晨溪(实习)
校对 | 弋雨
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"

\"图片\"

“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "category": "", - "link": "http://weixin.sogou.com/weixin?type=2&query=%E5%9B%BD%E5%AE%B6%E4%BA%BA%E6%96%87%E5%8E%86%E5%8F%B2+%E5%BE%92%E6%AD%A5%E7%8E%AF%E6%B8%B8%E4%B8%96%E7%95%8C%E7%AC%AC%E4%B8%80%E4%BA%BA%EF%BC%9A%E4%B8%AD%E5%9B%BD%E9%9D%92%E5%B9%B4%E6%BD%98%E5%BE%B7%E6%98%8E%E7%BB%8F%E5%8E%86%E4%BA%86%E4%BB%80%E4%B9%88%E5%A5%87%E5%B9%BB%E5%86%92%E9%99%A9%EF%BC%9F", - "creator": "", - "pubDate": "Thu, 17 Jul 2025 18:47:00 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "人文", - "feed": "国家人文历史", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "3be02e158572c6ca9d2913b0d2943717", - "highlights": [] - }, - { - "title": "一个敢P,一个敢信:慈禧宠臣竟被一张假照片扳倒?", - "description": "


本 文 约 5000 字

阅 读 需 要 16 分 钟 


20世纪初,晚清政权正摇摇欲坠。就在朝堂最后几年激烈的自救与政斗中,小小的相机却搅动了波谲云诡的政局,拨动了政治人物的命运。这便是大名鼎鼎的岑春煊“假照片”事件。


岑春煊的前半生


岑春煊,字云阶,清末民初人。他出身显赫,家父岑毓英系云贵总督,因此,受其荫蔽的岑春煊年仅十八岁就被送往京城,派为工部学习行走。由于在家中排行第三,岑春煊被唤作“岑三公子”,与瑞澄、劳子乔并称“京城三少”。1892年,守完父孝的他补受光禄寺少卿,迁太仆寺少卿、署大理寺正卿。



甲午战争是岑春煊个人命运的第一个转折点,由于他“发愤自请效力前敌”,因此得到了军机大臣李鸿藻的注意,将其调至钦差大臣刘坤一麾下任职,设防烟台。清廷的议和与《马关条约》的签订,对岑春煊造成了严重的心理刺激,他因而投身维新运动,与后来的戊戌党人交往。他还和康有为筹议成立了广西最早的维新社团——桂林圣学会。1898年,岑春煊面陈光绪帝国事艰难、朝廷臃肿之弊,光绪帝采取了其裁撤旧官之谏,并任命他作广东布政使。广东任上,岑春煊大力裁撤闲散衙门,并因此与督抚谭钟麟产生龃龉,相互攻讦,其刚烈之举震动朝廷。“(慈禧)太后恶之,荣禄为缓颊,乃调甘肃”。然而,一场新的变故,即将带他攀上新的事业高峰。



1900年,八国联军侵华,慈禧携带光绪出逃,而甘肃布政使岑春煊则在接到驰援上谕后,星夜领兵疾奔北京,千里护驾:


“一夕宿破庙,春煊环刀立庙外彻夜,太后梦中忽惊呼,春煊则朗声应曰:‘臣春煊在此保驾’。”


经此事件后,慈禧大为感动,甚至只有在看到岑春煊才稍感心安,并对他表示:

 

“我母子西巡时,若不得汝照料,恐将饿死,焉有今日?我久已将汝当亲人看待。…… 若得复国,必无敢忘德也。”

 

还有一次,她还向朝臣询问说,“此耻如何可雪?”台下只有岑春煊应对如流,深得慈禧认可。由此,岑春煊得到了慈禧太后的欢心与信任,也预定了未来重臣的位置。清末有言说“京外总督三个半”,这“三”就是张之洞、袁世凯和岑春煊,“半”即端方,他们都堪称地方巨擘。



1902年,清廷颁布“新政”上谕,开启清末新政,岑春煊积极参与其中,上书建议“迅速特简亲贵大臣,以考求新政为名,历聘欧美有约诸邦”,并“择最大新政切实举行数事,痛除旧习,以动天下之观听”。而在他1901到1906年先后就职山西巡抚、署理四川总督、两广总督的任上,岑春煊也亲身实践,建设推广现代教育体系,培养实业与军事方面的人才。同时,他也继续坚持自己整肃官场的路线,甚至得名“官屠”:

 

“春煊每至一省,必大肆纠弹,上下股栗失色。”

 

1906年,清廷预备立宪,而各派系的矛盾也步入新阶段。陈寅恪曾分析时局说:


“京官以瞿鸿禨、张之洞等,外官以陶模、岑春煊等为清流;京官以庆亲王奕劻、袁世凯、徐世昌等,外官以周馥、杨士骧等为浊流。”

 

需要说明的是,清浊并不直接对应各派系的道德水平,而仅仅应被视作对党派的称谓。这些人相互倾轧,最终在1907年爆发了丁未政潮。



丁未政潮


丁未政潮,主要指的是上述清流与浊流空前激烈的党争,双方其实都支持维新立宪,但各有其利益所在。比如说,庆亲王奕劻伙同时任直隶总督袁世凯希望组建责任内阁,并由奕劻任总理、袁世凯任副总理,掌握中央大权;军机大臣瞿鸿禨,时任两广总督岑春煊以及皇室少壮派权贵铁良等人却上书斥其野心,主张保留军机处。最终,后者的方案得到执行,袁世凯还失去了原北洋六镇中的四镇兵权。作为报复,奕劻和袁世凯设法用边患的名义劝动慈禧,将岑春煊调任偏远荒凉的云贵总督,使其远离权力核心,而两广总督则由袁世凯的姻亲周馥接任。4月,东三省官制改革,原盛京将军著改为东三省总督,奉天、吉林、黑龙江各设一巡抚,分别由徐世昌,唐绍仪,朱家宝和段芝贵担任,他们都是北洋之人,胜利的天平再度翻转。



值此危难之际,岑春煊认为 “不于此际设法入都,造膝详陈种种危迫情形,机会一失,追悔无穷”。在瞿鸿禨、御史赵启霖等人的帮助下,岑春煊先是称病,然后假意受调补四川总督,在前往四川的路上,于汉口突然“迎折北上,坚请入对”。面对感念旧情的慈禧,他痛批“庆亲王贪庸误国,引用小人”。至于他自己,则“意欲留在都中为皇太后、皇上做一看家恶犬”。慈禧果然应允。



此后,新上任的邮传部尚书岑春煊与清流诸人不断向朱宝奎、段芝贵等庆袁党羽(即以庆亲王奕劻和袁世凯为代表的政治集团成员)开炮弹劾,令他们疲于招架。面对这一局面,奕劻和袁世凯先是催动两广总督周馥奏报事急,又收买大公主劝动慈禧叫岑春煊离开京城,去镇压广西革命党人,“君命犹天命,臣子宁敢自择地。春煊渥蒙宠遇,尤不当如此” ,岑因此不得不走,但仍称病暂居上海,并未赴任。


而奕劻、袁世凯二人,则仍有意将之赶尽杀绝。毕竟,岑春煊此时依然拥有慈禧的信任,也就有可能重新起复,挽回清流颓势。同时,和岑春煊并称“南岑北袁”的袁世凯还与其有些私人恩怨:昔日广东任职时,岑春煊就检举了时任广东海关监督库书的周馥,而袁世凯也曾为邀得慈禧恩宠,出卖了康、梁等岑春煊的戊戌友人。因此,虽时人认为“袁世凯、岑春煊俱有宠于太后”,但这两个宠臣之间,却实实在在是水火不容。


“春煊之宠,由庚子护驾。皆以患难奋翅而起,虽有外言,莫能间也。”



那么,如何彻底动摇慈禧对岑春煊的信任呢?袁世凯认为,恐怕还得从她最痛恨的康、梁二人入手。1904年,慈禧曾在“万寿”之年赦免了维新人士,但只有曾意图暴力夺权的康、梁和孙文被排除在外。因此,庆袁党羽之一给事中陈庆桂便试图弹劾岑春煊,指控他同样和康有为等人有关系,然而该奏折却为顾念旧情的慈禧留中未发:


“太后曾恶康党,以春煊新被宠,不应有是,待之如初。”



与之形成鲜明对比的,就是在岑被赶出京城不久,瞿鸿禨即因结党罪名而被免职。陈庆桂弹劾失败后,奕劻、袁世凯二人继续盯紧岑春煊的动向,终于等到了五月梁启超抵达上海与岑春煊会面的传闻。他们旋即通过电报,要求两江总督端方“设密确查”,后者确认了消息属实,并将所收集情报汇往京城。然而,慈禧虽“动于奕劻之危词,屏而远之,而犹有念旧之意”,此时,若是他们仍一味纠缠,恐怕会产生反效果。就在奕劻、袁世凯二人苦恼之际,一个外来的“小人物”,和他手中的相机,彻底改变了政局的走向。


晚清假照片事件


蔡乃煌,广东番禺人,1891年中举,此后虽辗转于洋务局、机器局、川汉铁路总公司等新式部门,却仕途不顺,久不得志。他曾想趁岑春煊病居上海之时,试图攀附这位四川总督,但被“峻拒之”。因此,他最终钻营进京,改投至袁世凯门下。而他的晋身之资,就是一张有关岑春煊的假照片。


相机在晚清的中国是个绝对的稀罕玩意,即便是达亲显贵,在第一次接触摄影时,甚至也会恐慌地以为照片能摄取他们的魂魄,避之不及,因此,知道照片还能被造假合成的人就更少了。



蔡乃煌对洋务工艺涉猎颇广,因此献计并承办了此事。他分别取得了岑春煊、康有为和梁启超的照片,到一广东同乡所经营的照相馆合放拍下,便形成了一张他们在上海时报馆前“共立相语”的假合照。随后,他亲自将之带去了天津,交到了袁世凯的手中。



在那个初初萌生“有图有真相”观念的年代,这可谓“板上钉钉”“不容辩驳”的“铁证”。而在假合照外,袁世凯等人还选择双管齐下,他们拉拢了原清流人士,翰林院侍读学士恽毓鼎于七月二日上书弹劾(前一天晚上,蔡乃煌和引介人顾亚蘧即来其家中“久谈”),大肆渲染岑与康有为、梁启超等人密谋勾结、居心叵测的情状,暗示其将“阴借外援”。需要说明的是,这批人不仅曾有协助光绪帝政变的“前科”,还在当时与日本关系紧密,而日本刚刚逼迫韩国皇帝李熙退位,慈禧曾被洋人干涉立储,最终导致庚子事变并狼狈出逃,这无疑触动了慈禧的敏感神经。就在她仍存有犹豫之际,假合照被“巧妙”呈上,慈禧彻底信服:


“相片无讹,默对至时许,叹曰:‘春煊亦通党负我,天下事真弗可逆料矣!虽然彼负我,我不负彼,可准其退休。’”



于是又次日,即七月四日,岑春煊即被以久病未痊的名义,彻底革职赋闲。至此,清流一败涂地,奕劻、袁世凯一方最终取得了丁未政潮的胜利。


在刘禺生的《世载堂杂忆》中,《假照片计陷岑春煊》还拥有另一个版本,那便是同盟会香港分会会长的广东新会人陈少白,为报复两广总督岑春煊借慈禧之眷顾,手段酷烈地查抄富商,就制作了岑与康、梁、麦联坐合影的假照片,出售于大街小巷,刊载于报纸媒体,还重金收买太监,传入宫内,由此慈禧震怒,罢免了岑春煊。而岑为洗脱罪名,便求助于慈禧宠信的太监李莲英。后者则将慈禧扮成观音,与自己扮作韦陀的单人照合成后送给慈禧,暗示这不过是奸人伪造的冤情,于是慈禧意遂释然。然而,在真实的历史中,这一时期双方的关系已经恶化。岑春煊进京后,有人建议他为了维护清誉,“宜绝阉人”,因此在李莲英向其示好馈食时,他便断然拒绝了,李莲英由是深恨之。时人和学者据此推断,正是李莲英参与到了袁世凯等人的运作当中,协助将假照片献给了慈禧。由此观之,岑的落败,或许也有其性格缺陷的原因。据说他曾在初入邮传部时叹曰:“过刚则折,微特不克报国家,且恐为佥壬所中。”竟不幸一语成谶。



丁未政潮极大地影响了清廷的政局和新政的结果。客观上,奕劻、袁世凯与瞿鸿禨、岑春煊两方阵营的争斗与内耗,导致了以载沣为首的满族权贵的崛起。继岑春煊被斗倒,袁世凯也在同年被朝廷以明升暗降的方式削去了最后的军权。因此,这场假照片事件的谋划人与受害者,都不是真正的赢家。反而是那个看似感性、优柔寡断的慈禧,在拉一派、打一派的“摇摆不定”中,压制了自太平天国起便逐年膨胀的汉人官僚势力,在后续的立宪过程中令满人“联翩而长部务,汉人之势大拙”。然而,这赤裸的“重满抑汉”倾向,与最终皇族内阁的出台,却也彻底将清廷立宪的改革工作钉在了耻辱柱上。而在深重的失望与愤怒中诞生的中华民国,也将把清王朝彻底倾覆。在此过程中,在丁未政潮中先后落败的岑春煊与袁世凯殊途同归,一个被任命镇压四川保路运动却支持了起义;另一个在奉诏率军讨贼后却威逼了清帝退位,纷纷成了所谓“爱新觉罗王朝的两大叛臣”。假使慈禧死后有灵,她便能知晓自己亦不是最终的赢家……


参考文献:

张华腾:《清末袁世凯与岑春煊关系述论》,《河南大学学报》(社会版)1996年.

尹传刚:《岑春煊与丁未政潮》,《沧桑》2010年.

谢晓博:《浅论丁未年慈禧对岑春煊的疏弃对清末新政的影响》,《贵阳学院学报》(社会科学版)2012年.

陶易:《清朝末年的“照相门”事件》,《文史天地》2012年.

易海涛:《略论清末民初岑春煊与袁世凯的恩怨纠纷》,《陇东学院学报》2013年.

金满楼:《岑春煊的肃贪与挨整》,《中国经济报告》2014年.

水浩淼:《丁未政潮和清末政局——以清、浊党争为视角》,《宜宾学院学报》2014年.

刘鹏超:《恽毓鼎与丁未政潮》,《中国国家博物馆馆刊》2016年.

张洋伟:《试述丁未政潮及对晚清政局影响》,《湘南学院学报》2017年.

于云豪:《岑春煊人物评述》,《文化学刊》2020年.

張建斌:《丁未袁世凱致端方密信箋釋》,《中华文史论丛》2021年.

张建斌:《端方与“丁未政潮”》,《近代史研究》2021年.

唐论:《计中计:丁未“假照片事件”探析》,《清史研究》2022年.


*本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。



END
作者 | 曾亦嘉‍‍‍‍‍‍‍
编辑 | 胡心雅‍
主编 | 周斌
排版 | 徐沁(实习)‍
校对 | 古月
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"
\"图片\"

“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "content": "


本 文 约 5000 字

阅 读 需 要 16 分 钟 


20世纪初,晚清政权正摇摇欲坠。就在朝堂最后几年激烈的自救与政斗中,小小的相机却搅动了波谲云诡的政局,拨动了政治人物的命运。这便是大名鼎鼎的岑春煊“假照片”事件。


岑春煊的前半生


岑春煊,字云阶,清末民初人。他出身显赫,家父岑毓英系云贵总督,因此,受其荫蔽的岑春煊年仅十八岁就被送往京城,派为工部学习行走。由于在家中排行第三,岑春煊被唤作“岑三公子”,与瑞澄、劳子乔并称“京城三少”。1892年,守完父孝的他补受光禄寺少卿,迁太仆寺少卿、署大理寺正卿。



甲午战争是岑春煊个人命运的第一个转折点,由于他“发愤自请效力前敌”,因此得到了军机大臣李鸿藻的注意,将其调至钦差大臣刘坤一麾下任职,设防烟台。清廷的议和与《马关条约》的签订,对岑春煊造成了严重的心理刺激,他因而投身维新运动,与后来的戊戌党人交往。他还和康有为筹议成立了广西最早的维新社团——桂林圣学会。1898年,岑春煊面陈光绪帝国事艰难、朝廷臃肿之弊,光绪帝采取了其裁撤旧官之谏,并任命他作广东布政使。广东任上,岑春煊大力裁撤闲散衙门,并因此与督抚谭钟麟产生龃龉,相互攻讦,其刚烈之举震动朝廷。“(慈禧)太后恶之,荣禄为缓颊,乃调甘肃”。然而,一场新的变故,即将带他攀上新的事业高峰。



1900年,八国联军侵华,慈禧携带光绪出逃,而甘肃布政使岑春煊则在接到驰援上谕后,星夜领兵疾奔北京,千里护驾:


“一夕宿破庙,春煊环刀立庙外彻夜,太后梦中忽惊呼,春煊则朗声应曰:‘臣春煊在此保驾’。”


经此事件后,慈禧大为感动,甚至只有在看到岑春煊才稍感心安,并对他表示:

 

“我母子西巡时,若不得汝照料,恐将饿死,焉有今日?我久已将汝当亲人看待。…… 若得复国,必无敢忘德也。”

 

还有一次,她还向朝臣询问说,“此耻如何可雪?”台下只有岑春煊应对如流,深得慈禧认可。由此,岑春煊得到了慈禧太后的欢心与信任,也预定了未来重臣的位置。清末有言说“京外总督三个半”,这“三”就是张之洞、袁世凯和岑春煊,“半”即端方,他们都堪称地方巨擘。



1902年,清廷颁布“新政”上谕,开启清末新政,岑春煊积极参与其中,上书建议“迅速特简亲贵大臣,以考求新政为名,历聘欧美有约诸邦”,并“择最大新政切实举行数事,痛除旧习,以动天下之观听”。而在他1901到1906年先后就职山西巡抚、署理四川总督、两广总督的任上,岑春煊也亲身实践,建设推广现代教育体系,培养实业与军事方面的人才。同时,他也继续坚持自己整肃官场的路线,甚至得名“官屠”:

 

“春煊每至一省,必大肆纠弹,上下股栗失色。”

 

1906年,清廷预备立宪,而各派系的矛盾也步入新阶段。陈寅恪曾分析时局说:


“京官以瞿鸿禨、张之洞等,外官以陶模、岑春煊等为清流;京官以庆亲王奕劻、袁世凯、徐世昌等,外官以周馥、杨士骧等为浊流。”

 

需要说明的是,清浊并不直接对应各派系的道德水平,而仅仅应被视作对党派的称谓。这些人相互倾轧,最终在1907年爆发了丁未政潮。



丁未政潮


丁未政潮,主要指的是上述清流与浊流空前激烈的党争,双方其实都支持维新立宪,但各有其利益所在。比如说,庆亲王奕劻伙同时任直隶总督袁世凯希望组建责任内阁,并由奕劻任总理、袁世凯任副总理,掌握中央大权;军机大臣瞿鸿禨,时任两广总督岑春煊以及皇室少壮派权贵铁良等人却上书斥其野心,主张保留军机处。最终,后者的方案得到执行,袁世凯还失去了原北洋六镇中的四镇兵权。作为报复,奕劻和袁世凯设法用边患的名义劝动慈禧,将岑春煊调任偏远荒凉的云贵总督,使其远离权力核心,而两广总督则由袁世凯的姻亲周馥接任。4月,东三省官制改革,原盛京将军著改为东三省总督,奉天、吉林、黑龙江各设一巡抚,分别由徐世昌,唐绍仪,朱家宝和段芝贵担任,他们都是北洋之人,胜利的天平再度翻转。



值此危难之际,岑春煊认为 “不于此际设法入都,造膝详陈种种危迫情形,机会一失,追悔无穷”。在瞿鸿禨、御史赵启霖等人的帮助下,岑春煊先是称病,然后假意受调补四川总督,在前往四川的路上,于汉口突然“迎折北上,坚请入对”。面对感念旧情的慈禧,他痛批“庆亲王贪庸误国,引用小人”。至于他自己,则“意欲留在都中为皇太后、皇上做一看家恶犬”。慈禧果然应允。



此后,新上任的邮传部尚书岑春煊与清流诸人不断向朱宝奎、段芝贵等庆袁党羽(即以庆亲王奕劻和袁世凯为代表的政治集团成员)开炮弹劾,令他们疲于招架。面对这一局面,奕劻和袁世凯先是催动两广总督周馥奏报事急,又收买大公主劝动慈禧叫岑春煊离开京城,去镇压广西革命党人,“君命犹天命,臣子宁敢自择地。春煊渥蒙宠遇,尤不当如此” ,岑因此不得不走,但仍称病暂居上海,并未赴任。


而奕劻、袁世凯二人,则仍有意将之赶尽杀绝。毕竟,岑春煊此时依然拥有慈禧的信任,也就有可能重新起复,挽回清流颓势。同时,和岑春煊并称“南岑北袁”的袁世凯还与其有些私人恩怨:昔日广东任职时,岑春煊就检举了时任广东海关监督库书的周馥,而袁世凯也曾为邀得慈禧恩宠,出卖了康、梁等岑春煊的戊戌友人。因此,虽时人认为“袁世凯、岑春煊俱有宠于太后”,但这两个宠臣之间,却实实在在是水火不容。


“春煊之宠,由庚子护驾。皆以患难奋翅而起,虽有外言,莫能间也。”



那么,如何彻底动摇慈禧对岑春煊的信任呢?袁世凯认为,恐怕还得从她最痛恨的康、梁二人入手。1904年,慈禧曾在“万寿”之年赦免了维新人士,但只有曾意图暴力夺权的康、梁和孙文被排除在外。因此,庆袁党羽之一给事中陈庆桂便试图弹劾岑春煊,指控他同样和康有为等人有关系,然而该奏折却为顾念旧情的慈禧留中未发:


“太后曾恶康党,以春煊新被宠,不应有是,待之如初。”



与之形成鲜明对比的,就是在岑被赶出京城不久,瞿鸿禨即因结党罪名而被免职。陈庆桂弹劾失败后,奕劻、袁世凯二人继续盯紧岑春煊的动向,终于等到了五月梁启超抵达上海与岑春煊会面的传闻。他们旋即通过电报,要求两江总督端方“设密确查”,后者确认了消息属实,并将所收集情报汇往京城。然而,慈禧虽“动于奕劻之危词,屏而远之,而犹有念旧之意”,此时,若是他们仍一味纠缠,恐怕会产生反效果。就在奕劻、袁世凯二人苦恼之际,一个外来的“小人物”,和他手中的相机,彻底改变了政局的走向。


晚清假照片事件


蔡乃煌,广东番禺人,1891年中举,此后虽辗转于洋务局、机器局、川汉铁路总公司等新式部门,却仕途不顺,久不得志。他曾想趁岑春煊病居上海之时,试图攀附这位四川总督,但被“峻拒之”。因此,他最终钻营进京,改投至袁世凯门下。而他的晋身之资,就是一张有关岑春煊的假照片。


相机在晚清的中国是个绝对的稀罕玩意,即便是达亲显贵,在第一次接触摄影时,甚至也会恐慌地以为照片能摄取他们的魂魄,避之不及,因此,知道照片还能被造假合成的人就更少了。



蔡乃煌对洋务工艺涉猎颇广,因此献计并承办了此事。他分别取得了岑春煊、康有为和梁启超的照片,到一广东同乡所经营的照相馆合放拍下,便形成了一张他们在上海时报馆前“共立相语”的假合照。随后,他亲自将之带去了天津,交到了袁世凯的手中。



在那个初初萌生“有图有真相”观念的年代,这可谓“板上钉钉”“不容辩驳”的“铁证”。而在假合照外,袁世凯等人还选择双管齐下,他们拉拢了原清流人士,翰林院侍读学士恽毓鼎于七月二日上书弹劾(前一天晚上,蔡乃煌和引介人顾亚蘧即来其家中“久谈”),大肆渲染岑与康有为、梁启超等人密谋勾结、居心叵测的情状,暗示其将“阴借外援”。需要说明的是,这批人不仅曾有协助光绪帝政变的“前科”,还在当时与日本关系紧密,而日本刚刚逼迫韩国皇帝李熙退位,慈禧曾被洋人干涉立储,最终导致庚子事变并狼狈出逃,这无疑触动了慈禧的敏感神经。就在她仍存有犹豫之际,假合照被“巧妙”呈上,慈禧彻底信服:


“相片无讹,默对至时许,叹曰:‘春煊亦通党负我,天下事真弗可逆料矣!虽然彼负我,我不负彼,可准其退休。’”



于是又次日,即七月四日,岑春煊即被以久病未痊的名义,彻底革职赋闲。至此,清流一败涂地,奕劻、袁世凯一方最终取得了丁未政潮的胜利。


在刘禺生的《世载堂杂忆》中,《假照片计陷岑春煊》还拥有另一个版本,那便是同盟会香港分会会长的广东新会人陈少白,为报复两广总督岑春煊借慈禧之眷顾,手段酷烈地查抄富商,就制作了岑与康、梁、麦联坐合影的假照片,出售于大街小巷,刊载于报纸媒体,还重金收买太监,传入宫内,由此慈禧震怒,罢免了岑春煊。而岑为洗脱罪名,便求助于慈禧宠信的太监李莲英。后者则将慈禧扮成观音,与自己扮作韦陀的单人照合成后送给慈禧,暗示这不过是奸人伪造的冤情,于是慈禧意遂释然。然而,在真实的历史中,这一时期双方的关系已经恶化。岑春煊进京后,有人建议他为了维护清誉,“宜绝阉人”,因此在李莲英向其示好馈食时,他便断然拒绝了,李莲英由是深恨之。时人和学者据此推断,正是李莲英参与到了袁世凯等人的运作当中,协助将假照片献给了慈禧。由此观之,岑的落败,或许也有其性格缺陷的原因。据说他曾在初入邮传部时叹曰:“过刚则折,微特不克报国家,且恐为佥壬所中。”竟不幸一语成谶。



丁未政潮极大地影响了清廷的政局和新政的结果。客观上,奕劻、袁世凯与瞿鸿禨、岑春煊两方阵营的争斗与内耗,导致了以载沣为首的满族权贵的崛起。继岑春煊被斗倒,袁世凯也在同年被朝廷以明升暗降的方式削去了最后的军权。因此,这场假照片事件的谋划人与受害者,都不是真正的赢家。反而是那个看似感性、优柔寡断的慈禧,在拉一派、打一派的“摇摆不定”中,压制了自太平天国起便逐年膨胀的汉人官僚势力,在后续的立宪过程中令满人“联翩而长部务,汉人之势大拙”。然而,这赤裸的“重满抑汉”倾向,与最终皇族内阁的出台,却也彻底将清廷立宪的改革工作钉在了耻辱柱上。而在深重的失望与愤怒中诞生的中华民国,也将把清王朝彻底倾覆。在此过程中,在丁未政潮中先后落败的岑春煊与袁世凯殊途同归,一个被任命镇压四川保路运动却支持了起义;另一个在奉诏率军讨贼后却威逼了清帝退位,纷纷成了所谓“爱新觉罗王朝的两大叛臣”。假使慈禧死后有灵,她便能知晓自己亦不是最终的赢家……


参考文献:

张华腾:《清末袁世凯与岑春煊关系述论》,《河南大学学报》(社会版)1996年.

尹传刚:《岑春煊与丁未政潮》,《沧桑》2010年.

谢晓博:《浅论丁未年慈禧对岑春煊的疏弃对清末新政的影响》,《贵阳学院学报》(社会科学版)2012年.

陶易:《清朝末年的“照相门”事件》,《文史天地》2012年.

易海涛:《略论清末民初岑春煊与袁世凯的恩怨纠纷》,《陇东学院学报》2013年.

金满楼:《岑春煊的肃贪与挨整》,《中国经济报告》2014年.

水浩淼:《丁未政潮和清末政局——以清、浊党争为视角》,《宜宾学院学报》2014年.

刘鹏超:《恽毓鼎与丁未政潮》,《中国国家博物馆馆刊》2016年.

张洋伟:《试述丁未政潮及对晚清政局影响》,《湘南学院学报》2017年.

于云豪:《岑春煊人物评述》,《文化学刊》2020年.

張建斌:《丁未袁世凱致端方密信箋釋》,《中华文史论丛》2021年.

张建斌:《端方与“丁未政潮”》,《近代史研究》2021年.

唐论:《计中计:丁未“假照片事件”探析》,《清史研究》2022年.


*本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。



END
作者 | 曾亦嘉‍‍‍‍‍‍‍
编辑 | 胡心雅‍
主编 | 周斌
排版 | 徐沁(实习)‍
校对 | 古月
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"
\"图片\"

“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "category": "", - "link": "http://weixin.sogou.com/weixin?type=2&query=%E5%9B%BD%E5%AE%B6%E4%BA%BA%E6%96%87%E5%8E%86%E5%8F%B2+%E4%B8%80%E4%B8%AA%E6%95%A2P%EF%BC%8C%E4%B8%80%E4%B8%AA%E6%95%A2%E4%BF%A1%EF%BC%9A%E6%85%88%E7%A6%A7%E5%AE%A0%E8%87%A3%E7%AB%9F%E8%A2%AB%E4%B8%80%E5%BC%A0%E5%81%87%E7%85%A7%E7%89%87%E6%89%B3%E5%80%92%EF%BC%9F", - "creator": "", - "pubDate": "Thu, 17 Jul 2025 12:20:00 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "人文", - "feed": "国家人文历史", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "f6d09e75646242d9853ca5201f0d3c3e", - "highlights": [] - }, - { - "title": "逼得清廷差点放弃西南七省,南明最后一位名将李定国有多猛?", - "description": "



本 文 约 4500 字
阅 读 需 要 13 分钟


在明末清初风云变幻的时代,南明的历史虽因短暂而常常被忽视,但这段历史中同样涌现了无数可歌可泣的人物。被誉为南明最后一位名将的李定国正是其中的代表,三个世纪后,无数致力于推翻腐朽清政权的革命党人依旧在以他为榜样,章太炎就曾高呼“愿吾滇人,无忘李定国”。


那么,李定国究竟是何许人也?



胡风南渡尽草偃

大义捐嫌王出真


李定国出身贫寒,自幼颠沛流离,深受战乱之苦。据传,年仅十岁时,他便孤身投身于农民起义军,毅然踏上戎马生涯。当时义军首领张献忠见其机敏果敢、胆识过人,便将其收为义子,从此李定国改姓张,随军南征北战,深得宠信。

少年李定国酷嗜兵书,尤爱研读《孙子兵法》《资治通鉴》,兵法战略早已烂熟于心,久之成就“勇而有谋”之名将气质。



1646年底,张献忠在四川战死,西南局势突变。其麾下“四大义子”——孙可望、李定国、刘文秀、艾能奇,俱为久经沙场的青年将领。张献忠死后,四人合力清除旧部中残虐暴戾者,遂各复本姓,以孙可望为盟主,重新整军图强。鉴于清军势盛,孙可望力主挥军西进,占据云贵,以此作为抗清根据地。


彼时云南政局动荡,既有盘踞一方的土司沙定洲,又有依附南明宗室沐天波的旧部势力,割据林立。崇祯帝殉国后,南明虽得以立国,但因清军步步紧逼,始终未能建立有效统治中心,致使沐天波虽为云南世袭黔国公,却难以掌控全局。1645年,沙定洲乘机割据起事,公开挑战南明权威,欲自立为王。



1647年,孙可望、李定国等率军挥师入滇,采取诱敌之策,密令士卒四处传播谣言,声称此行是奉南明政权之命,为沐天波复仇、讨伐叛逆。云南百姓信以为真,沿途纷纷开城迎降,李定国等乘势长驱直入,进展神速。


入滇之后,李定国与刘文秀分兵而进,迅速围歼沙定洲部,将其困于断水绝粮之寨。敌军饥渴交迫,终于弃械投降。李定国将沙定洲及其核心爪牙处决后,宽释了其余部众,并严令全军军纪森严,秋毫无犯,违令者斩。此役之后,云南局势基本稳定。在此战中,年轻的李定国不仅表现出卓越的军事才能,更展现出高超的治军能力与宽仁的政治手腕,赢得军民爱戴。他与孙可望等人以云南为根基,广纳流亡,屯田养兵,蓄势待发,誓图中兴之举。



一身转战千里路

只手曾擎半壁天


孙可望入滇之后,着力将云南建设为稳定可靠的后方基地,以便整饬军马、积蓄兵粮,为将来与清军再度决战奠定基础,两年间,军力迅速恢复,兵精粮足,局势渐趋稳固。他曾自信地言道:


“年来以云南一隅之地,兵精粮足,欲图大举,以复中原。”



此言虽显雄心,然滇中偏隅之地,难以独力支撑反清大业。因此孙可望深知,若欲成大事,单凭一隅之力远不足恃。权衡再三,他遂与李定国等人商议,决定摒弃割据自雄之念,转而拥戴明室,借助南明正统名号,与朝廷合作,以图联合各方力量抗清。


1649年,孙可望致书南明朝廷,表明“联合恢剿”之志,并请赐封“秦王”。永历朝廷虽欲联盟,却顾虑其出身草寇,犹豫不决,先拟封景国公,后来又改封“平辽王”,与此同时,南明权臣陈邦傅利用永历帝给他的空白诏书,伪诏封孙可望为“秦王”。永历帝虽然不满但是也没有办法,因为此时南明政权的形势已经岌岌可危,几无立锥之地。1652年,永历朝廷被迫随孙可望等人迁驻安隆千户所——后改称安龙府(今贵州境内),使南明朝廷与原大西军势力实现全面融合。


内部纷争甫一平息,孙可望、李定国等便迅速转守为攻,着手应对自四面八方压境而来的清军。1652年,李定国挥师挺进湖南,五月中旬他乘势发起猛攻,重兵围困靖州(今靖州苗族侗族自治县)城下的清军主力。在李定国的指挥下,清军节节败退,几近全军覆没。南明军则乘胜追击,一鼓作气攻克靖州与武冈州,取得“靖州大捷”。


在成功收复湖南大部地区之后,李定国乘势挥师南下,矛头直指广西。1652年,他率军攻克全州(今广西壮族自治区全州县),歼清守将孙龙、李养性,继而再创“全州大捷”。随后,李定国继续推进,进逼桂林。清定南王孔有德亲率大军驰援,于兴安县严关设防,企图凭险死守。然而南明军势如破竹,调遣象阵先驱突击,清军溃不成军,史载“象亦突阵,王师大奔,死亡不可胜计,横尸遍野”,严关之战遂告大捷。孔有德当晚狼狈奔回桂林,闭城自守,惶惶若丧家之犬。



七月初一,孔有德再战失利。“兵未交而象阵前列,劲卒山拥,尘沙蔽日,马闻象鸣皆颠厥”,清军大乱,孔部遂溃,仅孔一人侥幸返城。李定国旋即围攻桂林,至七月初四,李定国率军攻破武胜门,清军全线溃散。孔有德在混乱中中箭自知必死,遂“聚其宝玩于一室,手刃爱姬,闭户自焚”,自绝于火。南明军队乘胜固守桂林,挥军各路,先后收复平乐、梧州、柳州、南宁等重镇。至八月,进兵湖南,光复永州(今湖南省永州市)、衡州(今湖南省衡阳市);十月攻克岳州(今湖南岳阳市),所向披靡。据史料记载:


“凡七月,复郡十六、州二,辟地将三千里,军声大振。”


清军在南线接连败绩的消息传至北京,顺治帝大为震惊。1652年七月,他命敬谨亲王尼堪率八旗劲旅南下征剿。十一月十九日,尼堪抵湘潭;二十二日,清军逼近衡阳三十余里。李定国设下诱敌之计,先遣部分部队佯败而退。尼堪骄矜轻敌,误判敌情,遂令大军急进。翌日黎明,清军抵衡阳郊外,与李定国主力遭遇。明军预伏重兵,初战即佯退,引清军深入二十余里后伏兵四起,前后夹击。清军仓皇应战,无力回天,主将尼堪与一等伯程尼阵亡于乱军之中,清军再无还手之力,衡阳大捷由此告成。



李定国连战连捷,极大扭转西南抗清战局。清廷震恐,甚至开始考虑放弃湘、粤、桂、赣、川、滇、黔七省。黄宗羲曾评价李定国:


“桂林、衡州之捷,两蹶名王,天下震动,此万历以来全盛之天下所不能有,功垂成而物败之,可望之肉其足食乎!屈原所以呵笔而问天也!”



南明朝野闻捷,士气大振。李定国因此被封为“西宁王”,一时威望如日中天。


然而,衡阳之胜亦引发内斗隐患。孙可望看李定国战功显赫,渐生猜忌,不仅在军事上掣肘其行动,更暗中图谋不轨。李定国察觉局势难以调和,为免内耗,不得不收敛锋芒,黯然撤出湖南,致使抗清大势再度受挫。


凛凛孤忠志独坚

手持一木欲撑天


1653年冬,由于孙可望处处掣肘,李定国被迫放弃继续扩大战果、稳固湖南的战略,率部回师广西整军休养。为摆脱孙氏势力之干扰,李定国决意另辟蹊径,将作战重心转向东南广东。当时清军已控制广东全境,而福建海上郑成功尚据守厦门,虽为南明藩镇,然与朝廷联系疏远。李定国认为与其受制于人,不如主动联郑图变,南北呼应,于广东开疆辟土。



1653至1654年间,李定国两度进军广东。首战爆发于肇庆,他自广西贺县出发,千里奔袭,克梧州,占封川、开建、德庆等地,兵锋直逼肇庆。此地为广州西部门户,清军守将许尔显固守要地,死战不退。李定国亲临城下,云梯攻城,连日鏖战未果,遂改用掘地埋药之计,炸毁城墙。正当胜负未决之际,清廷急令两广总督、平南王尚可喜率援军驰援。李定国见攻城无果、援兵迟至,只能撤军。虽未攻下肇庆,但他在这期间招抚乡勇、联络义师,致使义军纷起,令清廷震恐,急调江南绿营南下。休整未久,1654年李定国再度东进,剑指珠江门户新会,意在联手郑成功攻取广州。但新会同样久围不下,李定国见久攻无望,再度撤返南宁。


此时,南明永历帝朱由榔在贵州安龙偏居一隅,虽为名义之君,实受孙可望钳制,俨然傀儡。有人偷偷向李定国求援,他决定孤注一掷,奇袭安龙,以迎驾归滇,脱离孙氏控制。李定国整兵潜行,由广西直赴贵州。孙可望听到消息后,赶紧沿途焚粮设防,希望能以此困死李定国。李定国则命全军昼夜兼程,于1656年正月逼近安龙。孙可望急遣叶应祯入宫逼永历帝启驾贵阳。朝中大臣白文选奋然阻拦,言辞慷慨,叶应祯不得不退。一天早上,天下大雾,雾中忽有骑兵绕城高呼:“西府大兵至矣!”安龙城内欢声雷动,永历帝亲自迎接李定国入城,感动泣言:“久知卿忠义,恨相见之晚。”



李定国即与白文选商议让永历帝迁至昆明。彼时云南虽由孙可望所控,然昆明系大西军旧地,刘文秀与李定国皆深孚众望。几日后,李定国护送永历帝、皇后、太子启程西迁,在曲靖暂驻整顿。李定国先行赴昆明布置,昆明将领王尚礼、贺九义虽为孙可望旧部,然在刘文秀斡旋下,不敢强拒。永历帝在李定国亲军护卫下风风光光地进了昆明城。


残碑读罢呼雄鬼

生死都从李晋王


李定国迎奉永历帝入滇,标志着孙可望挟天子以令诸侯的算盘彻底破产。走投无路之际,孙可望转而向清廷投降。他献上云贵舆图,把西南军事部署全部泄漏。清廷大喜,立马封他为“义王”,视其为破局西南的一张王牌。孙氏降清后,配合清军诱降众多原大西系统将领。时人刘坊于《哀龙江》诗序中记曰:


“戊戌冬,清师距遮炎河,道路谬传:可望师至矣!我兵闻风皆睋而失色,或寤者曰:国主至矣!至矣!相率惊窜。”


其影响之深,可见一斑。



1658年春,清廷趁势发动大规模攻势,分三路进逼云贵:北路由平西王吴三桂率清军入川黔;中路由固山贝勒罗托、经略洪承畴自湖南西进;南路则由固山额真赵布泰自两广北上。若此时李定国先发制人,各个击破,未必无翻盘之机,然内耗新止,军心未固,李定国未敢贸然出战,终致良机坐失。清军三路并进,直插黔中,南明军望风而溃。至五月,贵阳失守,贵州大部陷落。永历朝廷仓皇应变,至夏末方令李定国发兵救援,然大势已去,南明军陷入被动。


面对清军压境,李定国决定以一战挽狂澜。1659年2月21日,吴三桂统军渡怒江,直逼腾越州。李定国勘察地形,知怒江以西山险林密,道路狭仄,唯容单骑,于是在磨盘山布设三重埋伏:命泰安伯窦名望为先伏,高文贵为二伏,王国玺为三伏,三军夹击,期待一举歼敌。部队夜行避烟,行军隐秘。然而清军先锋入伏之际,南明光禄寺少卿卢桂生叛变泄密,吴三桂收到消息后立刻撤掉前锋,并组织反伏击。南明军失机,未敢擅动,伤亡惨重。窦名望被迫鸣炮应战,伏兵尽出,鏖战四起。李定国居山巅以炮声判断战况,迅即调兵增援,奋力追击,终迫吴三桂撤军,然南明军亦伤亡惨重,后继乏力。



永历帝则仓皇出逃滇西南缅境,寻求庇护于缅王。1662年,吴三桂挥军入缅,缅王不敌清军压力,遂将永历父子缚献吴营。不久,朱由榔与太子俱为吴三桂弓弦所勒,死于昆明,南明政权自此覆灭。噩耗传至滇南深山,李定国闻之哀痛欲绝,闭门数日不出。1662年,李定国病逝于缅甸勐腊,年42岁。临终前,他嘱咐儿子与部属:“宁死荒徼,无降也!”言罢撒手人寰。


此役既终,西南抗清亦告覆灭。

 

参考文献:

顾诚:《南明史》,北京日报出版社2023年版。

张玉兴:《南明五帝:抗争、困局与幻灭》。岳麓书社2025年版。

翦伯赞:《南明史略》,北京人民出版社2019年版。 


本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。


\"图片\"
END
作者 | 文德
编辑 | 胡心雅 
 主编 | 周斌
排版 | 曲晨溪(实习)
校对 | 古月
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"
\"图片\"

“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "content": "



本 文 约 4500 字
阅 读 需 要 13 分钟


在明末清初风云变幻的时代,南明的历史虽因短暂而常常被忽视,但这段历史中同样涌现了无数可歌可泣的人物。被誉为南明最后一位名将的李定国正是其中的代表,三个世纪后,无数致力于推翻腐朽清政权的革命党人依旧在以他为榜样,章太炎就曾高呼“愿吾滇人,无忘李定国”。


那么,李定国究竟是何许人也?



胡风南渡尽草偃

大义捐嫌王出真


李定国出身贫寒,自幼颠沛流离,深受战乱之苦。据传,年仅十岁时,他便孤身投身于农民起义军,毅然踏上戎马生涯。当时义军首领张献忠见其机敏果敢、胆识过人,便将其收为义子,从此李定国改姓张,随军南征北战,深得宠信。

少年李定国酷嗜兵书,尤爱研读《孙子兵法》《资治通鉴》,兵法战略早已烂熟于心,久之成就“勇而有谋”之名将气质。



1646年底,张献忠在四川战死,西南局势突变。其麾下“四大义子”——孙可望、李定国、刘文秀、艾能奇,俱为久经沙场的青年将领。张献忠死后,四人合力清除旧部中残虐暴戾者,遂各复本姓,以孙可望为盟主,重新整军图强。鉴于清军势盛,孙可望力主挥军西进,占据云贵,以此作为抗清根据地。


彼时云南政局动荡,既有盘踞一方的土司沙定洲,又有依附南明宗室沐天波的旧部势力,割据林立。崇祯帝殉国后,南明虽得以立国,但因清军步步紧逼,始终未能建立有效统治中心,致使沐天波虽为云南世袭黔国公,却难以掌控全局。1645年,沙定洲乘机割据起事,公开挑战南明权威,欲自立为王。



1647年,孙可望、李定国等率军挥师入滇,采取诱敌之策,密令士卒四处传播谣言,声称此行是奉南明政权之命,为沐天波复仇、讨伐叛逆。云南百姓信以为真,沿途纷纷开城迎降,李定国等乘势长驱直入,进展神速。


入滇之后,李定国与刘文秀分兵而进,迅速围歼沙定洲部,将其困于断水绝粮之寨。敌军饥渴交迫,终于弃械投降。李定国将沙定洲及其核心爪牙处决后,宽释了其余部众,并严令全军军纪森严,秋毫无犯,违令者斩。此役之后,云南局势基本稳定。在此战中,年轻的李定国不仅表现出卓越的军事才能,更展现出高超的治军能力与宽仁的政治手腕,赢得军民爱戴。他与孙可望等人以云南为根基,广纳流亡,屯田养兵,蓄势待发,誓图中兴之举。



一身转战千里路

只手曾擎半壁天


孙可望入滇之后,着力将云南建设为稳定可靠的后方基地,以便整饬军马、积蓄兵粮,为将来与清军再度决战奠定基础,两年间,军力迅速恢复,兵精粮足,局势渐趋稳固。他曾自信地言道:


“年来以云南一隅之地,兵精粮足,欲图大举,以复中原。”



此言虽显雄心,然滇中偏隅之地,难以独力支撑反清大业。因此孙可望深知,若欲成大事,单凭一隅之力远不足恃。权衡再三,他遂与李定国等人商议,决定摒弃割据自雄之念,转而拥戴明室,借助南明正统名号,与朝廷合作,以图联合各方力量抗清。


1649年,孙可望致书南明朝廷,表明“联合恢剿”之志,并请赐封“秦王”。永历朝廷虽欲联盟,却顾虑其出身草寇,犹豫不决,先拟封景国公,后来又改封“平辽王”,与此同时,南明权臣陈邦傅利用永历帝给他的空白诏书,伪诏封孙可望为“秦王”。永历帝虽然不满但是也没有办法,因为此时南明政权的形势已经岌岌可危,几无立锥之地。1652年,永历朝廷被迫随孙可望等人迁驻安隆千户所——后改称安龙府(今贵州境内),使南明朝廷与原大西军势力实现全面融合。


内部纷争甫一平息,孙可望、李定国等便迅速转守为攻,着手应对自四面八方压境而来的清军。1652年,李定国挥师挺进湖南,五月中旬他乘势发起猛攻,重兵围困靖州(今靖州苗族侗族自治县)城下的清军主力。在李定国的指挥下,清军节节败退,几近全军覆没。南明军则乘胜追击,一鼓作气攻克靖州与武冈州,取得“靖州大捷”。


在成功收复湖南大部地区之后,李定国乘势挥师南下,矛头直指广西。1652年,他率军攻克全州(今广西壮族自治区全州县),歼清守将孙龙、李养性,继而再创“全州大捷”。随后,李定国继续推进,进逼桂林。清定南王孔有德亲率大军驰援,于兴安县严关设防,企图凭险死守。然而南明军势如破竹,调遣象阵先驱突击,清军溃不成军,史载“象亦突阵,王师大奔,死亡不可胜计,横尸遍野”,严关之战遂告大捷。孔有德当晚狼狈奔回桂林,闭城自守,惶惶若丧家之犬。



七月初一,孔有德再战失利。“兵未交而象阵前列,劲卒山拥,尘沙蔽日,马闻象鸣皆颠厥”,清军大乱,孔部遂溃,仅孔一人侥幸返城。李定国旋即围攻桂林,至七月初四,李定国率军攻破武胜门,清军全线溃散。孔有德在混乱中中箭自知必死,遂“聚其宝玩于一室,手刃爱姬,闭户自焚”,自绝于火。南明军队乘胜固守桂林,挥军各路,先后收复平乐、梧州、柳州、南宁等重镇。至八月,进兵湖南,光复永州(今湖南省永州市)、衡州(今湖南省衡阳市);十月攻克岳州(今湖南岳阳市),所向披靡。据史料记载:


“凡七月,复郡十六、州二,辟地将三千里,军声大振。”


清军在南线接连败绩的消息传至北京,顺治帝大为震惊。1652年七月,他命敬谨亲王尼堪率八旗劲旅南下征剿。十一月十九日,尼堪抵湘潭;二十二日,清军逼近衡阳三十余里。李定国设下诱敌之计,先遣部分部队佯败而退。尼堪骄矜轻敌,误判敌情,遂令大军急进。翌日黎明,清军抵衡阳郊外,与李定国主力遭遇。明军预伏重兵,初战即佯退,引清军深入二十余里后伏兵四起,前后夹击。清军仓皇应战,无力回天,主将尼堪与一等伯程尼阵亡于乱军之中,清军再无还手之力,衡阳大捷由此告成。



李定国连战连捷,极大扭转西南抗清战局。清廷震恐,甚至开始考虑放弃湘、粤、桂、赣、川、滇、黔七省。黄宗羲曾评价李定国:


“桂林、衡州之捷,两蹶名王,天下震动,此万历以来全盛之天下所不能有,功垂成而物败之,可望之肉其足食乎!屈原所以呵笔而问天也!”



南明朝野闻捷,士气大振。李定国因此被封为“西宁王”,一时威望如日中天。


然而,衡阳之胜亦引发内斗隐患。孙可望看李定国战功显赫,渐生猜忌,不仅在军事上掣肘其行动,更暗中图谋不轨。李定国察觉局势难以调和,为免内耗,不得不收敛锋芒,黯然撤出湖南,致使抗清大势再度受挫。


凛凛孤忠志独坚

手持一木欲撑天


1653年冬,由于孙可望处处掣肘,李定国被迫放弃继续扩大战果、稳固湖南的战略,率部回师广西整军休养。为摆脱孙氏势力之干扰,李定国决意另辟蹊径,将作战重心转向东南广东。当时清军已控制广东全境,而福建海上郑成功尚据守厦门,虽为南明藩镇,然与朝廷联系疏远。李定国认为与其受制于人,不如主动联郑图变,南北呼应,于广东开疆辟土。



1653至1654年间,李定国两度进军广东。首战爆发于肇庆,他自广西贺县出发,千里奔袭,克梧州,占封川、开建、德庆等地,兵锋直逼肇庆。此地为广州西部门户,清军守将许尔显固守要地,死战不退。李定国亲临城下,云梯攻城,连日鏖战未果,遂改用掘地埋药之计,炸毁城墙。正当胜负未决之际,清廷急令两广总督、平南王尚可喜率援军驰援。李定国见攻城无果、援兵迟至,只能撤军。虽未攻下肇庆,但他在这期间招抚乡勇、联络义师,致使义军纷起,令清廷震恐,急调江南绿营南下。休整未久,1654年李定国再度东进,剑指珠江门户新会,意在联手郑成功攻取广州。但新会同样久围不下,李定国见久攻无望,再度撤返南宁。


此时,南明永历帝朱由榔在贵州安龙偏居一隅,虽为名义之君,实受孙可望钳制,俨然傀儡。有人偷偷向李定国求援,他决定孤注一掷,奇袭安龙,以迎驾归滇,脱离孙氏控制。李定国整兵潜行,由广西直赴贵州。孙可望听到消息后,赶紧沿途焚粮设防,希望能以此困死李定国。李定国则命全军昼夜兼程,于1656年正月逼近安龙。孙可望急遣叶应祯入宫逼永历帝启驾贵阳。朝中大臣白文选奋然阻拦,言辞慷慨,叶应祯不得不退。一天早上,天下大雾,雾中忽有骑兵绕城高呼:“西府大兵至矣!”安龙城内欢声雷动,永历帝亲自迎接李定国入城,感动泣言:“久知卿忠义,恨相见之晚。”



李定国即与白文选商议让永历帝迁至昆明。彼时云南虽由孙可望所控,然昆明系大西军旧地,刘文秀与李定国皆深孚众望。几日后,李定国护送永历帝、皇后、太子启程西迁,在曲靖暂驻整顿。李定国先行赴昆明布置,昆明将领王尚礼、贺九义虽为孙可望旧部,然在刘文秀斡旋下,不敢强拒。永历帝在李定国亲军护卫下风风光光地进了昆明城。


残碑读罢呼雄鬼

生死都从李晋王


李定国迎奉永历帝入滇,标志着孙可望挟天子以令诸侯的算盘彻底破产。走投无路之际,孙可望转而向清廷投降。他献上云贵舆图,把西南军事部署全部泄漏。清廷大喜,立马封他为“义王”,视其为破局西南的一张王牌。孙氏降清后,配合清军诱降众多原大西系统将领。时人刘坊于《哀龙江》诗序中记曰:


“戊戌冬,清师距遮炎河,道路谬传:可望师至矣!我兵闻风皆睋而失色,或寤者曰:国主至矣!至矣!相率惊窜。”


其影响之深,可见一斑。



1658年春,清廷趁势发动大规模攻势,分三路进逼云贵:北路由平西王吴三桂率清军入川黔;中路由固山贝勒罗托、经略洪承畴自湖南西进;南路则由固山额真赵布泰自两广北上。若此时李定国先发制人,各个击破,未必无翻盘之机,然内耗新止,军心未固,李定国未敢贸然出战,终致良机坐失。清军三路并进,直插黔中,南明军望风而溃。至五月,贵阳失守,贵州大部陷落。永历朝廷仓皇应变,至夏末方令李定国发兵救援,然大势已去,南明军陷入被动。


面对清军压境,李定国决定以一战挽狂澜。1659年2月21日,吴三桂统军渡怒江,直逼腾越州。李定国勘察地形,知怒江以西山险林密,道路狭仄,唯容单骑,于是在磨盘山布设三重埋伏:命泰安伯窦名望为先伏,高文贵为二伏,王国玺为三伏,三军夹击,期待一举歼敌。部队夜行避烟,行军隐秘。然而清军先锋入伏之际,南明光禄寺少卿卢桂生叛变泄密,吴三桂收到消息后立刻撤掉前锋,并组织反伏击。南明军失机,未敢擅动,伤亡惨重。窦名望被迫鸣炮应战,伏兵尽出,鏖战四起。李定国居山巅以炮声判断战况,迅即调兵增援,奋力追击,终迫吴三桂撤军,然南明军亦伤亡惨重,后继乏力。



永历帝则仓皇出逃滇西南缅境,寻求庇护于缅王。1662年,吴三桂挥军入缅,缅王不敌清军压力,遂将永历父子缚献吴营。不久,朱由榔与太子俱为吴三桂弓弦所勒,死于昆明,南明政权自此覆灭。噩耗传至滇南深山,李定国闻之哀痛欲绝,闭门数日不出。1662年,李定国病逝于缅甸勐腊,年42岁。临终前,他嘱咐儿子与部属:“宁死荒徼,无降也!”言罢撒手人寰。


此役既终,西南抗清亦告覆灭。

 

参考文献:

顾诚:《南明史》,北京日报出版社2023年版。

张玉兴:《南明五帝:抗争、困局与幻灭》。岳麓书社2025年版。

翦伯赞:《南明史略》,北京人民出版社2019年版。 


本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。


\"图片\"
END
作者 | 文德
编辑 | 胡心雅 
 主编 | 周斌
排版 | 曲晨溪(实习)
校对 | 古月
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"
\"图片\"

“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "category": "", - "link": "http://weixin.sogou.com/weixin?type=2&query=%E5%9B%BD%E5%AE%B6%E4%BA%BA%E6%96%87%E5%8E%86%E5%8F%B2+%E9%80%BC%E5%BE%97%E6%B8%85%E5%BB%B7%E5%B7%AE%E7%82%B9%E6%94%BE%E5%BC%83%E8%A5%BF%E5%8D%97%E4%B8%83%E7%9C%81%EF%BC%8C%E5%8D%97%E6%98%8E%E6%9C%80%E5%90%8E%E4%B8%80%E4%BD%8D%E5%90%8D%E5%B0%86%E6%9D%8E%E5%AE%9A%E5%9B%BD%E6%9C%89%E5%A4%9A%E7%8C%9B%EF%BC%9F", - "creator": "", - "pubDate": "Wed, 16 Jul 2025 19:26:00 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "人文", - "feed": "国家人文历史", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "e33a51a88ca18050e1c22189dc3c0dbf", - "highlights": [] - }, - { - "title": "一个宰相因为囤胡椒被处死……到底怎么个事儿?", - "description": "



本 文 约 3300 字
阅 读 需 要 11 分钟


公元777年,唐代宗以“夜设巫蛊”的罪名逮捕宰相元载,命人查抄他的宅邸,其中查获钟乳500两,胡椒800石,此举引得代宗震怒,立刻下诏将元载赐死。


唐代宗李俶的影视形象。来源/影视剧《大唐荣耀》


胡椒在当时是贵重之物,八百石的胡椒价值不菲。元载因此被后世讥笑为“胡椒宰相”,宋人作诗讽刺他“相国藏椒八百斛”。可以想见,单单是数额庞大的胡椒藏量,就足以引起皇帝的震怒了。


不过,胡椒在唐代为何如此昂贵?一朝宰相又为何囤积这么多胡椒呢?


胡椒背后的阿拉伯人与海外贸易


胡椒名称中的“胡”字即代表它乃是由西域传入的胡人香料,并非原产自中国。唐代的胡椒几乎全部由阿拉伯商人经丝绸之路转运至中国内地。中文史料中关于胡椒的记载早期见于西晋司马彪撰写的《续汉书》,其中记载“天竺国出石蜜、胡椒、黑盐”。此后围绕着胡椒的产地,史料中陆续出现了印度、波斯、西域和南海诸国等说法。玄奘在《大唐西域记》中也记载印度南部的阿吒厘国“出胡椒树,树叶若蜀椒也”。


胡椒自传入中国后,因其稀缺性,价格一直居高不下。公元751年,唐王朝在怛罗斯之战中败给了大食国,加之随后的安史之乱,一系列变故使大唐在西域的影响力降低,陆上丝绸之路受到冲击,由阿拉伯人经营的海上丝绸之路开始慢慢成为贸易的主要途径,胡椒也在这一时期成为阿拉伯人赚取利润的重要商品。



阿拉伯人逐渐掌握了海上丝绸之路后,将胡椒作为明星商品进行包装,并采取了一系列手段操控价格。阿拉伯人首先为胡椒打造了一系列神话,他们曾向罗马人宣称胡椒只生长在由神龙看管的瀑布之下,威尼斯商人也借此将胡椒命名为“天堂的种子”。面对唐人,阿拉伯人又谎称在印度的胡椒林毒蛇盘踞,需要放火烧林将毒蛇驱逐后才能采摘,因而胡椒呈现出黑色且气味辛辣。种种天方夜谭般的故事为胡椒披上了一层神秘的外衣,迫使唐人不得不接受胡椒高昂的价格,并将之作为尊贵的象征。



在海运胡椒的过程中,阿拉伯人在沿途设立征税点,对过往补给的商船征收高额关税,尤其针对中国船只。据阿拉伯商人苏莱曼撰写的《中国印度见闻录》中记载,在斯里兰卡的一处征税点,阿拉伯人对过往的中国商船征收50迪纳尔的关税,而其余船只则仅需10-20迪纳尔。此举大大增加了中国商船的运输成本,也迫使胡椒商越来越依赖阿拉伯船队进行运输。此外,阿拉伯人还散布“唐船抗风浪弱”的谣言,进一步压缩中国商人在胡椒贸易中的份额,从而实现自身的垄断。


当胡椒乘风破浪进入中国后,阿拉伯人又不断为胡椒增添附加值,宣扬其豪奢与稀缺性,甚至催生了胡椒直接兑换丝绸、瓷器的现象。据传,1石胡椒可直接兑换10匹杭州产的丝绸。


此外,唐代广州市舶司规定外商货物需存入官仓6个月,对于政府需要的商品,政府以最高市价收购,阿拉伯商人趁机抬高价格,仅此一项即可获利超200%。更有甚者,阿拉伯人还通过贿赂市舶司官员建立走私渠道,逃避关税。史载,中唐时期广州港30%的胡椒交易未纳税,利润全归阿拉伯商团。阿拉伯人依靠胡椒在广州换取中国货物,运至巴格达出售后利润翻倍,而后再用白银采购印度胡椒,形成“胡椒→中国商品→白银→胡椒”的闭环资本链,按现代模型估计年收益率超300%。


国历君自制资本链模拟图。


唐代的胡椒有多流行


虽然胡椒的价格一直居高不下,但不妨碍其在皇室、贵族与上层社会中广受喜爱。


唐代饮食中对于胡椒的使用主要是调味、佐酒和作羹等。


唐,白釉绿彩盖盒。来源/故宫博物院


和今天类似,唐代胡椒首先搭配的就是牛羊肉。《齐民要术》中关于“胡炮肉法”的记述中便提到,羊肉在切好后要:


“著浑豉、盐、繴葱白、姜、椒、毕拨、胡椒,令调适。”


这样经过胡椒腌制后的羊肉再放入炉中烧烤,滋味远胜于一般的烹煮。


除此之外,唐代人在食用“胡饼”时也忘不了搭配胡椒:


“时豪家食次,起羊肉一斤,层布于巨胡饼,隔中以椒豉,润以酥,入炉迫之,候肉熟食之,呼为‘古楼子’。”


在酒中加入胡椒也是深受唐代有钱人喜爱的驱寒方法。《太平广记》中便出现了官员在寒时赶路结束后“速暖两大盏酒来,着椒葱”的故事,将葱和胡椒加入酒中温热后饮下,祛寒除湿,颇有些今日些许地方过年时仍将葱姜放入可乐中一同加热饮用的意趣。


用胡椒等香辛料来煮羹粥的方法,也渗入到唐人的饮食习惯。如昝殷的《食医心鉴》在讲述食用猪心羹时,特别强调:“入少胡椒末亦佳。”


国历君自制表情包。底图来源/影视剧《妖猫传》


寻常富豪将胡椒烹煮后的残渣也被收集起来晒干,碾碎后出售给平民百姓。胡椒就这样成为唐代区隔阶层差异的奢侈门槛,是名副其实的奢侈品。


宰相为什么要囤胡椒


胡椒高昂的价格,和耐保存、不易变质的特性,促使它在官场渐渐衍生出了类似黄金的货币等价物属性。在唐代官场贿赂的潜规则中,胡椒就扮演了至关重要的角色。为此,唐代宗曾下令限制胡椒消费,但官员们和阿拉伯人相互勾结,阳奉阴违,直到元载的贪腐大案被揭露,胡椒再一次被推上风口浪尖。


关于元载本人痴迷于胡椒的原因众说纷纭。一种说法认为元载是陕西岐山人,自幼喜好当地的特色面食“臊子面”,他在少时吃臊子面时最大的理想便是能够多加上几粒胡椒用来调味,因此在他官居宰相之位后就开始疯狂地囤积胡椒,以弥补自己曾经的缺憾。


国历君自制元载表情包。底图来源/影视剧《九流霸主》


另一种更有说服力的猜想则是和元载本人崇尚道教,寻求养生秘术的愿望有关。《新唐书·元载传》记载,查抄元载家中时,和800石胡椒一同查获的还有500两钟乳,而服食钟乳正是道家追求延年益寿、长生不老的重要途径之一。《千金翼方》记载,长期服用钟乳可以“延年益寿,好颜色不老,令人有子”。唐代人认为,在服食钟乳时,必须将诸如生姜或茱萸等热药加入清酒中,温后饮用,使遍体发热,血脉通行。如果血脉运行不畅,就会生疮或发热。胡椒在其产地之一的印度即被视为绝佳的“热药”,与“乾姜、筚拔”合称为“三辛药”,故而在传入中国后成为与钟乳搭配服食的理想辅助药物。唐代医学中也已经出现了以胡椒为主料制作的“理中丸”和“胡椒丸”,用以温中和胃。


不过无论元载痴迷胡椒的原因究竟是什么,胡椒自此与他的贪腐绑定,成为后世文人讥讽的意象,也算是无妄之灾了。苏轼曾写诗嘲讽“胡椒铢两多,安用八百斛?”于谦更是直言斥骂“胡椒八百斛,千载遗腥臊”。


唐,玉花柄杯。来源/故宫博物院


胡椒的金贵从唐朝一直延续到了明朝,永乐年间,朱棣还曾用宫中贮藏的胡椒充抵银两来给官员们发工资。据《明成祖实录》记载:

 

“春夏折钞,秋冬则苏木、胡椒,五品以上折支十之七,以下则十之六。”


“胡椒每斤准钞一百贯,苏木每斤准钞五十贯,南北二京官各于南北京库支给。”

 

直到明中叶后,葡萄牙人占据澳门,取代了阿拉伯人在胡椒贸易中的垄断地位,大量贩运胡椒到中国,而中国内地也一点点摸索出了栽培胡椒的方法,这才打破了受制于人的局面,逐渐实现了胡椒自由。

 

胡椒作为香料在唐代受到如此追捧,究其根本乃是地理条件限制造成的商品流通不畅,加之阿拉伯人趁机从中操纵,垄断经营,将一粒小小的胡椒炒出天价。当然穷奢极欲的皇室贵族也难辞其咎,正如长安的荔枝一般,上有所好,下必甚焉!



参考资料:

段成式撰,方南生点校:《酉阳杂俎》,中华书局,1981年版。

温翠芳:《唐代的外来香药研究》,陕西师范大学博士学位论文,2006年。

张玉梅:《简论胡椒与唐代的饮食文化》,《考试周刊》2011年第38期。

汪汉利:《从<苏莱曼东游记>看唐朝与阿拉伯的海上丝路》,《回族研究》2016年第3期。


本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。


\"图片\"
END
作者 | 浅神
编辑 | 胡心雅 
 主编 | 周斌
排版 | 徐沁(实习)
校对 | 李栋 彦文
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓



\"图片\"

\"图片\"



“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "content": "



本 文 约 3300 字
阅 读 需 要 11 分钟


公元777年,唐代宗以“夜设巫蛊”的罪名逮捕宰相元载,命人查抄他的宅邸,其中查获钟乳500两,胡椒800石,此举引得代宗震怒,立刻下诏将元载赐死。


唐代宗李俶的影视形象。来源/影视剧《大唐荣耀》


胡椒在当时是贵重之物,八百石的胡椒价值不菲。元载因此被后世讥笑为“胡椒宰相”,宋人作诗讽刺他“相国藏椒八百斛”。可以想见,单单是数额庞大的胡椒藏量,就足以引起皇帝的震怒了。


不过,胡椒在唐代为何如此昂贵?一朝宰相又为何囤积这么多胡椒呢?


胡椒背后的阿拉伯人与海外贸易


胡椒名称中的“胡”字即代表它乃是由西域传入的胡人香料,并非原产自中国。唐代的胡椒几乎全部由阿拉伯商人经丝绸之路转运至中国内地。中文史料中关于胡椒的记载早期见于西晋司马彪撰写的《续汉书》,其中记载“天竺国出石蜜、胡椒、黑盐”。此后围绕着胡椒的产地,史料中陆续出现了印度、波斯、西域和南海诸国等说法。玄奘在《大唐西域记》中也记载印度南部的阿吒厘国“出胡椒树,树叶若蜀椒也”。


胡椒自传入中国后,因其稀缺性,价格一直居高不下。公元751年,唐王朝在怛罗斯之战中败给了大食国,加之随后的安史之乱,一系列变故使大唐在西域的影响力降低,陆上丝绸之路受到冲击,由阿拉伯人经营的海上丝绸之路开始慢慢成为贸易的主要途径,胡椒也在这一时期成为阿拉伯人赚取利润的重要商品。



阿拉伯人逐渐掌握了海上丝绸之路后,将胡椒作为明星商品进行包装,并采取了一系列手段操控价格。阿拉伯人首先为胡椒打造了一系列神话,他们曾向罗马人宣称胡椒只生长在由神龙看管的瀑布之下,威尼斯商人也借此将胡椒命名为“天堂的种子”。面对唐人,阿拉伯人又谎称在印度的胡椒林毒蛇盘踞,需要放火烧林将毒蛇驱逐后才能采摘,因而胡椒呈现出黑色且气味辛辣。种种天方夜谭般的故事为胡椒披上了一层神秘的外衣,迫使唐人不得不接受胡椒高昂的价格,并将之作为尊贵的象征。



在海运胡椒的过程中,阿拉伯人在沿途设立征税点,对过往补给的商船征收高额关税,尤其针对中国船只。据阿拉伯商人苏莱曼撰写的《中国印度见闻录》中记载,在斯里兰卡的一处征税点,阿拉伯人对过往的中国商船征收50迪纳尔的关税,而其余船只则仅需10-20迪纳尔。此举大大增加了中国商船的运输成本,也迫使胡椒商越来越依赖阿拉伯船队进行运输。此外,阿拉伯人还散布“唐船抗风浪弱”的谣言,进一步压缩中国商人在胡椒贸易中的份额,从而实现自身的垄断。


当胡椒乘风破浪进入中国后,阿拉伯人又不断为胡椒增添附加值,宣扬其豪奢与稀缺性,甚至催生了胡椒直接兑换丝绸、瓷器的现象。据传,1石胡椒可直接兑换10匹杭州产的丝绸。


此外,唐代广州市舶司规定外商货物需存入官仓6个月,对于政府需要的商品,政府以最高市价收购,阿拉伯商人趁机抬高价格,仅此一项即可获利超200%。更有甚者,阿拉伯人还通过贿赂市舶司官员建立走私渠道,逃避关税。史载,中唐时期广州港30%的胡椒交易未纳税,利润全归阿拉伯商团。阿拉伯人依靠胡椒在广州换取中国货物,运至巴格达出售后利润翻倍,而后再用白银采购印度胡椒,形成“胡椒→中国商品→白银→胡椒”的闭环资本链,按现代模型估计年收益率超300%。


国历君自制资本链模拟图。


唐代的胡椒有多流行


虽然胡椒的价格一直居高不下,但不妨碍其在皇室、贵族与上层社会中广受喜爱。


唐代饮食中对于胡椒的使用主要是调味、佐酒和作羹等。


唐,白釉绿彩盖盒。来源/故宫博物院


和今天类似,唐代胡椒首先搭配的就是牛羊肉。《齐民要术》中关于“胡炮肉法”的记述中便提到,羊肉在切好后要:


“著浑豉、盐、繴葱白、姜、椒、毕拨、胡椒,令调适。”


这样经过胡椒腌制后的羊肉再放入炉中烧烤,滋味远胜于一般的烹煮。


除此之外,唐代人在食用“胡饼”时也忘不了搭配胡椒:


“时豪家食次,起羊肉一斤,层布于巨胡饼,隔中以椒豉,润以酥,入炉迫之,候肉熟食之,呼为‘古楼子’。”


在酒中加入胡椒也是深受唐代有钱人喜爱的驱寒方法。《太平广记》中便出现了官员在寒时赶路结束后“速暖两大盏酒来,着椒葱”的故事,将葱和胡椒加入酒中温热后饮下,祛寒除湿,颇有些今日些许地方过年时仍将葱姜放入可乐中一同加热饮用的意趣。


用胡椒等香辛料来煮羹粥的方法,也渗入到唐人的饮食习惯。如昝殷的《食医心鉴》在讲述食用猪心羹时,特别强调:“入少胡椒末亦佳。”


国历君自制表情包。底图来源/影视剧《妖猫传》


寻常富豪将胡椒烹煮后的残渣也被收集起来晒干,碾碎后出售给平民百姓。胡椒就这样成为唐代区隔阶层差异的奢侈门槛,是名副其实的奢侈品。


宰相为什么要囤胡椒


胡椒高昂的价格,和耐保存、不易变质的特性,促使它在官场渐渐衍生出了类似黄金的货币等价物属性。在唐代官场贿赂的潜规则中,胡椒就扮演了至关重要的角色。为此,唐代宗曾下令限制胡椒消费,但官员们和阿拉伯人相互勾结,阳奉阴违,直到元载的贪腐大案被揭露,胡椒再一次被推上风口浪尖。


关于元载本人痴迷于胡椒的原因众说纷纭。一种说法认为元载是陕西岐山人,自幼喜好当地的特色面食“臊子面”,他在少时吃臊子面时最大的理想便是能够多加上几粒胡椒用来调味,因此在他官居宰相之位后就开始疯狂地囤积胡椒,以弥补自己曾经的缺憾。


国历君自制元载表情包。底图来源/影视剧《九流霸主》


另一种更有说服力的猜想则是和元载本人崇尚道教,寻求养生秘术的愿望有关。《新唐书·元载传》记载,查抄元载家中时,和800石胡椒一同查获的还有500两钟乳,而服食钟乳正是道家追求延年益寿、长生不老的重要途径之一。《千金翼方》记载,长期服用钟乳可以“延年益寿,好颜色不老,令人有子”。唐代人认为,在服食钟乳时,必须将诸如生姜或茱萸等热药加入清酒中,温后饮用,使遍体发热,血脉通行。如果血脉运行不畅,就会生疮或发热。胡椒在其产地之一的印度即被视为绝佳的“热药”,与“乾姜、筚拔”合称为“三辛药”,故而在传入中国后成为与钟乳搭配服食的理想辅助药物。唐代医学中也已经出现了以胡椒为主料制作的“理中丸”和“胡椒丸”,用以温中和胃。


不过无论元载痴迷胡椒的原因究竟是什么,胡椒自此与他的贪腐绑定,成为后世文人讥讽的意象,也算是无妄之灾了。苏轼曾写诗嘲讽“胡椒铢两多,安用八百斛?”于谦更是直言斥骂“胡椒八百斛,千载遗腥臊”。


唐,玉花柄杯。来源/故宫博物院


胡椒的金贵从唐朝一直延续到了明朝,永乐年间,朱棣还曾用宫中贮藏的胡椒充抵银两来给官员们发工资。据《明成祖实录》记载:

 

“春夏折钞,秋冬则苏木、胡椒,五品以上折支十之七,以下则十之六。”


“胡椒每斤准钞一百贯,苏木每斤准钞五十贯,南北二京官各于南北京库支给。”

 

直到明中叶后,葡萄牙人占据澳门,取代了阿拉伯人在胡椒贸易中的垄断地位,大量贩运胡椒到中国,而中国内地也一点点摸索出了栽培胡椒的方法,这才打破了受制于人的局面,逐渐实现了胡椒自由。

 

胡椒作为香料在唐代受到如此追捧,究其根本乃是地理条件限制造成的商品流通不畅,加之阿拉伯人趁机从中操纵,垄断经营,将一粒小小的胡椒炒出天价。当然穷奢极欲的皇室贵族也难辞其咎,正如长安的荔枝一般,上有所好,下必甚焉!



参考资料:

段成式撰,方南生点校:《酉阳杂俎》,中华书局,1981年版。

温翠芳:《唐代的外来香药研究》,陕西师范大学博士学位论文,2006年。

张玉梅:《简论胡椒与唐代的饮食文化》,《考试周刊》2011年第38期。

汪汉利:《从<苏莱曼东游记>看唐朝与阿拉伯的海上丝路》,《回族研究》2016年第3期。


本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。


\"图片\"
END
作者 | 浅神
编辑 | 胡心雅 
 主编 | 周斌
排版 | 徐沁(实习)
校对 | 李栋 彦文
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓



\"图片\"

\"图片\"



“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "category": "", - "link": "http://weixin.sogou.com/weixin?type=2&query=%E5%9B%BD%E5%AE%B6%E4%BA%BA%E6%96%87%E5%8E%86%E5%8F%B2+%E4%B8%80%E4%B8%AA%E5%AE%B0%E7%9B%B8%E5%9B%A0%E4%B8%BA%E5%9B%A4%E8%83%A1%E6%A4%92%E8%A2%AB%E5%A4%84%E6%AD%BB%E2%80%A6%E2%80%A6%E5%88%B0%E5%BA%95%E6%80%8E%E4%B9%88%E4%B8%AA%E4%BA%8B%E5%84%BF%EF%BC%9F", - "creator": "", - "pubDate": "Wed, 16 Jul 2025 13:29:00 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "人文", - "feed": "国家人文历史", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "5065d20560e67caad42abda2bbbdb776", - "highlights": [] - }, - { - "title": "为什么吃精饲料的战马没有吃草的野马身体好?", - "description": "


本 文 约 3600 字

阅 读 需 要 12 分 钟 

 

在冷兵器时代,战马是决定战争胜负的重要因素,正所谓“有百万之兵,无马以壮军势,而用其胜力于追奔逐北之际,与无兵同”。古代著名的武将里,项羽有乌骓马,吕布有赤兔马,都是日行千里的名马,可见古人对于宝马的推崇。历代王朝也都十分重视马政,竭力培育出优质的战马。



然而,这些“养尊处优”的战马,与游牧民族散养在草原上的同类对抗时,却并未表现出多少优越之处。例如《史记》中的汉匈之战:汉军精心饲养的战马,在出击匈奴时经常损失惨重,即使在取得漠北之战这样的空前大胜时也不例外,“塞阅官及私马凡十四万匹,而复入塞者不满三万匹”,可见汉军战马的折损率之高。


这不禁让我们疑惑:人类专为战斗而驯养出来的战马,是否反而还不如散养的野马?



圈养:从越野车到超跑

 

中国是世界上最古老的产马地之一。早在约五六千年前,中国北方的黄河流域地区就已经出现了驯养的马匹,位居牛羊猪犬鸡等“六畜”之首。随着历史的发展,马匹作为拉动战车的工具,或骑兵的坐骑,被驯化为重要的战争资源——战马。它们与仍旧驰骋在草原上的同类相比,身体条件上也发生了变化。



根据现代运动生理学研究,动物的肌肉纤维类型会根据生存需求发生适应性变化。野马为了在草原上躲避天敌、寻找食物,每天需要奔跑数十公里,这种持续的高强度运动使得它们的肌肉中慢肌纤维比例高达60%以上。慢肌纤维富含线粒体和肌红蛋白,能通过有氧代谢持续供能,让野马在长途奔袭中保持耐力,就像一台装备了“长效发动机”的越野车。




与散养的野马不同,战马平日以圈养为主,中原王朝为了爱惜马力,增强战马在作战时的爆发力,在平时的军事训练中也不会过多驭驶战马,导致战马的运动量远小于野马。这种饲养方式虽然能使战马维持一个较为强壮的体魄,却也在无意中改变了其肌肉结构,导致快肌纤维比例显著上升。快肌纤维能通过无氧代谢快速爆发力量,适合短距离冲刺,但持续时间短,就像一台装备了“涡轮增压发动机”的超跑,爆发力强却耐力不足。



对于二者的优劣之处,中原王朝有着清醒的认识。例如,西汉大臣晁错在分析汉军与匈奴各自的优缺点时认为,匈奴马匹“上下山阪,出入溪涧,中国之马弗与也”,即在复杂地形作战时,汉朝战马便不如匈奴马匹,反映出二者越野能力的差距。为解决这一问题,汉武帝先后出兵讨伐乌孙、大宛,将更加优质的“汗血宝马”引入中原,与汉马相交配,繁育后代,提升了汉军战马的品质。



相比之下,唐高祖李渊的思路有所不同。为对抗“以弓矢为爪牙,以甲胄为常服”且“逐水草为居室,以羊马为军粮”的突厥人,李渊“乃简使能骑射者二千余人,饮食居止,一同突厥。随逐水草,远置斥堠”,完全模仿突厥人的游牧生活习惯,将战马的驯养方式野马化,最终用敌人的方式打败了敌人。


骨骼的健康状况是衡量马匹身体素质的另一项重要指标。古生物学家对考古遗迹中出土的野马化石和古代战马的骨骼进行对比后发现,两者的骨骼密度存在显著差异:野马的骨骼密度比战马更厚,排列也更为紧密有序。这种差异源于“沃尔夫定律”:骨骼会根据受力情况重塑结构。野马在野外奔跑时,四肢需要承受地面的反作用力和身体的重量,这种持续的机械刺激会促使骨骼不断沉积钙盐,增强强度。而战马由于长期被拴养,活动范围受限,骨骼受到的压力刺激不足,导致骨密度下降。



骨骼密度对马蹄骨的健康影响极大。在高强度运动中,骨骼密度低的马匹蹄骨更容易断裂。战马与野马间最著名的“骨骼较量”要属公元1241年的里格尼茨战役。是役,蒙古骑兵在东欧平原的泥泞地形中奔驰自如,大败波兰、德意志联军,斩杀了波兰大公亨利二世。两军交战时,波兰骑兵的战马因长期在城堡马厩中饲养,四肢骨骼纤细,在泥泞中屡屡“折蹄”;而蒙古战马日常在草原上游牧,其掌骨直径普遍更粗,骨骼的密度更是高于欧洲战马。这种身体结构让它们能像“天然越野车”一样适应复杂地形。因此,蒙古骑兵在客场作战反而如鱼得水,占据了主动,最终大获全胜。



由此可见,野马与战马的区别,恰如现代社会中的越野车和超跑。作为圈养的产物,战马强化了短期爆发力,能在瞬息万变的军事形势中最大程度上发挥自己的作用,把握获胜的战机。然而,一旦陷入长期消耗的僵局,或者复杂恶劣的环境,战马相比于野马耐力不足的劣势也就显露无遗了。这或许解释了汉匈战争中汉军为何总是损失大量战马。


战马也有富贵病?

 

除了骨骼肌肉等身体“硬件”外,战马的“软件”相比野马也有所不同,它们在优越的生活条件下得了一身“富贵病”。

为了使战马保持健硕的体型,驯养时所提供的饮食普遍既丰富又精细。一方面,有粟、豆为主的精饲料;另一方面,则是以禾稾和苜蓿等作为粗饲料,搭配起来可谓营养均衡。宋代名将岳飞曾有两匹宝马,“日啖刍豆数斗,饮泉一斛,然非精洁则不受”,甚至只以豆类和泉水为食,可见其娇贵。



然而,“精饲料喂养法”虽然能让战马膘肥体壮,却破坏了它们体内消化系统的平衡。长期食用精饲料的战马,胃部因为缺乏粗纤维刺激,蠕动功能下降,肠道内的益生菌数量也随之减少,这使得它们更容易患上消化不良和肠梗塞,古代称之为“大肠草结”。对此,明代兽医学经典《元亨疗马集》给出了治疗过程:首先以大黄、酥油、巴豆等药通肠,再以麻子仁、郁李仁、续随子润肠,随即用生猪脂、麻油、滑石等滑肠,最后以枳壳宽肠。而这种病症在野马中极为罕见,因为它们通过持续进食和运动,让消化系统始终处于“动态平衡”状态。



除饮食外,过度舒适的生活环境也削弱了战马的免疫系统,使它们更容易患病。早在战国时期,各国在如何为战马提供优越的生活环境这一问题上就已经颇具经验,名将吴起曾对魏武侯道:


“夫马必安其处所,适其水草,节其饥饱。冬则温厩,夏则凉庑。”


此后历代无不对战马呵护备至。然而,动物的免疫系统往往需要适度的外界刺激才能保持活力。野马在野外经常接触各种病原体、寄生虫和极端气候,这种持续的“免疫挑战”让它们的免疫系统时刻保持警惕,对病毒、寄生虫的抵抗力也大大增强。给战马过度保护,恰好使它们丧失了许多提升免疫能力的机会,反而比“摸爬滚打”成长起来的野马更容易感染疾病。



在南宋与蒙古的襄阳之战中,蒙古军队的战马多为草原上放养的蒙古马,来到湿润泥泞的环境中依然能自如活动;而南宋的战马长期圈养在干燥的马厩中,一旦进入潮湿环境,就大规模暴发蹄叶炎,严重削弱了宋军的战斗力。



此外,战马的心理素质与野马也有差距。野生动物在野外活动,时刻面临生存压力,这种持续的应激状态反而塑造了它们强大的心理适应能力,能让它们在危机中保持冷静,做出更理性的判断。而战马在人类的驯养下,平日过着优越安逸的生活,警惕性、判断力和抗压能力已经大为下降,这在战场上可能意味着致命的危险。如公元383年的淝水之战,前秦大军号称有步兵六十余万,骑兵二十七万。两军交战之时,前秦皇帝苻坚与皇弟苻融商议,想趁东晋军队渡河时,以铁骑半渡而击,于是下令大军后退。东晋降将朱序等人趁机散播战败谣言,导致后方军队误以为前线败退,军心涣散,阵型大乱。苻融企图恢复秩序,不料胯下战马在乱军中受惊,将他摔落马下,当场身亡。失去主将的前秦大军彻底崩溃,偌大的前秦也在不久后灭亡。由此可见,战马心理韧性的差异,往往在关键时刻决定成败。



过度的保护和精细化的养育,往往会削弱生物的自然本能。从战马与野马的对比中,我们能看到一幅生动的“进化博弈图”:野马在严酷的自然选择中,发展出了适应野外生存的完美身体机能;而战马在人类的驯化下,为了满足爆发力、美观等特定需求,牺牲了整体的生存能力,最终无法摆脱“驯化陷阱”的束缚。这或许正是大自然给我们的启示——真正的强大不仅在于身上骨骼的粗壮和肌肉的维度,更在于适应环境的韧性、应对挑战的智慧和持续进化的潜力。而这些从来不是温室所能培育的,只能在风雨中磨砺而成。



参考文献:

(汉)司马迁:《史记》,中华书局1982年版

(汉)班固:《汉书》,中华书局2012年版

(唐)温大雅:《大唐创业起居注》,上海古籍出版社1983年版

(元)脱脱等:《宋史》,中华书局1985年版

(明)喻本元、喻本亨著,于船等校注:《元亨疗马集校注》,北京农业大学出版社1990年版

(瑞典)多桑著,冯承钧译:《多桑蒙古史》,商务印书馆2013年版

谢成侠:《中国养马史》,中国农业出版社1991年版


*本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。



END
作者 | 韩靖宇‍‍‍‍‍‍‍
编辑 | 胡心雅‍
主编 | 周斌
排版 | 徐沁(实习)‍
校对 | 火炬 李栋 张斌 古月
\"图片\"

国历好物
\"图片\"

进击的士族

旁落的皇权

跨越五百年的权力对抗史

国民历史读物《国家人文历史》专业团队

最新力作

展现士族潮起潮落的史诗级历史画卷

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"
\"图片\"

“在看”的永远18岁~

\n \n \n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "content": "


本 文 约 3600 字

阅 读 需 要 12 分 钟 

 

在冷兵器时代,战马是决定战争胜负的重要因素,正所谓“有百万之兵,无马以壮军势,而用其胜力于追奔逐北之际,与无兵同”。古代著名的武将里,项羽有乌骓马,吕布有赤兔马,都是日行千里的名马,可见古人对于宝马的推崇。历代王朝也都十分重视马政,竭力培育出优质的战马。



然而,这些“养尊处优”的战马,与游牧民族散养在草原上的同类对抗时,却并未表现出多少优越之处。例如《史记》中的汉匈之战:汉军精心饲养的战马,在出击匈奴时经常损失惨重,即使在取得漠北之战这样的空前大胜时也不例外,“塞阅官及私马凡十四万匹,而复入塞者不满三万匹”,可见汉军战马的折损率之高。


这不禁让我们疑惑:人类专为战斗而驯养出来的战马,是否反而还不如散养的野马?



圈养:从越野车到超跑

 

中国是世界上最古老的产马地之一。早在约五六千年前,中国北方的黄河流域地区就已经出现了驯养的马匹,位居牛羊猪犬鸡等“六畜”之首。随着历史的发展,马匹作为拉动战车的工具,或骑兵的坐骑,被驯化为重要的战争资源——战马。它们与仍旧驰骋在草原上的同类相比,身体条件上也发生了变化。



根据现代运动生理学研究,动物的肌肉纤维类型会根据生存需求发生适应性变化。野马为了在草原上躲避天敌、寻找食物,每天需要奔跑数十公里,这种持续的高强度运动使得它们的肌肉中慢肌纤维比例高达60%以上。慢肌纤维富含线粒体和肌红蛋白,能通过有氧代谢持续供能,让野马在长途奔袭中保持耐力,就像一台装备了“长效发动机”的越野车。




与散养的野马不同,战马平日以圈养为主,中原王朝为了爱惜马力,增强战马在作战时的爆发力,在平时的军事训练中也不会过多驭驶战马,导致战马的运动量远小于野马。这种饲养方式虽然能使战马维持一个较为强壮的体魄,却也在无意中改变了其肌肉结构,导致快肌纤维比例显著上升。快肌纤维能通过无氧代谢快速爆发力量,适合短距离冲刺,但持续时间短,就像一台装备了“涡轮增压发动机”的超跑,爆发力强却耐力不足。



对于二者的优劣之处,中原王朝有着清醒的认识。例如,西汉大臣晁错在分析汉军与匈奴各自的优缺点时认为,匈奴马匹“上下山阪,出入溪涧,中国之马弗与也”,即在复杂地形作战时,汉朝战马便不如匈奴马匹,反映出二者越野能力的差距。为解决这一问题,汉武帝先后出兵讨伐乌孙、大宛,将更加优质的“汗血宝马”引入中原,与汉马相交配,繁育后代,提升了汉军战马的品质。



相比之下,唐高祖李渊的思路有所不同。为对抗“以弓矢为爪牙,以甲胄为常服”且“逐水草为居室,以羊马为军粮”的突厥人,李渊“乃简使能骑射者二千余人,饮食居止,一同突厥。随逐水草,远置斥堠”,完全模仿突厥人的游牧生活习惯,将战马的驯养方式野马化,最终用敌人的方式打败了敌人。


骨骼的健康状况是衡量马匹身体素质的另一项重要指标。古生物学家对考古遗迹中出土的野马化石和古代战马的骨骼进行对比后发现,两者的骨骼密度存在显著差异:野马的骨骼密度比战马更厚,排列也更为紧密有序。这种差异源于“沃尔夫定律”:骨骼会根据受力情况重塑结构。野马在野外奔跑时,四肢需要承受地面的反作用力和身体的重量,这种持续的机械刺激会促使骨骼不断沉积钙盐,增强强度。而战马由于长期被拴养,活动范围受限,骨骼受到的压力刺激不足,导致骨密度下降。



骨骼密度对马蹄骨的健康影响极大。在高强度运动中,骨骼密度低的马匹蹄骨更容易断裂。战马与野马间最著名的“骨骼较量”要属公元1241年的里格尼茨战役。是役,蒙古骑兵在东欧平原的泥泞地形中奔驰自如,大败波兰、德意志联军,斩杀了波兰大公亨利二世。两军交战时,波兰骑兵的战马因长期在城堡马厩中饲养,四肢骨骼纤细,在泥泞中屡屡“折蹄”;而蒙古战马日常在草原上游牧,其掌骨直径普遍更粗,骨骼的密度更是高于欧洲战马。这种身体结构让它们能像“天然越野车”一样适应复杂地形。因此,蒙古骑兵在客场作战反而如鱼得水,占据了主动,最终大获全胜。



由此可见,野马与战马的区别,恰如现代社会中的越野车和超跑。作为圈养的产物,战马强化了短期爆发力,能在瞬息万变的军事形势中最大程度上发挥自己的作用,把握获胜的战机。然而,一旦陷入长期消耗的僵局,或者复杂恶劣的环境,战马相比于野马耐力不足的劣势也就显露无遗了。这或许解释了汉匈战争中汉军为何总是损失大量战马。


战马也有富贵病?

 

除了骨骼肌肉等身体“硬件”外,战马的“软件”相比野马也有所不同,它们在优越的生活条件下得了一身“富贵病”。

为了使战马保持健硕的体型,驯养时所提供的饮食普遍既丰富又精细。一方面,有粟、豆为主的精饲料;另一方面,则是以禾稾和苜蓿等作为粗饲料,搭配起来可谓营养均衡。宋代名将岳飞曾有两匹宝马,“日啖刍豆数斗,饮泉一斛,然非精洁则不受”,甚至只以豆类和泉水为食,可见其娇贵。



然而,“精饲料喂养法”虽然能让战马膘肥体壮,却破坏了它们体内消化系统的平衡。长期食用精饲料的战马,胃部因为缺乏粗纤维刺激,蠕动功能下降,肠道内的益生菌数量也随之减少,这使得它们更容易患上消化不良和肠梗塞,古代称之为“大肠草结”。对此,明代兽医学经典《元亨疗马集》给出了治疗过程:首先以大黄、酥油、巴豆等药通肠,再以麻子仁、郁李仁、续随子润肠,随即用生猪脂、麻油、滑石等滑肠,最后以枳壳宽肠。而这种病症在野马中极为罕见,因为它们通过持续进食和运动,让消化系统始终处于“动态平衡”状态。



除饮食外,过度舒适的生活环境也削弱了战马的免疫系统,使它们更容易患病。早在战国时期,各国在如何为战马提供优越的生活环境这一问题上就已经颇具经验,名将吴起曾对魏武侯道:


“夫马必安其处所,适其水草,节其饥饱。冬则温厩,夏则凉庑。”


此后历代无不对战马呵护备至。然而,动物的免疫系统往往需要适度的外界刺激才能保持活力。野马在野外经常接触各种病原体、寄生虫和极端气候,这种持续的“免疫挑战”让它们的免疫系统时刻保持警惕,对病毒、寄生虫的抵抗力也大大增强。给战马过度保护,恰好使它们丧失了许多提升免疫能力的机会,反而比“摸爬滚打”成长起来的野马更容易感染疾病。



在南宋与蒙古的襄阳之战中,蒙古军队的战马多为草原上放养的蒙古马,来到湿润泥泞的环境中依然能自如活动;而南宋的战马长期圈养在干燥的马厩中,一旦进入潮湿环境,就大规模暴发蹄叶炎,严重削弱了宋军的战斗力。



此外,战马的心理素质与野马也有差距。野生动物在野外活动,时刻面临生存压力,这种持续的应激状态反而塑造了它们强大的心理适应能力,能让它们在危机中保持冷静,做出更理性的判断。而战马在人类的驯养下,平日过着优越安逸的生活,警惕性、判断力和抗压能力已经大为下降,这在战场上可能意味着致命的危险。如公元383年的淝水之战,前秦大军号称有步兵六十余万,骑兵二十七万。两军交战之时,前秦皇帝苻坚与皇弟苻融商议,想趁东晋军队渡河时,以铁骑半渡而击,于是下令大军后退。东晋降将朱序等人趁机散播战败谣言,导致后方军队误以为前线败退,军心涣散,阵型大乱。苻融企图恢复秩序,不料胯下战马在乱军中受惊,将他摔落马下,当场身亡。失去主将的前秦大军彻底崩溃,偌大的前秦也在不久后灭亡。由此可见,战马心理韧性的差异,往往在关键时刻决定成败。



过度的保护和精细化的养育,往往会削弱生物的自然本能。从战马与野马的对比中,我们能看到一幅生动的“进化博弈图”:野马在严酷的自然选择中,发展出了适应野外生存的完美身体机能;而战马在人类的驯化下,为了满足爆发力、美观等特定需求,牺牲了整体的生存能力,最终无法摆脱“驯化陷阱”的束缚。这或许正是大自然给我们的启示——真正的强大不仅在于身上骨骼的粗壮和肌肉的维度,更在于适应环境的韧性、应对挑战的智慧和持续进化的潜力。而这些从来不是温室所能培育的,只能在风雨中磨砺而成。



参考文献:

(汉)司马迁:《史记》,中华书局1982年版

(汉)班固:《汉书》,中华书局2012年版

(唐)温大雅:《大唐创业起居注》,上海古籍出版社1983年版

(元)脱脱等:《宋史》,中华书局1985年版

(明)喻本元、喻本亨著,于船等校注:《元亨疗马集校注》,北京农业大学出版社1990年版

(瑞典)多桑著,冯承钧译:《多桑蒙古史》,商务印书馆2013年版

谢成侠:《中国养马史》,中国农业出版社1991年版


*本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。



END
作者 | 韩靖宇‍‍‍‍‍‍‍
编辑 | 胡心雅‍
主编 | 周斌
排版 | 徐沁(实习)‍
校对 | 火炬 李栋 张斌 古月
\"图片\"

国历好物
\"图片\"

进击的士族

旁落的皇权

跨越五百年的权力对抗史

国民历史读物《国家人文历史》专业团队

最新力作

展现士族潮起潮落的史诗级历史画卷

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"
\"图片\"

“在看”的永远18岁~

\n \n \n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", - "category": "", - "link": "http://weixin.sogou.com/weixin?type=2&query=%E5%9B%BD%E5%AE%B6%E4%BA%BA%E6%96%87%E5%8E%86%E5%8F%B2+%E4%B8%BA%E4%BB%80%E4%B9%88%E5%90%83%E7%B2%BE%E9%A5%B2%E6%96%99%E7%9A%84%E6%88%98%E9%A9%AC%E6%B2%A1%E6%9C%89%E5%90%83%E8%8D%89%E7%9A%84%E9%87%8E%E9%A9%AC%E8%BA%AB%E4%BD%93%E5%A5%BD%EF%BC%9F", - "creator": "", - "pubDate": "Tue, 15 Jul 2025 19:54:00 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "人文", - "feed": "国家人文历史", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "094746955bebdd1b77f50a11536c6015", - "highlights": [] - }, { "title": "在手机严重同质化的时代,Nothing 希望帮你找回科技的乐趣", "description": "前不久,Nothing 在北京召开了一场别开生面的新品发布会,推出了 Phone (3) 和 Headphone (1)。我派小分队不仅参加了这场发布会,还获得了访问 Nothing 全球品牌及营销总监 Ryan Latham 的宝贵机会。查看全文", @@ -888,6 +668,50 @@ "hash": "ec7a137c759511bd5b81876e90b5734a", "highlights": [] }, + { + "title": "一个敢P,一个敢信:慈禧宠臣竟被一张假照片扳倒?", + "description": "


本 文 约 5000 字

阅 读 需 要 16 分 钟 


20世纪初,晚清政权正摇摇欲坠。就在朝堂最后几年激烈的自救与政斗中,小小的相机却搅动了波谲云诡的政局,拨动了政治人物的命运。这便是大名鼎鼎的岑春煊“假照片”事件。


岑春煊的前半生


岑春煊,字云阶,清末民初人。他出身显赫,家父岑毓英系云贵总督,因此,受其荫蔽的岑春煊年仅十八岁就被送往京城,派为工部学习行走。由于在家中排行第三,岑春煊被唤作“岑三公子”,与瑞澄、劳子乔并称“京城三少”。1892年,守完父孝的他补受光禄寺少卿,迁太仆寺少卿、署大理寺正卿。



甲午战争是岑春煊个人命运的第一个转折点,由于他“发愤自请效力前敌”,因此得到了军机大臣李鸿藻的注意,将其调至钦差大臣刘坤一麾下任职,设防烟台。清廷的议和与《马关条约》的签订,对岑春煊造成了严重的心理刺激,他因而投身维新运动,与后来的戊戌党人交往。他还和康有为筹议成立了广西最早的维新社团——桂林圣学会。1898年,岑春煊面陈光绪帝国事艰难、朝廷臃肿之弊,光绪帝采取了其裁撤旧官之谏,并任命他作广东布政使。广东任上,岑春煊大力裁撤闲散衙门,并因此与督抚谭钟麟产生龃龉,相互攻讦,其刚烈之举震动朝廷。“(慈禧)太后恶之,荣禄为缓颊,乃调甘肃”。然而,一场新的变故,即将带他攀上新的事业高峰。



1900年,八国联军侵华,慈禧携带光绪出逃,而甘肃布政使岑春煊则在接到驰援上谕后,星夜领兵疾奔北京,千里护驾:


“一夕宿破庙,春煊环刀立庙外彻夜,太后梦中忽惊呼,春煊则朗声应曰:‘臣春煊在此保驾’。”


经此事件后,慈禧大为感动,甚至只有在看到岑春煊才稍感心安,并对他表示:

 

“我母子西巡时,若不得汝照料,恐将饿死,焉有今日?我久已将汝当亲人看待。…… 若得复国,必无敢忘德也。”

 

还有一次,她还向朝臣询问说,“此耻如何可雪?”台下只有岑春煊应对如流,深得慈禧认可。由此,岑春煊得到了慈禧太后的欢心与信任,也预定了未来重臣的位置。清末有言说“京外总督三个半”,这“三”就是张之洞、袁世凯和岑春煊,“半”即端方,他们都堪称地方巨擘。



1902年,清廷颁布“新政”上谕,开启清末新政,岑春煊积极参与其中,上书建议“迅速特简亲贵大臣,以考求新政为名,历聘欧美有约诸邦”,并“择最大新政切实举行数事,痛除旧习,以动天下之观听”。而在他1901到1906年先后就职山西巡抚、署理四川总督、两广总督的任上,岑春煊也亲身实践,建设推广现代教育体系,培养实业与军事方面的人才。同时,他也继续坚持自己整肃官场的路线,甚至得名“官屠”:

 

“春煊每至一省,必大肆纠弹,上下股栗失色。”

 

1906年,清廷预备立宪,而各派系的矛盾也步入新阶段。陈寅恪曾分析时局说:


“京官以瞿鸿禨、张之洞等,外官以陶模、岑春煊等为清流;京官以庆亲王奕劻、袁世凯、徐世昌等,外官以周馥、杨士骧等为浊流。”

 

需要说明的是,清浊并不直接对应各派系的道德水平,而仅仅应被视作对党派的称谓。这些人相互倾轧,最终在1907年爆发了丁未政潮。



丁未政潮


丁未政潮,主要指的是上述清流与浊流空前激烈的党争,双方其实都支持维新立宪,但各有其利益所在。比如说,庆亲王奕劻伙同时任直隶总督袁世凯希望组建责任内阁,并由奕劻任总理、袁世凯任副总理,掌握中央大权;军机大臣瞿鸿禨,时任两广总督岑春煊以及皇室少壮派权贵铁良等人却上书斥其野心,主张保留军机处。最终,后者的方案得到执行,袁世凯还失去了原北洋六镇中的四镇兵权。作为报复,奕劻和袁世凯设法用边患的名义劝动慈禧,将岑春煊调任偏远荒凉的云贵总督,使其远离权力核心,而两广总督则由袁世凯的姻亲周馥接任。4月,东三省官制改革,原盛京将军著改为东三省总督,奉天、吉林、黑龙江各设一巡抚,分别由徐世昌,唐绍仪,朱家宝和段芝贵担任,他们都是北洋之人,胜利的天平再度翻转。



值此危难之际,岑春煊认为 “不于此际设法入都,造膝详陈种种危迫情形,机会一失,追悔无穷”。在瞿鸿禨、御史赵启霖等人的帮助下,岑春煊先是称病,然后假意受调补四川总督,在前往四川的路上,于汉口突然“迎折北上,坚请入对”。面对感念旧情的慈禧,他痛批“庆亲王贪庸误国,引用小人”。至于他自己,则“意欲留在都中为皇太后、皇上做一看家恶犬”。慈禧果然应允。



此后,新上任的邮传部尚书岑春煊与清流诸人不断向朱宝奎、段芝贵等庆袁党羽(即以庆亲王奕劻和袁世凯为代表的政治集团成员)开炮弹劾,令他们疲于招架。面对这一局面,奕劻和袁世凯先是催动两广总督周馥奏报事急,又收买大公主劝动慈禧叫岑春煊离开京城,去镇压广西革命党人,“君命犹天命,臣子宁敢自择地。春煊渥蒙宠遇,尤不当如此” ,岑因此不得不走,但仍称病暂居上海,并未赴任。


而奕劻、袁世凯二人,则仍有意将之赶尽杀绝。毕竟,岑春煊此时依然拥有慈禧的信任,也就有可能重新起复,挽回清流颓势。同时,和岑春煊并称“南岑北袁”的袁世凯还与其有些私人恩怨:昔日广东任职时,岑春煊就检举了时任广东海关监督库书的周馥,而袁世凯也曾为邀得慈禧恩宠,出卖了康、梁等岑春煊的戊戌友人。因此,虽时人认为“袁世凯、岑春煊俱有宠于太后”,但这两个宠臣之间,却实实在在是水火不容。


“春煊之宠,由庚子护驾。皆以患难奋翅而起,虽有外言,莫能间也。”



那么,如何彻底动摇慈禧对岑春煊的信任呢?袁世凯认为,恐怕还得从她最痛恨的康、梁二人入手。1904年,慈禧曾在“万寿”之年赦免了维新人士,但只有曾意图暴力夺权的康、梁和孙文被排除在外。因此,庆袁党羽之一给事中陈庆桂便试图弹劾岑春煊,指控他同样和康有为等人有关系,然而该奏折却为顾念旧情的慈禧留中未发:


“太后曾恶康党,以春煊新被宠,不应有是,待之如初。”



与之形成鲜明对比的,就是在岑被赶出京城不久,瞿鸿禨即因结党罪名而被免职。陈庆桂弹劾失败后,奕劻、袁世凯二人继续盯紧岑春煊的动向,终于等到了五月梁启超抵达上海与岑春煊会面的传闻。他们旋即通过电报,要求两江总督端方“设密确查”,后者确认了消息属实,并将所收集情报汇往京城。然而,慈禧虽“动于奕劻之危词,屏而远之,而犹有念旧之意”,此时,若是他们仍一味纠缠,恐怕会产生反效果。就在奕劻、袁世凯二人苦恼之际,一个外来的“小人物”,和他手中的相机,彻底改变了政局的走向。


晚清假照片事件


蔡乃煌,广东番禺人,1891年中举,此后虽辗转于洋务局、机器局、川汉铁路总公司等新式部门,却仕途不顺,久不得志。他曾想趁岑春煊病居上海之时,试图攀附这位四川总督,但被“峻拒之”。因此,他最终钻营进京,改投至袁世凯门下。而他的晋身之资,就是一张有关岑春煊的假照片。


相机在晚清的中国是个绝对的稀罕玩意,即便是达亲显贵,在第一次接触摄影时,甚至也会恐慌地以为照片能摄取他们的魂魄,避之不及,因此,知道照片还能被造假合成的人就更少了。



蔡乃煌对洋务工艺涉猎颇广,因此献计并承办了此事。他分别取得了岑春煊、康有为和梁启超的照片,到一广东同乡所经营的照相馆合放拍下,便形成了一张他们在上海时报馆前“共立相语”的假合照。随后,他亲自将之带去了天津,交到了袁世凯的手中。



在那个初初萌生“有图有真相”观念的年代,这可谓“板上钉钉”“不容辩驳”的“铁证”。而在假合照外,袁世凯等人还选择双管齐下,他们拉拢了原清流人士,翰林院侍读学士恽毓鼎于七月二日上书弹劾(前一天晚上,蔡乃煌和引介人顾亚蘧即来其家中“久谈”),大肆渲染岑与康有为、梁启超等人密谋勾结、居心叵测的情状,暗示其将“阴借外援”。需要说明的是,这批人不仅曾有协助光绪帝政变的“前科”,还在当时与日本关系紧密,而日本刚刚逼迫韩国皇帝李熙退位,慈禧曾被洋人干涉立储,最终导致庚子事变并狼狈出逃,这无疑触动了慈禧的敏感神经。就在她仍存有犹豫之际,假合照被“巧妙”呈上,慈禧彻底信服:


“相片无讹,默对至时许,叹曰:‘春煊亦通党负我,天下事真弗可逆料矣!虽然彼负我,我不负彼,可准其退休。’”



于是又次日,即七月四日,岑春煊即被以久病未痊的名义,彻底革职赋闲。至此,清流一败涂地,奕劻、袁世凯一方最终取得了丁未政潮的胜利。


在刘禺生的《世载堂杂忆》中,《假照片计陷岑春煊》还拥有另一个版本,那便是同盟会香港分会会长的广东新会人陈少白,为报复两广总督岑春煊借慈禧之眷顾,手段酷烈地查抄富商,就制作了岑与康、梁、麦联坐合影的假照片,出售于大街小巷,刊载于报纸媒体,还重金收买太监,传入宫内,由此慈禧震怒,罢免了岑春煊。而岑为洗脱罪名,便求助于慈禧宠信的太监李莲英。后者则将慈禧扮成观音,与自己扮作韦陀的单人照合成后送给慈禧,暗示这不过是奸人伪造的冤情,于是慈禧意遂释然。然而,在真实的历史中,这一时期双方的关系已经恶化。岑春煊进京后,有人建议他为了维护清誉,“宜绝阉人”,因此在李莲英向其示好馈食时,他便断然拒绝了,李莲英由是深恨之。时人和学者据此推断,正是李莲英参与到了袁世凯等人的运作当中,协助将假照片献给了慈禧。由此观之,岑的落败,或许也有其性格缺陷的原因。据说他曾在初入邮传部时叹曰:“过刚则折,微特不克报国家,且恐为佥壬所中。”竟不幸一语成谶。



丁未政潮极大地影响了清廷的政局和新政的结果。客观上,奕劻、袁世凯与瞿鸿禨、岑春煊两方阵营的争斗与内耗,导致了以载沣为首的满族权贵的崛起。继岑春煊被斗倒,袁世凯也在同年被朝廷以明升暗降的方式削去了最后的军权。因此,这场假照片事件的谋划人与受害者,都不是真正的赢家。反而是那个看似感性、优柔寡断的慈禧,在拉一派、打一派的“摇摆不定”中,压制了自太平天国起便逐年膨胀的汉人官僚势力,在后续的立宪过程中令满人“联翩而长部务,汉人之势大拙”。然而,这赤裸的“重满抑汉”倾向,与最终皇族内阁的出台,却也彻底将清廷立宪的改革工作钉在了耻辱柱上。而在深重的失望与愤怒中诞生的中华民国,也将把清王朝彻底倾覆。在此过程中,在丁未政潮中先后落败的岑春煊与袁世凯殊途同归,一个被任命镇压四川保路运动却支持了起义;另一个在奉诏率军讨贼后却威逼了清帝退位,纷纷成了所谓“爱新觉罗王朝的两大叛臣”。假使慈禧死后有灵,她便能知晓自己亦不是最终的赢家……


参考文献:

张华腾:《清末袁世凯与岑春煊关系述论》,《河南大学学报》(社会版)1996年.

尹传刚:《岑春煊与丁未政潮》,《沧桑》2010年.

谢晓博:《浅论丁未年慈禧对岑春煊的疏弃对清末新政的影响》,《贵阳学院学报》(社会科学版)2012年.

陶易:《清朝末年的“照相门”事件》,《文史天地》2012年.

易海涛:《略论清末民初岑春煊与袁世凯的恩怨纠纷》,《陇东学院学报》2013年.

金满楼:《岑春煊的肃贪与挨整》,《中国经济报告》2014年.

水浩淼:《丁未政潮和清末政局——以清、浊党争为视角》,《宜宾学院学报》2014年.

刘鹏超:《恽毓鼎与丁未政潮》,《中国国家博物馆馆刊》2016年.

张洋伟:《试述丁未政潮及对晚清政局影响》,《湘南学院学报》2017年.

于云豪:《岑春煊人物评述》,《文化学刊》2020年.

張建斌:《丁未袁世凱致端方密信箋釋》,《中华文史论丛》2021年.

张建斌:《端方与“丁未政潮”》,《近代史研究》2021年.

唐论:《计中计:丁未“假照片事件”探析》,《清史研究》2022年.


*本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。



END
作者 | 曾亦嘉‍‍‍‍‍‍‍
编辑 | 胡心雅‍
主编 | 周斌
排版 | 徐沁(实习)‍
校对 | 古月
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"
\"图片\"

“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", + "content": "


本 文 约 5000 字

阅 读 需 要 16 分 钟 


20世纪初,晚清政权正摇摇欲坠。就在朝堂最后几年激烈的自救与政斗中,小小的相机却搅动了波谲云诡的政局,拨动了政治人物的命运。这便是大名鼎鼎的岑春煊“假照片”事件。


岑春煊的前半生


岑春煊,字云阶,清末民初人。他出身显赫,家父岑毓英系云贵总督,因此,受其荫蔽的岑春煊年仅十八岁就被送往京城,派为工部学习行走。由于在家中排行第三,岑春煊被唤作“岑三公子”,与瑞澄、劳子乔并称“京城三少”。1892年,守完父孝的他补受光禄寺少卿,迁太仆寺少卿、署大理寺正卿。



甲午战争是岑春煊个人命运的第一个转折点,由于他“发愤自请效力前敌”,因此得到了军机大臣李鸿藻的注意,将其调至钦差大臣刘坤一麾下任职,设防烟台。清廷的议和与《马关条约》的签订,对岑春煊造成了严重的心理刺激,他因而投身维新运动,与后来的戊戌党人交往。他还和康有为筹议成立了广西最早的维新社团——桂林圣学会。1898年,岑春煊面陈光绪帝国事艰难、朝廷臃肿之弊,光绪帝采取了其裁撤旧官之谏,并任命他作广东布政使。广东任上,岑春煊大力裁撤闲散衙门,并因此与督抚谭钟麟产生龃龉,相互攻讦,其刚烈之举震动朝廷。“(慈禧)太后恶之,荣禄为缓颊,乃调甘肃”。然而,一场新的变故,即将带他攀上新的事业高峰。



1900年,八国联军侵华,慈禧携带光绪出逃,而甘肃布政使岑春煊则在接到驰援上谕后,星夜领兵疾奔北京,千里护驾:


“一夕宿破庙,春煊环刀立庙外彻夜,太后梦中忽惊呼,春煊则朗声应曰:‘臣春煊在此保驾’。”


经此事件后,慈禧大为感动,甚至只有在看到岑春煊才稍感心安,并对他表示:

 

“我母子西巡时,若不得汝照料,恐将饿死,焉有今日?我久已将汝当亲人看待。…… 若得复国,必无敢忘德也。”

 

还有一次,她还向朝臣询问说,“此耻如何可雪?”台下只有岑春煊应对如流,深得慈禧认可。由此,岑春煊得到了慈禧太后的欢心与信任,也预定了未来重臣的位置。清末有言说“京外总督三个半”,这“三”就是张之洞、袁世凯和岑春煊,“半”即端方,他们都堪称地方巨擘。



1902年,清廷颁布“新政”上谕,开启清末新政,岑春煊积极参与其中,上书建议“迅速特简亲贵大臣,以考求新政为名,历聘欧美有约诸邦”,并“择最大新政切实举行数事,痛除旧习,以动天下之观听”。而在他1901到1906年先后就职山西巡抚、署理四川总督、两广总督的任上,岑春煊也亲身实践,建设推广现代教育体系,培养实业与军事方面的人才。同时,他也继续坚持自己整肃官场的路线,甚至得名“官屠”:

 

“春煊每至一省,必大肆纠弹,上下股栗失色。”

 

1906年,清廷预备立宪,而各派系的矛盾也步入新阶段。陈寅恪曾分析时局说:


“京官以瞿鸿禨、张之洞等,外官以陶模、岑春煊等为清流;京官以庆亲王奕劻、袁世凯、徐世昌等,外官以周馥、杨士骧等为浊流。”

 

需要说明的是,清浊并不直接对应各派系的道德水平,而仅仅应被视作对党派的称谓。这些人相互倾轧,最终在1907年爆发了丁未政潮。



丁未政潮


丁未政潮,主要指的是上述清流与浊流空前激烈的党争,双方其实都支持维新立宪,但各有其利益所在。比如说,庆亲王奕劻伙同时任直隶总督袁世凯希望组建责任内阁,并由奕劻任总理、袁世凯任副总理,掌握中央大权;军机大臣瞿鸿禨,时任两广总督岑春煊以及皇室少壮派权贵铁良等人却上书斥其野心,主张保留军机处。最终,后者的方案得到执行,袁世凯还失去了原北洋六镇中的四镇兵权。作为报复,奕劻和袁世凯设法用边患的名义劝动慈禧,将岑春煊调任偏远荒凉的云贵总督,使其远离权力核心,而两广总督则由袁世凯的姻亲周馥接任。4月,东三省官制改革,原盛京将军著改为东三省总督,奉天、吉林、黑龙江各设一巡抚,分别由徐世昌,唐绍仪,朱家宝和段芝贵担任,他们都是北洋之人,胜利的天平再度翻转。



值此危难之际,岑春煊认为 “不于此际设法入都,造膝详陈种种危迫情形,机会一失,追悔无穷”。在瞿鸿禨、御史赵启霖等人的帮助下,岑春煊先是称病,然后假意受调补四川总督,在前往四川的路上,于汉口突然“迎折北上,坚请入对”。面对感念旧情的慈禧,他痛批“庆亲王贪庸误国,引用小人”。至于他自己,则“意欲留在都中为皇太后、皇上做一看家恶犬”。慈禧果然应允。



此后,新上任的邮传部尚书岑春煊与清流诸人不断向朱宝奎、段芝贵等庆袁党羽(即以庆亲王奕劻和袁世凯为代表的政治集团成员)开炮弹劾,令他们疲于招架。面对这一局面,奕劻和袁世凯先是催动两广总督周馥奏报事急,又收买大公主劝动慈禧叫岑春煊离开京城,去镇压广西革命党人,“君命犹天命,臣子宁敢自择地。春煊渥蒙宠遇,尤不当如此” ,岑因此不得不走,但仍称病暂居上海,并未赴任。


而奕劻、袁世凯二人,则仍有意将之赶尽杀绝。毕竟,岑春煊此时依然拥有慈禧的信任,也就有可能重新起复,挽回清流颓势。同时,和岑春煊并称“南岑北袁”的袁世凯还与其有些私人恩怨:昔日广东任职时,岑春煊就检举了时任广东海关监督库书的周馥,而袁世凯也曾为邀得慈禧恩宠,出卖了康、梁等岑春煊的戊戌友人。因此,虽时人认为“袁世凯、岑春煊俱有宠于太后”,但这两个宠臣之间,却实实在在是水火不容。


“春煊之宠,由庚子护驾。皆以患难奋翅而起,虽有外言,莫能间也。”



那么,如何彻底动摇慈禧对岑春煊的信任呢?袁世凯认为,恐怕还得从她最痛恨的康、梁二人入手。1904年,慈禧曾在“万寿”之年赦免了维新人士,但只有曾意图暴力夺权的康、梁和孙文被排除在外。因此,庆袁党羽之一给事中陈庆桂便试图弹劾岑春煊,指控他同样和康有为等人有关系,然而该奏折却为顾念旧情的慈禧留中未发:


“太后曾恶康党,以春煊新被宠,不应有是,待之如初。”



与之形成鲜明对比的,就是在岑被赶出京城不久,瞿鸿禨即因结党罪名而被免职。陈庆桂弹劾失败后,奕劻、袁世凯二人继续盯紧岑春煊的动向,终于等到了五月梁启超抵达上海与岑春煊会面的传闻。他们旋即通过电报,要求两江总督端方“设密确查”,后者确认了消息属实,并将所收集情报汇往京城。然而,慈禧虽“动于奕劻之危词,屏而远之,而犹有念旧之意”,此时,若是他们仍一味纠缠,恐怕会产生反效果。就在奕劻、袁世凯二人苦恼之际,一个外来的“小人物”,和他手中的相机,彻底改变了政局的走向。


晚清假照片事件


蔡乃煌,广东番禺人,1891年中举,此后虽辗转于洋务局、机器局、川汉铁路总公司等新式部门,却仕途不顺,久不得志。他曾想趁岑春煊病居上海之时,试图攀附这位四川总督,但被“峻拒之”。因此,他最终钻营进京,改投至袁世凯门下。而他的晋身之资,就是一张有关岑春煊的假照片。


相机在晚清的中国是个绝对的稀罕玩意,即便是达亲显贵,在第一次接触摄影时,甚至也会恐慌地以为照片能摄取他们的魂魄,避之不及,因此,知道照片还能被造假合成的人就更少了。



蔡乃煌对洋务工艺涉猎颇广,因此献计并承办了此事。他分别取得了岑春煊、康有为和梁启超的照片,到一广东同乡所经营的照相馆合放拍下,便形成了一张他们在上海时报馆前“共立相语”的假合照。随后,他亲自将之带去了天津,交到了袁世凯的手中。



在那个初初萌生“有图有真相”观念的年代,这可谓“板上钉钉”“不容辩驳”的“铁证”。而在假合照外,袁世凯等人还选择双管齐下,他们拉拢了原清流人士,翰林院侍读学士恽毓鼎于七月二日上书弹劾(前一天晚上,蔡乃煌和引介人顾亚蘧即来其家中“久谈”),大肆渲染岑与康有为、梁启超等人密谋勾结、居心叵测的情状,暗示其将“阴借外援”。需要说明的是,这批人不仅曾有协助光绪帝政变的“前科”,还在当时与日本关系紧密,而日本刚刚逼迫韩国皇帝李熙退位,慈禧曾被洋人干涉立储,最终导致庚子事变并狼狈出逃,这无疑触动了慈禧的敏感神经。就在她仍存有犹豫之际,假合照被“巧妙”呈上,慈禧彻底信服:


“相片无讹,默对至时许,叹曰:‘春煊亦通党负我,天下事真弗可逆料矣!虽然彼负我,我不负彼,可准其退休。’”



于是又次日,即七月四日,岑春煊即被以久病未痊的名义,彻底革职赋闲。至此,清流一败涂地,奕劻、袁世凯一方最终取得了丁未政潮的胜利。


在刘禺生的《世载堂杂忆》中,《假照片计陷岑春煊》还拥有另一个版本,那便是同盟会香港分会会长的广东新会人陈少白,为报复两广总督岑春煊借慈禧之眷顾,手段酷烈地查抄富商,就制作了岑与康、梁、麦联坐合影的假照片,出售于大街小巷,刊载于报纸媒体,还重金收买太监,传入宫内,由此慈禧震怒,罢免了岑春煊。而岑为洗脱罪名,便求助于慈禧宠信的太监李莲英。后者则将慈禧扮成观音,与自己扮作韦陀的单人照合成后送给慈禧,暗示这不过是奸人伪造的冤情,于是慈禧意遂释然。然而,在真实的历史中,这一时期双方的关系已经恶化。岑春煊进京后,有人建议他为了维护清誉,“宜绝阉人”,因此在李莲英向其示好馈食时,他便断然拒绝了,李莲英由是深恨之。时人和学者据此推断,正是李莲英参与到了袁世凯等人的运作当中,协助将假照片献给了慈禧。由此观之,岑的落败,或许也有其性格缺陷的原因。据说他曾在初入邮传部时叹曰:“过刚则折,微特不克报国家,且恐为佥壬所中。”竟不幸一语成谶。



丁未政潮极大地影响了清廷的政局和新政的结果。客观上,奕劻、袁世凯与瞿鸿禨、岑春煊两方阵营的争斗与内耗,导致了以载沣为首的满族权贵的崛起。继岑春煊被斗倒,袁世凯也在同年被朝廷以明升暗降的方式削去了最后的军权。因此,这场假照片事件的谋划人与受害者,都不是真正的赢家。反而是那个看似感性、优柔寡断的慈禧,在拉一派、打一派的“摇摆不定”中,压制了自太平天国起便逐年膨胀的汉人官僚势力,在后续的立宪过程中令满人“联翩而长部务,汉人之势大拙”。然而,这赤裸的“重满抑汉”倾向,与最终皇族内阁的出台,却也彻底将清廷立宪的改革工作钉在了耻辱柱上。而在深重的失望与愤怒中诞生的中华民国,也将把清王朝彻底倾覆。在此过程中,在丁未政潮中先后落败的岑春煊与袁世凯殊途同归,一个被任命镇压四川保路运动却支持了起义;另一个在奉诏率军讨贼后却威逼了清帝退位,纷纷成了所谓“爱新觉罗王朝的两大叛臣”。假使慈禧死后有灵,她便能知晓自己亦不是最终的赢家……


参考文献:

张华腾:《清末袁世凯与岑春煊关系述论》,《河南大学学报》(社会版)1996年.

尹传刚:《岑春煊与丁未政潮》,《沧桑》2010年.

谢晓博:《浅论丁未年慈禧对岑春煊的疏弃对清末新政的影响》,《贵阳学院学报》(社会科学版)2012年.

陶易:《清朝末年的“照相门”事件》,《文史天地》2012年.

易海涛:《略论清末民初岑春煊与袁世凯的恩怨纠纷》,《陇东学院学报》2013年.

金满楼:《岑春煊的肃贪与挨整》,《中国经济报告》2014年.

水浩淼:《丁未政潮和清末政局——以清、浊党争为视角》,《宜宾学院学报》2014年.

刘鹏超:《恽毓鼎与丁未政潮》,《中国国家博物馆馆刊》2016年.

张洋伟:《试述丁未政潮及对晚清政局影响》,《湘南学院学报》2017年.

于云豪:《岑春煊人物评述》,《文化学刊》2020年.

張建斌:《丁未袁世凱致端方密信箋釋》,《中华文史论丛》2021年.

张建斌:《端方与“丁未政潮”》,《近代史研究》2021年.

唐论:《计中计:丁未“假照片事件”探析》,《清史研究》2022年.


*本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。



END
作者 | 曾亦嘉‍‍‍‍‍‍‍
编辑 | 胡心雅‍
主编 | 周斌
排版 | 徐沁(实习)‍
校对 | 古月
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓


\"图片\"
\"图片\"

“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", + "category": "", + "link": "http://weixin.sogou.com/weixin?type=2&query=%E5%9B%BD%E5%AE%B6%E4%BA%BA%E6%96%87%E5%8E%86%E5%8F%B2+%E4%B8%80%E4%B8%AA%E6%95%A2P%EF%BC%8C%E4%B8%80%E4%B8%AA%E6%95%A2%E4%BF%A1%EF%BC%9A%E6%85%88%E7%A6%A7%E5%AE%A0%E8%87%A3%E7%AB%9F%E8%A2%AB%E4%B8%80%E5%BC%A0%E5%81%87%E7%85%A7%E7%89%87%E6%89%B3%E5%80%92%EF%BC%9F", + "creator": "", + "pubDate": "Thu, 17 Jul 2025 12:20:00 +0800", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "", + "folder": "人文", + "feed": "国家人文历史", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "f6d09e75646242d9853ca5201f0d3c3e", + "highlights": [] + }, + { + "title": "一个宰相因为囤胡椒被处死……到底怎么个事儿?", + "description": "



本 文 约 3300 字
阅 读 需 要 11 分钟


公元777年,唐代宗以“夜设巫蛊”的罪名逮捕宰相元载,命人查抄他的宅邸,其中查获钟乳500两,胡椒800石,此举引得代宗震怒,立刻下诏将元载赐死。


唐代宗李俶的影视形象。来源/影视剧《大唐荣耀》


胡椒在当时是贵重之物,八百石的胡椒价值不菲。元载因此被后世讥笑为“胡椒宰相”,宋人作诗讽刺他“相国藏椒八百斛”。可以想见,单单是数额庞大的胡椒藏量,就足以引起皇帝的震怒了。


不过,胡椒在唐代为何如此昂贵?一朝宰相又为何囤积这么多胡椒呢?


胡椒背后的阿拉伯人与海外贸易


胡椒名称中的“胡”字即代表它乃是由西域传入的胡人香料,并非原产自中国。唐代的胡椒几乎全部由阿拉伯商人经丝绸之路转运至中国内地。中文史料中关于胡椒的记载早期见于西晋司马彪撰写的《续汉书》,其中记载“天竺国出石蜜、胡椒、黑盐”。此后围绕着胡椒的产地,史料中陆续出现了印度、波斯、西域和南海诸国等说法。玄奘在《大唐西域记》中也记载印度南部的阿吒厘国“出胡椒树,树叶若蜀椒也”。


胡椒自传入中国后,因其稀缺性,价格一直居高不下。公元751年,唐王朝在怛罗斯之战中败给了大食国,加之随后的安史之乱,一系列变故使大唐在西域的影响力降低,陆上丝绸之路受到冲击,由阿拉伯人经营的海上丝绸之路开始慢慢成为贸易的主要途径,胡椒也在这一时期成为阿拉伯人赚取利润的重要商品。



阿拉伯人逐渐掌握了海上丝绸之路后,将胡椒作为明星商品进行包装,并采取了一系列手段操控价格。阿拉伯人首先为胡椒打造了一系列神话,他们曾向罗马人宣称胡椒只生长在由神龙看管的瀑布之下,威尼斯商人也借此将胡椒命名为“天堂的种子”。面对唐人,阿拉伯人又谎称在印度的胡椒林毒蛇盘踞,需要放火烧林将毒蛇驱逐后才能采摘,因而胡椒呈现出黑色且气味辛辣。种种天方夜谭般的故事为胡椒披上了一层神秘的外衣,迫使唐人不得不接受胡椒高昂的价格,并将之作为尊贵的象征。



在海运胡椒的过程中,阿拉伯人在沿途设立征税点,对过往补给的商船征收高额关税,尤其针对中国船只。据阿拉伯商人苏莱曼撰写的《中国印度见闻录》中记载,在斯里兰卡的一处征税点,阿拉伯人对过往的中国商船征收50迪纳尔的关税,而其余船只则仅需10-20迪纳尔。此举大大增加了中国商船的运输成本,也迫使胡椒商越来越依赖阿拉伯船队进行运输。此外,阿拉伯人还散布“唐船抗风浪弱”的谣言,进一步压缩中国商人在胡椒贸易中的份额,从而实现自身的垄断。


当胡椒乘风破浪进入中国后,阿拉伯人又不断为胡椒增添附加值,宣扬其豪奢与稀缺性,甚至催生了胡椒直接兑换丝绸、瓷器的现象。据传,1石胡椒可直接兑换10匹杭州产的丝绸。


此外,唐代广州市舶司规定外商货物需存入官仓6个月,对于政府需要的商品,政府以最高市价收购,阿拉伯商人趁机抬高价格,仅此一项即可获利超200%。更有甚者,阿拉伯人还通过贿赂市舶司官员建立走私渠道,逃避关税。史载,中唐时期广州港30%的胡椒交易未纳税,利润全归阿拉伯商团。阿拉伯人依靠胡椒在广州换取中国货物,运至巴格达出售后利润翻倍,而后再用白银采购印度胡椒,形成“胡椒→中国商品→白银→胡椒”的闭环资本链,按现代模型估计年收益率超300%。


国历君自制资本链模拟图。


唐代的胡椒有多流行


虽然胡椒的价格一直居高不下,但不妨碍其在皇室、贵族与上层社会中广受喜爱。


唐代饮食中对于胡椒的使用主要是调味、佐酒和作羹等。


唐,白釉绿彩盖盒。来源/故宫博物院


和今天类似,唐代胡椒首先搭配的就是牛羊肉。《齐民要术》中关于“胡炮肉法”的记述中便提到,羊肉在切好后要:


“著浑豉、盐、繴葱白、姜、椒、毕拨、胡椒,令调适。”


这样经过胡椒腌制后的羊肉再放入炉中烧烤,滋味远胜于一般的烹煮。


除此之外,唐代人在食用“胡饼”时也忘不了搭配胡椒:


“时豪家食次,起羊肉一斤,层布于巨胡饼,隔中以椒豉,润以酥,入炉迫之,候肉熟食之,呼为‘古楼子’。”


在酒中加入胡椒也是深受唐代有钱人喜爱的驱寒方法。《太平广记》中便出现了官员在寒时赶路结束后“速暖两大盏酒来,着椒葱”的故事,将葱和胡椒加入酒中温热后饮下,祛寒除湿,颇有些今日些许地方过年时仍将葱姜放入可乐中一同加热饮用的意趣。


用胡椒等香辛料来煮羹粥的方法,也渗入到唐人的饮食习惯。如昝殷的《食医心鉴》在讲述食用猪心羹时,特别强调:“入少胡椒末亦佳。”


国历君自制表情包。底图来源/影视剧《妖猫传》


寻常富豪将胡椒烹煮后的残渣也被收集起来晒干,碾碎后出售给平民百姓。胡椒就这样成为唐代区隔阶层差异的奢侈门槛,是名副其实的奢侈品。


宰相为什么要囤胡椒


胡椒高昂的价格,和耐保存、不易变质的特性,促使它在官场渐渐衍生出了类似黄金的货币等价物属性。在唐代官场贿赂的潜规则中,胡椒就扮演了至关重要的角色。为此,唐代宗曾下令限制胡椒消费,但官员们和阿拉伯人相互勾结,阳奉阴违,直到元载的贪腐大案被揭露,胡椒再一次被推上风口浪尖。


关于元载本人痴迷于胡椒的原因众说纷纭。一种说法认为元载是陕西岐山人,自幼喜好当地的特色面食“臊子面”,他在少时吃臊子面时最大的理想便是能够多加上几粒胡椒用来调味,因此在他官居宰相之位后就开始疯狂地囤积胡椒,以弥补自己曾经的缺憾。


国历君自制元载表情包。底图来源/影视剧《九流霸主》


另一种更有说服力的猜想则是和元载本人崇尚道教,寻求养生秘术的愿望有关。《新唐书·元载传》记载,查抄元载家中时,和800石胡椒一同查获的还有500两钟乳,而服食钟乳正是道家追求延年益寿、长生不老的重要途径之一。《千金翼方》记载,长期服用钟乳可以“延年益寿,好颜色不老,令人有子”。唐代人认为,在服食钟乳时,必须将诸如生姜或茱萸等热药加入清酒中,温后饮用,使遍体发热,血脉通行。如果血脉运行不畅,就会生疮或发热。胡椒在其产地之一的印度即被视为绝佳的“热药”,与“乾姜、筚拔”合称为“三辛药”,故而在传入中国后成为与钟乳搭配服食的理想辅助药物。唐代医学中也已经出现了以胡椒为主料制作的“理中丸”和“胡椒丸”,用以温中和胃。


不过无论元载痴迷胡椒的原因究竟是什么,胡椒自此与他的贪腐绑定,成为后世文人讥讽的意象,也算是无妄之灾了。苏轼曾写诗嘲讽“胡椒铢两多,安用八百斛?”于谦更是直言斥骂“胡椒八百斛,千载遗腥臊”。


唐,玉花柄杯。来源/故宫博物院


胡椒的金贵从唐朝一直延续到了明朝,永乐年间,朱棣还曾用宫中贮藏的胡椒充抵银两来给官员们发工资。据《明成祖实录》记载:

 

“春夏折钞,秋冬则苏木、胡椒,五品以上折支十之七,以下则十之六。”


“胡椒每斤准钞一百贯,苏木每斤准钞五十贯,南北二京官各于南北京库支给。”

 

直到明中叶后,葡萄牙人占据澳门,取代了阿拉伯人在胡椒贸易中的垄断地位,大量贩运胡椒到中国,而中国内地也一点点摸索出了栽培胡椒的方法,这才打破了受制于人的局面,逐渐实现了胡椒自由。

 

胡椒作为香料在唐代受到如此追捧,究其根本乃是地理条件限制造成的商品流通不畅,加之阿拉伯人趁机从中操纵,垄断经营,将一粒小小的胡椒炒出天价。当然穷奢极欲的皇室贵族也难辞其咎,正如长安的荔枝一般,上有所好,下必甚焉!



参考资料:

段成式撰,方南生点校:《酉阳杂俎》,中华书局,1981年版。

温翠芳:《唐代的外来香药研究》,陕西师范大学博士学位论文,2006年。

张玉梅:《简论胡椒与唐代的饮食文化》,《考试周刊》2011年第38期。

汪汉利:《从<苏莱曼东游记>看唐朝与阿拉伯的海上丝路》,《回族研究》2016年第3期。


本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。


\"图片\"
END
作者 | 浅神
编辑 | 胡心雅 
 主编 | 周斌
排版 | 徐沁(实习)
校对 | 李栋 彦文
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓



\"图片\"

\"图片\"



“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", + "content": "



本 文 约 3300 字
阅 读 需 要 11 分钟


公元777年,唐代宗以“夜设巫蛊”的罪名逮捕宰相元载,命人查抄他的宅邸,其中查获钟乳500两,胡椒800石,此举引得代宗震怒,立刻下诏将元载赐死。


唐代宗李俶的影视形象。来源/影视剧《大唐荣耀》


胡椒在当时是贵重之物,八百石的胡椒价值不菲。元载因此被后世讥笑为“胡椒宰相”,宋人作诗讽刺他“相国藏椒八百斛”。可以想见,单单是数额庞大的胡椒藏量,就足以引起皇帝的震怒了。


不过,胡椒在唐代为何如此昂贵?一朝宰相又为何囤积这么多胡椒呢?


胡椒背后的阿拉伯人与海外贸易


胡椒名称中的“胡”字即代表它乃是由西域传入的胡人香料,并非原产自中国。唐代的胡椒几乎全部由阿拉伯商人经丝绸之路转运至中国内地。中文史料中关于胡椒的记载早期见于西晋司马彪撰写的《续汉书》,其中记载“天竺国出石蜜、胡椒、黑盐”。此后围绕着胡椒的产地,史料中陆续出现了印度、波斯、西域和南海诸国等说法。玄奘在《大唐西域记》中也记载印度南部的阿吒厘国“出胡椒树,树叶若蜀椒也”。


胡椒自传入中国后,因其稀缺性,价格一直居高不下。公元751年,唐王朝在怛罗斯之战中败给了大食国,加之随后的安史之乱,一系列变故使大唐在西域的影响力降低,陆上丝绸之路受到冲击,由阿拉伯人经营的海上丝绸之路开始慢慢成为贸易的主要途径,胡椒也在这一时期成为阿拉伯人赚取利润的重要商品。



阿拉伯人逐渐掌握了海上丝绸之路后,将胡椒作为明星商品进行包装,并采取了一系列手段操控价格。阿拉伯人首先为胡椒打造了一系列神话,他们曾向罗马人宣称胡椒只生长在由神龙看管的瀑布之下,威尼斯商人也借此将胡椒命名为“天堂的种子”。面对唐人,阿拉伯人又谎称在印度的胡椒林毒蛇盘踞,需要放火烧林将毒蛇驱逐后才能采摘,因而胡椒呈现出黑色且气味辛辣。种种天方夜谭般的故事为胡椒披上了一层神秘的外衣,迫使唐人不得不接受胡椒高昂的价格,并将之作为尊贵的象征。



在海运胡椒的过程中,阿拉伯人在沿途设立征税点,对过往补给的商船征收高额关税,尤其针对中国船只。据阿拉伯商人苏莱曼撰写的《中国印度见闻录》中记载,在斯里兰卡的一处征税点,阿拉伯人对过往的中国商船征收50迪纳尔的关税,而其余船只则仅需10-20迪纳尔。此举大大增加了中国商船的运输成本,也迫使胡椒商越来越依赖阿拉伯船队进行运输。此外,阿拉伯人还散布“唐船抗风浪弱”的谣言,进一步压缩中国商人在胡椒贸易中的份额,从而实现自身的垄断。


当胡椒乘风破浪进入中国后,阿拉伯人又不断为胡椒增添附加值,宣扬其豪奢与稀缺性,甚至催生了胡椒直接兑换丝绸、瓷器的现象。据传,1石胡椒可直接兑换10匹杭州产的丝绸。


此外,唐代广州市舶司规定外商货物需存入官仓6个月,对于政府需要的商品,政府以最高市价收购,阿拉伯商人趁机抬高价格,仅此一项即可获利超200%。更有甚者,阿拉伯人还通过贿赂市舶司官员建立走私渠道,逃避关税。史载,中唐时期广州港30%的胡椒交易未纳税,利润全归阿拉伯商团。阿拉伯人依靠胡椒在广州换取中国货物,运至巴格达出售后利润翻倍,而后再用白银采购印度胡椒,形成“胡椒→中国商品→白银→胡椒”的闭环资本链,按现代模型估计年收益率超300%。


国历君自制资本链模拟图。


唐代的胡椒有多流行


虽然胡椒的价格一直居高不下,但不妨碍其在皇室、贵族与上层社会中广受喜爱。


唐代饮食中对于胡椒的使用主要是调味、佐酒和作羹等。


唐,白釉绿彩盖盒。来源/故宫博物院


和今天类似,唐代胡椒首先搭配的就是牛羊肉。《齐民要术》中关于“胡炮肉法”的记述中便提到,羊肉在切好后要:


“著浑豉、盐、繴葱白、姜、椒、毕拨、胡椒,令调适。”


这样经过胡椒腌制后的羊肉再放入炉中烧烤,滋味远胜于一般的烹煮。


除此之外,唐代人在食用“胡饼”时也忘不了搭配胡椒:


“时豪家食次,起羊肉一斤,层布于巨胡饼,隔中以椒豉,润以酥,入炉迫之,候肉熟食之,呼为‘古楼子’。”


在酒中加入胡椒也是深受唐代有钱人喜爱的驱寒方法。《太平广记》中便出现了官员在寒时赶路结束后“速暖两大盏酒来,着椒葱”的故事,将葱和胡椒加入酒中温热后饮下,祛寒除湿,颇有些今日些许地方过年时仍将葱姜放入可乐中一同加热饮用的意趣。


用胡椒等香辛料来煮羹粥的方法,也渗入到唐人的饮食习惯。如昝殷的《食医心鉴》在讲述食用猪心羹时,特别强调:“入少胡椒末亦佳。”


国历君自制表情包。底图来源/影视剧《妖猫传》


寻常富豪将胡椒烹煮后的残渣也被收集起来晒干,碾碎后出售给平民百姓。胡椒就这样成为唐代区隔阶层差异的奢侈门槛,是名副其实的奢侈品。


宰相为什么要囤胡椒


胡椒高昂的价格,和耐保存、不易变质的特性,促使它在官场渐渐衍生出了类似黄金的货币等价物属性。在唐代官场贿赂的潜规则中,胡椒就扮演了至关重要的角色。为此,唐代宗曾下令限制胡椒消费,但官员们和阿拉伯人相互勾结,阳奉阴违,直到元载的贪腐大案被揭露,胡椒再一次被推上风口浪尖。


关于元载本人痴迷于胡椒的原因众说纷纭。一种说法认为元载是陕西岐山人,自幼喜好当地的特色面食“臊子面”,他在少时吃臊子面时最大的理想便是能够多加上几粒胡椒用来调味,因此在他官居宰相之位后就开始疯狂地囤积胡椒,以弥补自己曾经的缺憾。


国历君自制元载表情包。底图来源/影视剧《九流霸主》


另一种更有说服力的猜想则是和元载本人崇尚道教,寻求养生秘术的愿望有关。《新唐书·元载传》记载,查抄元载家中时,和800石胡椒一同查获的还有500两钟乳,而服食钟乳正是道家追求延年益寿、长生不老的重要途径之一。《千金翼方》记载,长期服用钟乳可以“延年益寿,好颜色不老,令人有子”。唐代人认为,在服食钟乳时,必须将诸如生姜或茱萸等热药加入清酒中,温后饮用,使遍体发热,血脉通行。如果血脉运行不畅,就会生疮或发热。胡椒在其产地之一的印度即被视为绝佳的“热药”,与“乾姜、筚拔”合称为“三辛药”,故而在传入中国后成为与钟乳搭配服食的理想辅助药物。唐代医学中也已经出现了以胡椒为主料制作的“理中丸”和“胡椒丸”,用以温中和胃。


不过无论元载痴迷胡椒的原因究竟是什么,胡椒自此与他的贪腐绑定,成为后世文人讥讽的意象,也算是无妄之灾了。苏轼曾写诗嘲讽“胡椒铢两多,安用八百斛?”于谦更是直言斥骂“胡椒八百斛,千载遗腥臊”。


唐,玉花柄杯。来源/故宫博物院


胡椒的金贵从唐朝一直延续到了明朝,永乐年间,朱棣还曾用宫中贮藏的胡椒充抵银两来给官员们发工资。据《明成祖实录》记载:

 

“春夏折钞,秋冬则苏木、胡椒,五品以上折支十之七,以下则十之六。”


“胡椒每斤准钞一百贯,苏木每斤准钞五十贯,南北二京官各于南北京库支给。”

 

直到明中叶后,葡萄牙人占据澳门,取代了阿拉伯人在胡椒贸易中的垄断地位,大量贩运胡椒到中国,而中国内地也一点点摸索出了栽培胡椒的方法,这才打破了受制于人的局面,逐渐实现了胡椒自由。

 

胡椒作为香料在唐代受到如此追捧,究其根本乃是地理条件限制造成的商品流通不畅,加之阿拉伯人趁机从中操纵,垄断经营,将一粒小小的胡椒炒出天价。当然穷奢极欲的皇室贵族也难辞其咎,正如长安的荔枝一般,上有所好,下必甚焉!



参考资料:

段成式撰,方南生点校:《酉阳杂俎》,中华书局,1981年版。

温翠芳:《唐代的外来香药研究》,陕西师范大学博士学位论文,2006年。

张玉梅:《简论胡椒与唐代的饮食文化》,《考试周刊》2011年第38期。

汪汉利:《从<苏莱曼东游记>看唐朝与阿拉伯的海上丝路》,《回族研究》2016年第3期。


本文系“国家人文历史”独家稿件,欢迎读者转发朋友圈。


\"图片\"
END
作者 | 浅神
编辑 | 胡心雅 
 主编 | 周斌
排版 | 徐沁(实习)
校对 | 李栋 彦文
\"图片\"

国历好物
\"图片\"

蓄势、顺势、借势、逆势

于危机中寻先机

于危局中开新局

历史的每一步转折

都是危机与机遇的博弈

《国家人文历史》团队最新力作

讲透中国古代多个关键转折时期

新旧更迭的内在逻辑

\"图片\"


点击下方封面,即可购买



↓↓↓



\"图片\"

\"图片\"



“在看”的永远18岁~

\n \n\n \n
\n\n \n 文章原文\n
\n \n\n \n\n \"\"
", + "category": "", + "link": "http://weixin.sogou.com/weixin?type=2&query=%E5%9B%BD%E5%AE%B6%E4%BA%BA%E6%96%87%E5%8E%86%E5%8F%B2+%E4%B8%80%E4%B8%AA%E5%AE%B0%E7%9B%B8%E5%9B%A0%E4%B8%BA%E5%9B%A4%E8%83%A1%E6%A4%92%E8%A2%AB%E5%A4%84%E6%AD%BB%E2%80%A6%E2%80%A6%E5%88%B0%E5%BA%95%E6%80%8E%E4%B9%88%E4%B8%AA%E4%BA%8B%E5%84%BF%EF%BC%9F", + "creator": "", + "pubDate": "Wed, 16 Jul 2025 13:29:00 +0800", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "", + "folder": "人文", + "feed": "国家人文历史", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "5065d20560e67caad42abda2bbbdb776", + "highlights": [] + }, { "title": "「世界主宰」的掌机之路:岩田聪与任天堂 DS", "description": "身为掌机市场主宰者的任天堂当然寄希望于通过 GBA SP 缓过一口气,至少撑到自家的次世代主机上市。毕竟索尼 SCE 在这方面一直都是亏钱卖硬件,将 PlayStation 摧枯拉朽的闪击战拖进蓝海玩家的汪洋大海显然对任天堂非常有利——但是「卷王」久多良木健治下的索尼 SCE 攻城掠池的速度比某奥地利落榜美术生速通波兰还快,两家公司在掌机市场上的交锋比预想中的还要更早一些。查看全文", @@ -2411,25 +2235,135 @@ "description": "分享免费、小巧、实用、有趣、绿色的软件", "items": [ { - "title": "China urges U.S. to abandon excessive use of national security concept", - "description": "

BEIJING, June 5 (Xinhua) -- China has urged the United States to abandon its generalized and excessive use of the national security concept, and to collaborate with all parties in maintaining a rules-based multilateral trading system, the Ministry of Commerce said on Thursday.

At a regular press conference, He Yongqian, spokesperson for the ministry, made the remarks when asked to comment on the U.S. decision to raise tariffs on imported steel, aluminium and their derivative products from 25 percent to 50 percent.

He said that such U.S. moves not only harm others and itself, but also will severely disrupt the stability of global industrial and supply chains.

The United States should abandon the zero-sum mentality, address respective concerns through equal dialogue, and jointly maintain the stability of global industrial and supply chains, He said.

Source: Xinhua

", - "content": "

BEIJING, June 5 (Xinhua) -- China has urged the United States to abandon its generalized and excessive use of the national security concept, and to collaborate with all parties in maintaining a rules-based multilateral trading system, the Ministry of Commerce said on Thursday.

At a regular press conference, He Yongqian, spokesperson for the ministry, made the remarks when asked to comment on the U.S. decision to raise tariffs on imported steel, aluminium and their derivative products from 25 percent to 50 percent.

He said that such U.S. moves not only harm others and itself, but also will severely disrupt the stability of global industrial and supply chains.

The United States should abandon the zero-sum mentality, address respective concerns through equal dialogue, and jointly maintain the stability of global industrial and supply chains, He said.

Source: Xinhua

", - "category": "", - "link": "http://english.people.com.cn/n3/2025/0605/c90000-20323960.html", - "creator": "", - "pubDate": "Thu, 05 Jun 2025 16:52:32 +0800", + "title": "独腿博士研发智能假肢,让更多残疾人穿得起Wear robotic knees", + "description": "幼时截肢的他,最终发明、制造出一种独特而“有思想”的智能假肢!", + "content": "幼时截肢的他,最终发明、制造出一种独特而“有思想”的智能假肢!", + "category": "人物", + "link": "http://www.i21st.cn/story/3805.html", + "creator": "www.i21st.cn", + "pubDate": "Fri, 2 Sep 2022 07:00:00", "enclosure": "", "enclosureType": "", "image": "", "id": "", - "language": "", - "folder": "资讯", - "feed": "人民网英语", + "language": "zh", + "folder": "双语", + "feed": "21世纪", "read": false, "favorite": false, "created": false, "tags": [], - "hash": "2fd7f23c70aef43dc6110f4dc0f67492", + "hash": "676d7c24905f895766b5d18b3fa0fd8c", + "highlights": [] + }, + { + "title": "侯逸凡:最年轻的“棋后”Conquering the world of chess", + "description": "16岁就成为最年轻的国际象棋世界“棋后”,她是真人版的《后翼弃兵》!", + "content": "16岁就成为最年轻的国际象棋世界“棋后”,她是真人版的《后翼弃兵》!", + "category": "人物", + "link": "http://www.i21st.cn/story/3807.html", + "creator": "www.i21st.cn", + "pubDate": "Thu, 1 Sep 2022 17:00:02", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "双语", + "feed": "21世纪", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "3372e349617e8cdb5732ee4da3cdcdce", + "highlights": [] + }, + { + "title": "炫酷魔术背后隐藏的科学Spilling the magic beans", + "description": "空中飘物、液体消失、纸张燃烧……这些神奇的魔术背后都隐藏着什么科学原理?", + "content": "空中飘物、液体消失、纸张燃烧……这些神奇的魔术背后都隐藏着什么科学原理?", + "category": "科技", + "link": "http://www.i21st.cn/story/3806.html", + "creator": "www.i21st.cn", + "pubDate": "Wed, 17 Aug 2022 11:09:58", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "双语", + "feed": "21世纪", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "e0627db8d1ede2acddc4a5574cefd5c9", + "highlights": [] + }, + { + "title": "“大老虎”被拿下!中共中央决定对周永康严重违纪问题立案审查", + "description": "", + "content": "", + "category": "", + "link": "/article/translate/5913_1.html", + "creator": "www.i21st.cn", + "pubDate": "Wed, 30 Jul 2014 10:35:02", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "双语", + "feed": "21世纪", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "9f21f8fa51704a71191c0219c9793433", + "highlights": [] + }, + { + "title": "廖凡加冕柏林电影节影帝", + "description": "Berlin International Film Festival", + "content": "Berlin International Film Festival", + "category": "", + "link": "http://www.i21st.cn/article/translate/4929_1.html", + "creator": "www.i21st.cn", + "pubDate": "Mon, 17 Feb 2014 11:22:15", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "双语", + "feed": "21世纪", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "f58695c9a7cdaddb9ab71b5698627132", + "highlights": [] + }, + { + "title": "索契冬奥会李坚柔夺中国首金", + "description": "Short track speed skating", + "content": "Short track speed skating", + "category": "", + "link": "http://www.i21st.cn/article/translate/4927_1.html", + "creator": "www.i21st.cn", + "pubDate": "Fri, 14 Feb 2014 10:50:53", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "zh", + "folder": "双语", + "feed": "21世纪", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "7371f6dbcab15edaf9642e52b8d5ac96", "highlights": [] }, { @@ -2454,28 +2388,6 @@ "hash": "9403257187ea5bb7661eda153297cc59", "highlights": [] }, - { - "title": "Xinhua photos of the day", - "description": "

\"\"

A boy is pictured with a sheep at a sheep market before the upcoming Eid al-Adha on the outskirts of Cairo, Egypt, on June 4, 2025. (Xinhua/Ahmed Gomaa)

\"\"

A rescuer moves relief supplies at Baicao Village of Eryuan County in Dali Bai Autonomous Prefecture, southwest China's Yunnan Province, June 5, 2025.

A 5.0-magnitude earthquake struck Eryuan County at 4:31 a.m. Thursday (Beijing Time), according to the China Earthquake Networks Center (CENC).

The epicenter was monitored at 26.26 degrees north latitude and 100.03 degrees east longitude. The quake struck at a depth of 10 km, said a report issued by the CENC.

The quake was strongly felt in Eryuan County, Dali City and Heqing County, waking some residents. Local authorities in Eryuan County have promptly initiated an emergency response, with townships assessing the impact. (Photo by Luo Xincai/Xinhua)

\"\"

An aerial drone photo taken on June 4, 2025 shows tourists visiting the Hukou Waterfall on the Yellow River on the border between north China's Shanxi Province and northwest China's Shaanxi Province. (Xinhua/Zhang Bowen)

\"\"

Representatives vote on a draft resolution during a UN Security Council meeting at the UN headquarters in New York, on June 4, 2025.

The United States on Wednesday vetoed a Security Council draft resolution that would have demanded an immediate ceasefire in Gaza and the immediate lifting of all restrictions on humanitarian aid. (Xinhua/Xie E)

\"\"

A conference officer collects ballots during a UN General Assembly meeting to elect members of the UN Economic and Social Council at the UN headquarters in New York, on June 4, 2025.

Eighteen states, including China, were elected on Wednesday into the UN Economic and Social Council (ECOSOC), the coordinating body for the economic and social work of UN agencies and funds, for a three-year term. (Manuel Elias/UN Photo/Handout via Xinhua)

\"\"

An aerial drone photo taken on June 4, 2025 shows a black-necked crane at Qinghai Longbao National Nature Reserve, Yushu City of Yushu Tibetan Autonomous Prefecture, northwest China's Qinghai Province.

With lush water and pastures, Qinghai Longbao National Nature Reserve is a key station and breeding ground for migratory birds.

According to monitoring data of May this year, 37 species of birds including bar-headed geese and black necked cranes inhabited here. (Photo by Du Xiaowei/Xinhua)

\"\"

Dong Yuhan (C) and Wu Mengjie (R) of China celebrate after winning the pool 3 match between China and Belgium at the Women's Volleyball Nations League (VNL) 2025 at the National Indoor Stadium in Beijing, China, June 4, 2025.

Host China kicked off its Volleyball Nations League (VNL) Beijing leg in style with a straight-set victory over Belgium on Wednesday, winning 25-18, 27-25, 25-13 at the National Indoor Stadium. (Xinhua/Ju Huanzong)

\"\"

An aerial drone photo taken on June 4, 2025 shows primary school students painting during an environmental protection-themed event in Xinghua City, east China's Jiangsu Province.

Various events are held to raise people's awareness of environmental protection in China ahead of World Environment Day, which falls on June 5. (Photo by Zhou Shegen/Xinhua)

\"\"

Lee Jae-myung takes the oath of office in the National Assembly building in Seoul, South Korea, June 4, 2025.

Lee Jae-myung was sworn in as South Korea's new president on Wednesday after formally beginning his single five-year term earlier in the day. (Xinhua)

\"\"

Zheng Qinwen reacts during the women's singles quarterfinal between Zheng Qinwen of China and Aryna Sabalenka of Belarus at the French Open tennis tournament at Roland Garros, Paris, France, June 3, 2025.

China's tennis sensation Zheng Qinwen lost to world No. 1 Aryna Sabalenka of Belarus 7-6 (3), 6-3 in the French Open women's singles quarterfinals here on Tuesday. (Xinhua/Gao Jing)

\"\"

A Palestinian woman mourns a victim killed in an Israeli airstrike, at Al-Shifa Hospital in Gaza City, on June 4, 2025.

At least 54,510 people have been killed and 124,901 wounded in Gaza during the Israeli military campaign, according to health authorities in the territory. (Photo by Mahmoud Zaki/Xinhua)

Source: Xinhua

", - "content": "

\"\"

A boy is pictured with a sheep at a sheep market before the upcoming Eid al-Adha on the outskirts of Cairo, Egypt, on June 4, 2025. (Xinhua/Ahmed Gomaa)

\"\"

A rescuer moves relief supplies at Baicao Village of Eryuan County in Dali Bai Autonomous Prefecture, southwest China's Yunnan Province, June 5, 2025.

A 5.0-magnitude earthquake struck Eryuan County at 4:31 a.m. Thursday (Beijing Time), according to the China Earthquake Networks Center (CENC).

The epicenter was monitored at 26.26 degrees north latitude and 100.03 degrees east longitude. The quake struck at a depth of 10 km, said a report issued by the CENC.

The quake was strongly felt in Eryuan County, Dali City and Heqing County, waking some residents. Local authorities in Eryuan County have promptly initiated an emergency response, with townships assessing the impact. (Photo by Luo Xincai/Xinhua)

\"\"

An aerial drone photo taken on June 4, 2025 shows tourists visiting the Hukou Waterfall on the Yellow River on the border between north China's Shanxi Province and northwest China's Shaanxi Province. (Xinhua/Zhang Bowen)

\"\"

Representatives vote on a draft resolution during a UN Security Council meeting at the UN headquarters in New York, on June 4, 2025.

The United States on Wednesday vetoed a Security Council draft resolution that would have demanded an immediate ceasefire in Gaza and the immediate lifting of all restrictions on humanitarian aid. (Xinhua/Xie E)

\"\"

A conference officer collects ballots during a UN General Assembly meeting to elect members of the UN Economic and Social Council at the UN headquarters in New York, on June 4, 2025.

Eighteen states, including China, were elected on Wednesday into the UN Economic and Social Council (ECOSOC), the coordinating body for the economic and social work of UN agencies and funds, for a three-year term. (Manuel Elias/UN Photo/Handout via Xinhua)

\"\"

An aerial drone photo taken on June 4, 2025 shows a black-necked crane at Qinghai Longbao National Nature Reserve, Yushu City of Yushu Tibetan Autonomous Prefecture, northwest China's Qinghai Province.

With lush water and pastures, Qinghai Longbao National Nature Reserve is a key station and breeding ground for migratory birds.

According to monitoring data of May this year, 37 species of birds including bar-headed geese and black necked cranes inhabited here. (Photo by Du Xiaowei/Xinhua)

\"\"

Dong Yuhan (C) and Wu Mengjie (R) of China celebrate after winning the pool 3 match between China and Belgium at the Women's Volleyball Nations League (VNL) 2025 at the National Indoor Stadium in Beijing, China, June 4, 2025.

Host China kicked off its Volleyball Nations League (VNL) Beijing leg in style with a straight-set victory over Belgium on Wednesday, winning 25-18, 27-25, 25-13 at the National Indoor Stadium. (Xinhua/Ju Huanzong)

\"\"

An aerial drone photo taken on June 4, 2025 shows primary school students painting during an environmental protection-themed event in Xinghua City, east China's Jiangsu Province.

Various events are held to raise people's awareness of environmental protection in China ahead of World Environment Day, which falls on June 5. (Photo by Zhou Shegen/Xinhua)

\"\"

Lee Jae-myung takes the oath of office in the National Assembly building in Seoul, South Korea, June 4, 2025.

Lee Jae-myung was sworn in as South Korea's new president on Wednesday after formally beginning his single five-year term earlier in the day. (Xinhua)

\"\"

Zheng Qinwen reacts during the women's singles quarterfinal between Zheng Qinwen of China and Aryna Sabalenka of Belarus at the French Open tennis tournament at Roland Garros, Paris, France, June 3, 2025.

China's tennis sensation Zheng Qinwen lost to world No. 1 Aryna Sabalenka of Belarus 7-6 (3), 6-3 in the French Open women's singles quarterfinals here on Tuesday. (Xinhua/Gao Jing)

\"\"

A Palestinian woman mourns a victim killed in an Israeli airstrike, at Al-Shifa Hospital in Gaza City, on June 4, 2025.

At least 54,510 people have been killed and 124,901 wounded in Gaza during the Israeli military campaign, according to health authorities in the territory. (Photo by Mahmoud Zaki/Xinhua)

Source: Xinhua

", - "category": "", - "link": "http://english.people.com.cn/n3/2025/0605/c90000-20323910.html", - "creator": "", - "pubDate": "Thu, 05 Jun 2025 16:36:30 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "人民网英语", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "05bdcb3d99bf092a505f0c504b8095e5", - "highlights": [] - }, { "title": "Chinese VP to attend UN Ocean Conference in France, visit Spain", "description": "

BEIJING, June 5 (Xinhua) -- Chinese Vice President Han Zheng will attend the UN Ocean Conference in Nice, France and visit Spain upon invitation from June 7 to 13, a Chinese foreign ministry spokesperson announced on Thursday.

Source: Xinhua

", @@ -2498,28 +2410,6 @@ "hash": "9db99693e8e3c0d1f88bc063a472583d", "highlights": [] }, - { - "title": "China's economy on steady upward trajectory amid external challenges: official", - "description": "

BEIJING, June 5 (Xinhua) -- Building on a positive start in the first quarter of 2025, China's economy is continuing to make steady progress, said Ding Lin, an official with the National Development and Reform Commission.

Speaking on the latest episode of China Economic Roundtable, an all-media talk show hosted by Xinhua News Agency, Ding noted that despite a complex external environment, China's economy has remained resilient. Notably, key indicators like industrial production, the service sector, domestic demand and exports have shown robust growth.

Ding emphasized China's innovative dynamism, citing 10-percent growth in the high-tech manufacturing sector in April, nearly 4 percentage points higher than the country's overall industrial growth rate.

Ding also highlighted the accelerated development of industries such as drones, new energy vehicles, artificial intelligence and humanoid robots.

\"In general, as pro-growth measures are swiftly implemented, their effects will continue to emerge, further promoting the country's high-quality economic development,\" Ding added.

China's GDP grew by 5.4 percent year on year in the first quarter of 2025.

Source: Xinhua

", - "content": "

BEIJING, June 5 (Xinhua) -- Building on a positive start in the first quarter of 2025, China's economy is continuing to make steady progress, said Ding Lin, an official with the National Development and Reform Commission.

Speaking on the latest episode of China Economic Roundtable, an all-media talk show hosted by Xinhua News Agency, Ding noted that despite a complex external environment, China's economy has remained resilient. Notably, key indicators like industrial production, the service sector, domestic demand and exports have shown robust growth.

Ding emphasized China's innovative dynamism, citing 10-percent growth in the high-tech manufacturing sector in April, nearly 4 percentage points higher than the country's overall industrial growth rate.

Ding also highlighted the accelerated development of industries such as drones, new energy vehicles, artificial intelligence and humanoid robots.

\"In general, as pro-growth measures are swiftly implemented, their effects will continue to emerge, further promoting the country's high-quality economic development,\" Ding added.

China's GDP grew by 5.4 percent year on year in the first quarter of 2025.

Source: Xinhua

", - "category": "", - "link": "http://english.people.com.cn/n3/2025/0605/c90000-20323906.html", - "creator": "", - "pubDate": "Thu, 05 Jun 2025 16:33:40 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "人民网英语", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "70391c560d13fa2ded36785145ef6474", - "highlights": [] - }, { "title": "时隔 1352 天,Foxmail 诈尸级两连更,更新了什么?", "description": "Foxmail 在时隔 1352 天之后,连续进行了 2 个小版本更新,最新版为 2025-07-16 更新的 Foxmail 7.2.25.427 版本。距上一次更新(2021-11-03)已经4年 ", @@ -2996,25 +2886,531 @@ "description": "People's Daily Online", "items": [ { - "title": "瞎扯 · 如何正确地吐槽", - "description": "
\"头图\"/
\n\n
\n
@知乎用户. :有钱人的生活奢侈到什么程度,请看。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
上流社会这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
奢侈这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
吃香喝辣这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
买柠檬水不用代金券这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
日常这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
存款这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
收入这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
财力雄厚这一块/.
\n\n
\n
@秋天2018 :一看到这个场景,我就想到当年查分数的时候,全家人都非常激动,尤其是我爸,激动的四处找皮带……
\n
\n\n
\n
@Ksyne0519 :困意储存器。 当你困的时候可以把睡意储存起来, 就变得精神了, 晚上睡不着觉、或者中午想要午休的时候拿出来, 就可以快速入睡了。
\n
\n\n
\n
@九名 :躺在床上看手机的时候,四岁的女儿凑过来,别玩了,你有孩子要照顾。
\n
\n\n
\n
@林二丘 :从前我快乐的打着工跟老板称兄道弟,直到有一天:
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
 
\n
\n
\n\n\n
\n\n\n\n", - "content": "
\"头图\"/
\n\n
\n
@知乎用户. :有钱人的生活奢侈到什么程度,请看。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
上流社会这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
奢侈这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
吃香喝辣这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
买柠檬水不用代金券这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
日常这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
存款这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
收入这一块/.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
财力雄厚这一块/.
\n\n
\n
@秋天2018 :一看到这个场景,我就想到当年查分数的时候,全家人都非常激动,尤其是我爸,激动的四处找皮带……
\n
\n\n
\n
@Ksyne0519 :困意储存器。 当你困的时候可以把睡意储存起来, 就变得精神了, 晚上睡不着觉、或者中午想要午休的时候拿出来, 就可以快速入睡了。
\n
\n\n
\n
@九名 :躺在床上看手机的时候,四岁的女儿凑过来,别玩了,你有孩子要照顾。
\n
\n\n
\n
@林二丘 :从前我快乐的打着工跟老板称兄道弟,直到有一天:
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
 
\n
\n
\n\n\n
\n\n\n\n", + "title": "第十九届世界青年桥牌团体锦标赛即将开赛", + "description": "第十九届世界青年桥牌团体锦标赛(19th World Youth Team Championships)将于7月12-17日在意大利萨尔索马焦雷举办。共有来自世界各地的94支青年队参加U26,U21,U26女子,U16,U31五个组别的比赛", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n
\n \n
\n
\n \n 世青赛即将开赛\n \n
\n
\n

\n \n 第十九届世界青年桥牌团体锦标赛(19th World Youth Team Championships)将于7月12日-17日在意大利萨尔索马焦雷举办。共有来自世界各地的94支青年队参加U26,U21,U26女子,U16,U31五个组别的比赛。\n \n

\n

\n \n 这五个组别分别是:\n \n

\n

\n \n U26公开团体、冠军奖杯为帕蒂诺杯;\n \n

\n

\n \n U21公开团体、冠军奖杯为达米亚尼杯;\n \n

\n

\n \n U26女子团体、冠军奖杯为罗纳杯;\n \n

\n

\n \n U16公开团体、冠军奖杯为科驰大学杯;\n \n

\n

\n \n U31公开团体、冠军奖杯为豪威斯杯。\n \n

\n

\n \n 与双数年举办的世界青年跨国桥牌锦标赛(World Youth Transnational Bridge Championships)不同的是,WYTC每个世界桥联会员单位只能派一个队参加一个组别的比赛,因此这是代表国家和地区荣誉的世界青年比赛。与世界桥牌团体锦标赛一样的流程,参加世界青年桥牌团体锦标赛的参赛队必须通过世界桥联下属大区的选拔赛才能参加。\n \n

\n

\n \n 本次比赛中国将参加全部5个组别的比赛,5支中国代表队均是通过2025年初举办的全国青少年团体赛选拔产生,继续在2025年5月举办的亚太青年桥牌锦标赛拿到世青赛参赛资格的。\n \n

\n

\n \n 本次世青赛U26、 U21、U31组各有20支队,U26女子组有16队, U16有18队参加。比赛的办法是预赛进行单循环,前8名进入淘汰赛,经过1/4淘汰赛、半决赛、决赛产生最后的冠军。\n \n

\n

\n \n 中国队在世界青年桥牌团体锦标赛上最好成绩是2018年,在江苏吴江举办的第十七届世界青年桥牌团体锦标赛上,中国队获得了U26女子团体和U16公开团体两项冠军,这是中国青年队首次在世青赛上夺冠。\n \n

\n

\n \n 本次比赛世界桥联依然使用“平板叫牌、纸牌打牌”的比赛方式,这种方式对于青少年来说可能更为适合。\n \n

\n

\n \n \n
\n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 第八届世界青年跨国桥牌锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 第十八届世界青年桥牌团体锦标赛闭幕,欧洲瓜分五大冠军\n \n \n

\n

\n \n 相关链接:\n \n 第十八届世界青年桥牌团体锦标赛即将开赛\n \n \n

\n

\n \n 相关链接:\n \n 世界青年桥牌大赛产生团体冠军\n \n \n

\n

\n \n 相关链接:\n \n 世界青年桥牌大赛结束双人赛争夺\n \n \n \n
\n
\n

\n

\n \n \n 相关链接:世界青年桥牌大赛今日开赛\n \n \n

\n

\n \n \n

\n
\n", "category": "", - "link": "https://daily.zhihu.com/story/9782633", - "creator": "", - "pubDate": "Thu, 17 Jul 2025 12:27:03 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", + "link": "https://mp.weixin.qq.com/s/t0X7c2vCHHEfbl4ZMBZf9g", + "creator": "标兵桥牌", + "pubDate": "Thu, 10 Jul 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTjauh0lK8VQ3veVyoLen2EPQQTSPaNn8uxPWCZlBFqMtsplTiakVeTL8qE7FgXWO685E5aicMvr7MQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTjauh0lK8VQ3veVyoLen2EPQQTSPaNn8uxPWCZlBFqMtsplTiakVeTL8qE7FgXWO685E5aicMvr7MQ/0?wx_fmt=jpeg", + "id": "2247512710_1", "language": "", - "folder": "资讯", - "feed": "知乎", + "folder": "桥牌", + "feed": "标兵1桥牌", "read": false, "favorite": false, "created": false, "tags": [], - "hash": "4d5790b7bc2a74839b19fd787279c6b3", + "hash": "f5d9ae560fa138188f746b83f0493403", + "highlights": [] + }, + { + "title": "欧公赛决赛的两副牌", + "description": "这副牌非常关键,这是第二节的最后一副,此前土耳其人一路飙升,打出一波凌厉的攻势,将比分从落后近30IMP变为领先15IMP,在上半场结束前的最后一副,齐老板将比分追回13IMP,总比分才落后2分,至关重要。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 下面两副牌,出现在决赛中,先看叫牌问题:\n \n

\n
\n
\n \n
\n
\n \n 北家叫什么\n \n
\n
\n

\n \n 你是北家,叫牌简单的,开叫1NT,同伴2♣,你2♦没有高花,同伴3♦自然,现在你准备怎么叫?\n \n

\n

\n \n 同伴显示♦的同时,还有4张高花,因为他开始用的是斯台曼,无论是4张哪一门高花,如果你叫3NT,都有可能有危险,但你又不能轻易越过3NT,所以你准备怎么办呢?\n \n

\n

\n \n 实战中,土耳其牌手选择叫3NT,全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 土耳其北家3NT\n \n
\n
\n

\n \n ♥是2-2,不幸的是东家天然做出♥首攻,3NT打不成。\n \n

\n

\n \n 你又能怎么办呢?\n \n

\n

\n \n 来看齐老板的搭档诺沃萨德茨基是怎么处理的:\n \n

\n
\n
\n \n
\n
\n \n 齐老板的搭档叫3♠\n \n
\n
\n

\n \n 诺沃萨德茨基面临的局面与土耳其人一样,但他没选择叫3NT,而是叫个3♠,3♠的好处是,在表示♦有配合的同时,如果同伴的高花是♥,3♠有抑制首攻的作用,而如果同伴的高花是♠,他巧妙地表示了♥的弱点,可谓一举三得。\n \n

\n

\n \n 齐老板知道同伴是3张♠,而且也知道同伴的♥不好,所以选择4♠。\n \n

\n

\n \n 由于将牌分布友好,4♠是个不错的定约,实战中也做成了。\n \n

\n

\n \n 这副牌非常关键,这是第二节的最后一副,此前土耳其人一路飙升,打出一波凌厉的攻势,将比分从落后近30IMP变为领先15IMP,在上半场结束前的最后一副,齐老板将比分追回13IMP,总比分才落后2分,至关重要。\n \n

\n
\n

\n \n 再看首攻问题:\n \n

\n
\n
\n \n
\n
\n \n 你是东家,首攻哪一张\n \n
\n
\n

\n \n 这里的叫牌也是自然性的,2NT是邀请,同伴加倍3NT,你是东家,准备首攻哪一张?\n \n

\n

\n \n 现在要搞清楚对方是什么类型的牌,然后再研究同伴是为何加倍。\n \n

\n

\n \n 同伴有加倍但不能争叫的实力,第一感觉是♦长套,无法叫牌,所以是不是要首攻♦?\n \n

\n

\n \n 不过,一般来说,开叫1♦的人2NT是邀请,如果是18-19点的平均型,应该直接3NT,而如果是♦套,则可以叫3♦,所以2NT大概是(4-3)-5-1或者4-4-4-1、4-4-5-0等♣短的非均型,点力在15-16点之间。\n \n

\n

\n \n 而同伴是♣长套,有没有可能不争叫呢?从你的♣结构来看,也不是不可能,而同伴是♦长套的可能性不高,因为叫1NT的人有♦张数,开叫人也有♦张数,你还有3张,所以综合考虑,同伴是♣的可能性大。\n \n

\n

\n \n 实战中, 卡利塔首攻♦,全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 卡利塔首攻♦,轻松超一\n \n
\n
\n

\n \n ♦的位置不利,定约人轻松超一。虽然首攻♣也无法击败定约,但只能说是卡酷司机加倍太激进了,而他所希望的,则是应该攻♣。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 齐老板首夺欧洲公开桥牌锦标赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 齐老板与土耳其进入决赛\n \n \n

\n

\n \n 相关链接:\n \n 瑞波土法打进欧公赛半决赛\n \n \n

\n

\n \n 相关链接:\n \n 当舒柏林遇见舒柏林\n \n \n

\n

\n \n 相关链接:\n \n 芬奇压哨淘汰罗森塔尔\n \n \n

\n

\n \n 相关链接:\n \n 进攻性叫牌与防守性叫牌——波兹南的牌局\n \n \n

\n

\n \n 相关链接:\n \n 技惊四座的Deep Finesse打法\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛第一阶段结束、弗姆队获得欧洲混团冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲混团赛场上一副牌的两次安全打法\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/y-1dlbaX_Ochsj5wyC8RzA", + "creator": "标兵桥牌", + "pubDate": "Tue, 08 Jul 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512705_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "6c66baaf54362bf7e0ae12c2ceeae462", + "highlights": [] + }, + { + "title": "齐老板首夺欧洲公开桥牌锦标赛冠军", + "description": "经过8天鏖战,齐老板率领的瑞士队决赛战胜土耳其的Jeo Hidro队夺得欧洲公开桥牌锦标赛公开团体赛冠军,这是齐老板的大鳄队首次在该比赛中夺得冠军。来自波兰的Rafal Marks/Jakub Wojcieszek获得公开双人赛冠军。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 经过8天鏖战,齐老板率领的瑞士队决赛战胜土耳其的Jeo Hidro队夺得欧洲公开桥牌锦标赛公开团体赛冠军,这是齐老板的大鳄队首次在该比赛中夺得冠军。来自波兰的Rafal Marks/Jakub Wojcieszek获得公开双人赛冠军,女子双人赛冠军是Cathy/Sophia Baldysz,公开一副一比团体赛冠军由Daisy Chain队获得。\n \n

\n
\n
\n \n
\n
\n \n 齐老板队击败土耳其团队获得冠军\n \n
\n
\n

\n \n 虽然齐老板的团队已经蝉联两届百慕大杯的冠军,但在欧洲公开桥牌锦标赛这一长达22年的赛事中却从未夺冠,本次比赛齐老板队在预赛中勇夺第一,淘汰赛也算顺利,决赛迎战来自土耳其的团队,开局也不错,不过第二节被土耳其团队反超,打到决胜节中,快到比赛结束时遇到一副满贯,如果土耳其选手首攻正确,将会给巴司机带来一些麻烦,比赛还有悬念,但随着满贯做成,比赛也提前结束。\n \n

\n

\n \n 这一冠军不光是齐老板团队的第一个冠军,也成就了巴司机和舒柏林两位在一次大赛中同时拿到混团和公团两项冠军的伟业,他们在前后15天的比赛中都是从头打到尾,这一成绩也是迄今为止首次在综合锦标赛上连夺两大团体赛冠军的纪录。\n \n

\n
\n

\n \n 下面两副牌,出现在决赛中,一副是叫牌问题,一副是首攻问题:\n \n

\n
\n
\n \n
\n
\n \n 北家叫什么?\n \n
\n
\n

\n \n 你是北家,叫牌简单的,开叫1NT,同伴2♣,你2♦没有高花,同伴3♦自然,现在你准备怎么叫?\n \n

\n
\n
\n \n
\n
\n \n 你是东家,首攻哪一张\n \n
\n
\n

\n \n 这里的叫牌也是自然性的,2NT是邀请,同伴加倍3NT,你是东家,准备首攻哪一张?\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 齐老板与土耳其进入决赛\n \n \n

\n

\n \n 相关链接:\n \n 瑞波土法打进欧公赛半决赛\n \n \n

\n

\n \n 相关链接:\n \n 当舒柏林遇见舒柏林\n \n \n

\n

\n \n 相关链接:\n \n 芬奇压哨淘汰罗森塔尔\n \n \n

\n

\n \n 相关链接:\n \n 进攻性叫牌与防守性叫牌——波兹南的牌局\n \n \n

\n

\n \n 相关链接:\n \n 技惊四座的Deep Finesse打法\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛第一阶段结束、弗姆队获得欧洲混团冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲混团赛场上一副牌的两次安全打法\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/1asxdMpKOlbBDgCeiMwCwQ", + "creator": "标兵桥牌", + "pubDate": "Mon, 07 Jul 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512692_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "56af1ade66565c9c643b6bcf9bd96f7d", + "highlights": [] + }, + { + "title": "齐老板与土耳其进入决赛", + "description": "欧洲公开桥牌锦标赛公团结束1/4淘汰赛,齐老板的瑞士队、波兰的Naukabrydzapl队、土耳其的JEO Hidro队、法国绿队进入半决赛。对于一个有123个队参加的跨国比赛来说,最终的四强恰好均由同一国家团队组成,是很少见的。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 欧洲公开桥牌锦标赛公团半决赛结束,齐老板率领的瑞士军团战胜波兰梅花教父贾瑟姆的家庭桥牌队,奥斯曼土耳其部队击败法国人,两队相会决赛。\n \n

\n

\n \n 齐老板与波兰队的半决赛在第一节就奠定了胜局,齐老板与巴舒上阵打出了71:14IMP的比分,队中主力KK组合还没出场就领先超过50IMP,后来的比赛就进入到了松弛时间,最后3节波兰团队还赢了5分。\n \n

\n

\n \n 与齐老板轻松获胜不同,土法大战非常激烈,双方比分一直非常接近,直到最后一节的第25副牌,也就是全场比赛的第倒数第4副,土耳其人面临首攻局面:\n \n

\n
\n
\n \n
\n
\n \n 6♦定约首攻哪张\n \n
\n
\n

\n \n 假如你是东家,右手方开叫1♦,你争叫2♠,左手方3NT,右手方拉出4♦,然后他们叫到6♦,你准备首攻什么?\n \n

\n
\n
\n \n
\n
\n \n 东家首攻♣,击败满贯\n \n
\n
\n

\n \n 实战中土耳其东家基兹洛克首攻♣9,一击命中,击败对方的满贯。实际上,只要不首攻♠,满贯都打不成。\n \n

\n

\n \n 这副牌也成为半决赛决定胜负的关键,如果法国人做成满贯,最后获胜的就是法国人。\n \n

\n

\n \n 在另外一场半决赛中,齐老板队和贾瑟姆队都叫到满贯,但首攻都是♥,定约同样没有做成。\n \n

\n
\n
\n \n
\n
\n \n 卡利塔首攻♥\n \n
\n
\n
\n
\n \n
\n
\n \n 波兰人首攻♥\n \n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 瑞波土法打进欧公赛半决赛\n \n \n

\n

\n \n 相关链接:\n \n 当舒柏林遇见舒柏林\n \n \n

\n

\n \n 相关链接:\n \n 芬奇压哨淘汰罗森塔尔\n \n \n

\n

\n \n 相关链接:\n \n 进攻性叫牌与防守性叫牌——波兹南的牌局\n \n \n

\n

\n \n 相关链接:\n \n 技惊四座的Deep Finesse打法\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛第一阶段结束、弗姆队获得欧洲混团冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲混团赛场上一副牌的两次安全打法\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/1eNZvX1Cy9F56u7fZpeU8A", + "creator": "标兵桥牌", + "pubDate": "Sun, 06 Jul 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512687_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "f8a177f20f224372b56418786352912a", + "highlights": [] + }, + { + "title": "瑞波土法打进欧公赛半决赛", + "description": "欧洲公开桥牌锦标赛公团结束1/4淘汰赛,齐老板的瑞士队、波兰的Naukabrydzapl队、土耳其的JEO Hidro队、法国绿队进入半决赛。对于一个有123个队参加的跨国比赛来说,最终的四强恰好均由同一国家团队组成,是很少见的。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 欧洲公开桥牌锦标赛公团结束1/4淘汰赛,齐老板的瑞士队、波兰的Naukabrydzapl队、土耳其的JEO Hidro队、法国绿队进入半决赛。对于一个有123个队参加的跨国比赛来说,最终的四强恰好均由同一国家团队组成,是很少见的。\n \n

\n

\n \n 在女子团体决赛中,美国/波兰联军Parker队战胜意大利的Tersch队获得冠军。\n \n

\n
\n

\n \n 齐老板队1/4淘汰赛的对手是保加利亚队,齐老板从开局就领先,始终将主动权握在手中,在比赛的最后一节,出现了这样一副牌:\n \n

\n
\n
\n \n
\n
\n \n 3♠后东家如何叫牌?\n \n
\n
\n

\n \n 北家开叫2♠,你是东家,选择加倍,南家加叫3♠到你这里,选择什么叫品?\n \n

\n

\n \n 可以选择的叫品大概有:\n \n

\n

\n \n 加倍\n \n

\n

\n \n 4♦\n \n

\n

\n \n 5♦\n \n

\n

\n \n 4♠/4NT等显示3套牌的叫品\n \n

\n
\n

\n \n 我觉得4♦ 和5♦应该第一个被排除,因为这牌不是♦单套,而是还有♥和♣可以打,特别是♥定约不应该被忽视。\n \n

\n

\n \n 加倍的好处是可以照顾到♥,如果同伴选择♣,再回到♦上来,但问题是万一同伴没什么好叫的,就可能Pass,对方9张以上将牌,加上位置因素,防守3♠可能不是那么合算。\n \n

\n

\n \n 如果认为同伴有些实力并且在♠上没什么点力,那么这牌可以积极一些,考虑往满贯走,办法是4♠或者4NT,取决于你们的约定。\n \n

\n

\n \n 另一个问题,无论选择加倍还是4♠、4NT,同伴叫牌后,这牌是满足成局,还是往满贯走?\n \n

\n

\n \n 实战中共有3桌遇到了这一进程,他们的选择都不相同。\n \n

\n
\n
\n \n
\n
\n \n 卡利塔选择继续加倍\n \n
\n
\n

\n \n 东西方是齐老板队的KK组合,卡利塔第二次叫牌选择加倍,卡酷司机60%的点力都在♠上,他虽然有♥张数,但还是Pass,得到800分。\n \n

\n
\n
\n \n
\n
\n \n 斯特法诺夫选择4NT\n \n
\n
\n

\n \n 保加利亚的斯特法诺夫非常积极,他先叫4NT,同伴5♣,他叫5♦,显示还有♥,然后在同伴选择5♥后扣叫5♠表示大满贯兴趣,后面他们的叫牌发生了误会,西家5NT显然是Pickup-Slam,让同伴在♦和♥中选择满贯,但斯特法诺夫觉得5NT是有大满贯兴趣,直叫7♥。\n \n

\n

\n \n 我觉得即使斯特法诺夫不认为5NT是选满贯,也应该考虑到,同伴没有叫6♣,没有♣K,将牌最多4-4,还是应该谨慎,而西家的5NT叫得很好,6♦定约要更加安全一些。斯特法诺夫叫品前后矛盾,他的5♦是可以停下来的,但听到同伴♥有配合就想打大满贯,这符合逻辑吗?根据统计,在阻击叫后,进攻性叫牌要低一格通常是比较合适的策略。这副牌也是,东西方停在小满贯上就能赢11-12分,而不是现在输14分。\n \n

\n
\n
\n \n
\n
\n \n 土耳其人叫4♠显示有♥的满贯兴趣\n \n
\n
\n

\n \n 这一桌东西方是土耳其选手,东家第二次叫牌选择的是4♠,他们的约定是有♥,西家选5♥,东家直接加叫6♥。这进程也可以再探讨,此时的5NT应该仍然是Pickup-Slam,防止西家♥没有J10的时候,打到错误的满贯。\n \n

\n

\n \n 如果不准备往满贯走,现在KK组合的800分就是不错的结果。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 当舒柏林遇见舒柏林\n \n \n

\n

\n \n 相关链接:\n \n 芬奇压哨淘汰罗森塔尔\n \n \n

\n

\n \n 相关链接:\n \n 进攻性叫牌与防守性叫牌——波兹南的牌局\n \n \n

\n

\n \n 相关链接:\n \n 技惊四座的Deep Finesse打法\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛第一阶段结束、弗姆队获得欧洲混团冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲混团赛场上一副牌的两次安全打法\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/eA-wD7vnZ1ZS4yp7pWCkVQ", + "creator": "标兵桥牌", + "pubDate": "Sat, 05 Jul 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512681_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "c7547f58f9af78c31a0279f5bd363abd", + "highlights": [] + }, + { + "title": "当舒柏林遇见舒柏林", + "description": "荷兰小将是舒柏林巴司机的晚辈,各种技巧自然也学得滚瓜纯属,德莱昂在单方无局第三家,觉得开叫3♥没什么用,于是祭起了舒柏林的独门法宝,没想到舒柏林遇见舒柏林,马上被舒柏林识破,可惜的是舒柏林没能完成3NT,他还是失败了。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 欧洲公开桥牌锦标赛公团比赛7月2日产生8强,在介绍比赛进程之前,先看下面这副牌:\n \n

\n
\n
\n \n
\n
\n \n 没轮到你,上家先开叫2NT\n \n
\n
\n

\n \n 两家Pass,东家开叫2NT,20-21点,你是南家,如何考虑叫牌?提示一下,东家是瑞士荷兰世界冠军舒柏林。\n \n

\n
\n

\n \n 回到比赛介绍。7月2日的16强战各有惊喜,其中最大的冷门是中国台北/新加坡华人队击败意大利国手组成的芬奇队。昨天我们的文章刚刚介绍过,芬奇队通过艰难的预赛打进32强,淘汰赛击败2号种子罗森塔尔队,正准备大展身手之际,遇到了中国台北/新加坡联军阿曼达队,第一节阿曼达取得优势开局,后面也没给对方机会,一共赢了39IMP,即使不算芬奇队客户所上的两节,阿曼达队与意大利国手对抗的后两节也获得了总分2IMP的优势。看起来现在亚太地区的桥牌水平正在大步提升,非常接近了世界级水平。\n \n

\n

\n \n 其他场次的比赛是齐老板战胜荷兰橙队,保加利亚战胜印度/瑞典联队,两个波兰队,美国的舒里队,法国绿队,土耳其JEO队一起晋级。\n \n

\n

\n \n 女子团体半决赛结束,来自意大利的Tersch队和美国/波兰联军Parker队进入决赛。\n \n

\n

\n \n 根据欧洲桥联的报道,未来5年,即2026-2030年的欧洲冬季跨国桥牌锦标赛将落户捷克布拉格,这是欧洲桥联首次将同一比赛连续在同一举办地举办。\n \n

\n
\n

\n \n 下面回到刚才的牌局:\n \n

\n
\n
\n \n
\n
\n \n 没轮到你,上家开叫2NT\n \n
\n
\n

\n \n 南家是开叫2NT的牌,但东家在前面先开叫了,你会不会认为东家19点进行了升级,也就是你和东家有40点。不过由你首攻,你肯定能够击败2NT,你是否要行动呢?\n \n

\n
\n
\n \n
\n
\n \n 南家舒柏林询问西家,2NT开叫是什么牌?\n \n
\n
\n

\n \n 这是齐老板队与荷兰橙队的比赛,东家并不是舒柏林,南家才是舒柏林,他询问西家,开叫2NT的情况,西家斯普林克许泽对他说,\n \n “你开叫2NT是什么牌,他就是什么牌!”\n \n \n

\n
\n

\n \n 于是舒柏林加倍,叫牌过程如下发展:\n \n

\n
\n
\n \n
\n
\n \n 舒柏林加倍,东家跑3♥,舒柏林3NT\n \n
\n
\n

\n \n 东家是荷兰小将盖伊门德斯德莱昂,这对小将曾经在2022年的罗森布卢姆杯上表现出色,打进了决赛。\n \n

\n
\n
\n \n
\n
\n \n 巴司机微笑问德莱昂,”你学的不错啊“\n \n
\n
\n

\n \n 舒柏林加倍他的2NT,德莱昂跑到3♥,舒柏林自己叫3NT,西家首攻♥6,明手的牌摊下来,舒柏林心说:\n \n “别跟我来这套,这是我玩剩下的!”\n \n \n

\n

\n \n 舒柏林忍让♥,第二墩西家告缺,果然东家是凭♥长套诈叫2NT的,现在舒柏林已有8墩,第9墩如何而来?\n \n

\n

\n \n 舒柏林吃进第三墩♥,西家垫2张♦,明手垫♠,舒柏林兑现4圈♦和1墩♣,东家只有2张♦,垫了2张♣。现在怎么打?\n \n

\n
\n
\n \n
\n
\n \n 是飞♠还是不飞\n \n
\n
\n

\n \n 已知东家有6张♥,跟出2张♦和3张♣,还有2张牌。如果东家有♠K,则拔♣看看他是否还有♣,如果没有了,就是2张♠,他不能垫♠,用♥投入东家即可,但如果东家跟出♣,他就只有1张♠,这张♠是K还是小,就需要猜断了,舒柏林决定打东家单张♠,于是他出小♠到A,准备送给西家:\n \n

\n
\n
\n \n
\n
\n \n 舒柏林没打对\n \n
\n
\n

\n \n 可惜东家有♠K,舒柏林的打法失败了。\n \n

\n

\n \n \n “难道你开叫2NT还有♠K吗?这一点也不正宗啊!”\n \n 舒柏林瞪着眼睛对他的小兄弟说。\n \n

\n

\n \n \n 用2NT开叫做诈叫,是舒柏林的标志性叫牌之一\n \n ,他们这一叫牌,是写进约定卡的。在2024年雷辛格尔杯的决赛中,舒柏林就在我们桌上表演了一次,可惜被睿智的张永革识破,请看:\n \n

\n

\n \n \n \n 博取最佳——雷辛格尔杯之路——齐老板与尼老板(三)\n \n \n \n 之识破舒柏林的诡计\n \n \n

\n

\n \n 荷兰小将是舒柏林巴司机的晚辈,各种技巧自然也学得滚瓜纯属,德莱昂在单方无局第三家,觉得开叫3♥没什么用,于是祭起了舒柏林的独门法宝,没想到\n \n \n \n 舒柏林遇见舒柏林\n \n \n \n ,马上被舒柏林识破,可惜的是舒柏林没能完成3NT,他还是失败了。\n \n

\n

\n \n 从打法上看,舒柏林忽视了德莱昂♣的垫牌顺序,他表示的是3张信号,所以舒柏林如果相信他的小兄弟,应该拔♣,东家没有♣,他只能垫成单张♠K,舒柏林再考虑拔♠A。但他不能这么打的原因,是因为多忍让了一轮♥,送♠就会有1个♠、2个♥、2个♣输墩;如果他第二墩♥就停住,最后就可以安全地拔♠A,最多输1墩♠、1墩♥、2墩♣。\n \n

\n

\n \n 舒柏林还是没把握德莱昂的2NT到底有多少张♥。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 芬奇压哨淘汰罗森塔尔\n \n \n

\n

\n \n 相关链接:\n \n 进攻性叫牌与防守性叫牌——波兹南的牌局\n \n \n

\n

\n \n 相关链接:\n \n 技惊四座的Deep Finesse打法\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛第一阶段结束、弗姆队获得欧洲混团冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲混团赛场上一副牌的两次安全打法\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/GYUyZ7Na50SVMA9upv-n5A", + "creator": "标兵桥牌", + "pubDate": "Fri, 04 Jul 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512674_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "5e7f7ba8baf49614c379c8f6b16dd620", + "highlights": [] + }, + { + "title": "芬奇压哨淘汰罗森塔尔", + "description": "2025年欧洲桥牌公开锦标赛公团32进16的比赛异常激烈,来自意大利的芬奇队在最后一副牌逆转淘汰赛会2号种子罗森塔尔队。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 2025年欧洲桥牌公开锦标赛公团32进16的比赛异常激烈,来自意大利的芬奇队在最后一副牌逆转淘汰赛会2号种子罗森塔尔队。\n \n

\n

\n \n 芬奇队的主力队员有4名意大利国手,韦尔萨切/塞门塔、多纳蒂/佩卡里奥。这是一支实力强劲的团队,不过在预赛中他们成绩并不好,最终是得益于欧洲桥联新的赛制才得以复活。\n \n

\n

\n \n 根据本届欧公赛的赛制规定,如果公开团体赛报名少于110个队,则按原计划,即预赛3天,前32进入淘汰赛;如果公开团体赛报名超过110个队,则使用一种新的办法,预赛前两天结束后,前60名的队直接进入淘汰赛,61名以后的队则继续进行第三天的预赛,第三天同时进行前60名的淘汰赛和61名以后的预赛,第三天的预赛前2名进入淘汰赛,与第一场淘汰赛的30个胜者构成32队进行完整的淘汰赛。\n \n

\n

\n \n 拥有4名意大利国手的芬奇队预赛表现实在不怎么样,他们最低名次是第102名,几经挣扎,最高曾到过第33名,但马上被打倒60名开外,2天结束后第62名,只能继续第三天的预赛。第三天的预赛还有63个队,打到前两名谈何容易,芬奇队在最后一轮的倒数第三副牌才成功上岸,这副牌就是我昨天发出的第26副,他们也得益于叫牌的精准,请看韦尔萨切和塞门塔的叫牌:\n \n

\n
\n
\n \n
\n
\n \n 东西方只有10点,但4♠却是铁牌\n \n
\n
\n

\n \n 西家是韦尔萨切,同伴Pass后,他5个点既不阻击也不Pass,而是在有局方开叫1♠,北家加倍,东家塞门塔2♠是弱加叫,南家应叫性加倍,韦尔萨切4♠,南北方加倍正常,但却无法击败联手只有10个点的4♠定约。\n \n

\n

\n \n 另外一桌多纳蒂和佩卡里奥叫到并完成5♣加倍定约,两牌相加,芬奇队赢17IMP,他们马上跳到了第一名的位置,最终艰难出线进入32强。\n \n

\n

\n \n 佩服韦尔萨切的勇气和胆识,这副牌的处理在淘汰赛60桌中,大部分都是开叫3♠或者4♠,只有两桌西家开叫1♠,其中一桌叫牌过程和结果,与意大利人这里完全一样。\n \n

\n

\n \n 芬奇队进入淘汰赛后,如梦初醒,立刻变成一头雄狮,遇到他们的2号种子罗森塔尔可谓不幸,两队大战4节,打完55副不分上下,罗森塔尔领先1分,下面是最后一副:\n \n

\n
\n
\n \n
\n
\n \n 东西方2♥正常\n \n
\n
\n

\n \n 西家佩卡里奥开叫1♥再叫2♥,最终做成定约,怎么看也不像有输赢的,2号种子似乎过关成功。\n \n

\n

\n \n 但另一室则出现了变数:\n \n

\n
\n
\n \n
\n
\n \n 东家叫3♣\n \n
\n
\n

\n \n 东西方是临时搭档的丹麦人舒尔茨和美国牌手韦兰肯,他们使用法兰纳雷约定叫,即开叫2♦表示5张以上♥+4张♠,开叫实力,所以韦兰肯6-4高花开叫2♥,舒尔茨的3♣不逼叫,但他忽视了同伴6-4的可能,3♣定约根本无法完成,最终以宕三收场,芬奇队依靠此牌死里逃生再过一关。\n \n

\n

\n \n 看来舒尔茨要好好学习连氏自然,把法兰纳雷约定叫运用得更流畅。\n \n

\n

\n \n 芬奇队下一轮的对手是由一位中国台北女牌手、三位新加坡牌手组成的阿曼达队,他们能够延续神奇之旅,还是亚太牌手更进一步,本文发出之际即将见分晓。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 进攻性叫牌与防守性叫牌——波兹南的牌局\n \n \n

\n

\n \n 相关链接:\n \n 技惊四座的Deep Finesse打法\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛第一阶段结束、弗姆队获得欧洲混团冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲混团赛场上一副牌的两次安全打法\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/HEupnXfrM99UVCW4V0pGWg", + "creator": "标兵桥牌", + "pubDate": "Thu, 03 Jul 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512665_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "d025249010f2c3c97cb73f1c5df5a217", + "highlights": [] + }, + { + "title": "进攻性叫牌与防守性叫牌——波兹南的牌局", + "description": "桥牌其实也一样,只不过桥牌的“进攻”和“防守”,有多重的意义,除了简单的在桥牌打法中表现为做庄与防守外,还有在叫牌中也分为自己抢过来打的“进攻性叫牌”和放给对方打或者叫得较低的“防守性叫牌”。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n NBA有句格言,叫做“赢球靠进攻、夺冠靠防守”,其实足球、橄榄球等等基本上都一样,防守虽然观赏性不强,但对于成功是非常有帮助的。\n \n

\n

\n \n 桥牌其实也一样,只不过桥牌的“进攻”和“防守”,有多重的意义,除了简单的在桥牌打法中表现为做庄与防守外,还有在叫牌中也分为自己抢过来打的“\n \n 进攻性叫牌\n \n ”和放给对方打或者叫得较低的\n \n “防守性叫牌”\n \n 。一般来说,实力强的一方,通常会选择进攻性叫牌,因为只有完成满贯和成局定约,才能获得更高的分数,但也有例外的时候,就是当对方持弱牌介入叫牌、意图干扰时,此时强牌一方就同时了有抢过来自己打的“进攻性叫牌”,和加倍对方或者叫的较低的“防守性叫牌”两个选择。\n \n

\n

\n \n 一般来说,牌手们都会“进攻性叫牌”,也就是高叫,但往往忽视“防守性叫牌”的得分能力,特别是在比分落后时,往往“进攻性叫牌”会越输越多,而“防守性叫牌”则是很好的追分办法。\n \n

\n

\n \n 6月30日结束的欧洲公开桥牌锦标赛公开团体赛首轮淘汰赛64进32的比赛中,罗森塔尔队就上演了依靠“防守性叫牌”翻盘的一场好戏。\n \n

\n

\n \n 4节的比赛打完3节,预赛第2的罗森塔尔队面对第44名的哥本哈根队,落后18IMP,14副牌的比赛虽说这个比分不算多,可是要想扳回也不容易。\n \n

\n

\n \n 来看这副牌:\n \n

\n
\n
\n \n
\n
\n \n 6♣还可以\n \n
\n
\n

\n \n 南北方是哥本哈根队的保尔森和尼尔森,东西方是罗森塔尔队的舒尔茨和韦兰肯,这副牌是第26副,整场比赛的倒数第3副,此时罗森塔尔队已慢慢将比分赶上,还有6分的差距。\n \n

\n

\n \n 西家开叫3♠,北家加倍,东家4♠,南家4NT显示两套牌,北家实力超强,5♠扣叫挺进满贯,他们达到6♣定约。\n \n

\n

\n \n 联手牌看起来还不错,只要♦A在西家,就有很大的机会完成定约,即使♦A在东家,也还有双张♦J、♥3-3等机会,综合看起来这个满贯还不错。\n \n

\n

\n \n 北家A吃进首攻,然后拔♣A,噩耗传来:\n \n

\n
\n
\n \n
\n
\n \n 将牌是5-0,完不成定约了\n \n
\n
\n

\n \n 将牌居然是5-0分布,看上去不错的满贯就此垮掉。\n \n

\n

\n \n 全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 东西可以做成4♠\n \n
\n
\n

\n \n 东西方可以做成4♠,南家第一次的判断非常正确,原本他只有5-4两套,而且在低花上只有2个点,计划防守是个合理的选择,因为这副牌在60桌上很多桌都是加倍东西方的4♠而做成,从这一点来说,南家的“进攻性叫牌”选对了。\n \n

\n

\n \n 不过,北家并不知道南家的牌如此不堪,他也选择了“进攻性叫牌”,如果南北方在对方阻击叫后因为存在分布的不理想而稍微保守一些,就会得到很好的收益。\n \n

\n

\n \n 在另一桌,轮到了东西方采取了“进攻性叫牌”:\n \n

\n
\n
\n \n
\n
\n \n 南北方选择加倍对方5♠\n \n
\n
\n

\n \n 西家在第三家的开叫非常进取,他一定是秉承“12张套一定要在4阶以上叫牌”的原则,北家当然加倍,东家进一步挺进5♠,南家布格兰德这牌无疑是“防守性”,所以他Pass静观其变,当巴克再次加倍时,布格兰德选择罚放,他们吃到了200分的正分。\n \n

\n

\n \n 这副牌就是典型的实力更强一方需要采取“防守性叫牌”的一例。这副牌罗森塔尔队赢9IMP,一举反先,最后2副牌都在加倍中度过,罗森塔尔队最后赢了18IMP,如果哥本哈根队的南北方停在5♣上并且做成,他们这副牌会赢得9IMP,总比分就会战成平手,那时,谁输谁赢就很难讲了。\n \n

\n

\n \n 可谓“会进攻是徒弟、会防守才是师傅”。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 技惊四座的Deep Finesse打法\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛第一阶段结束、弗姆队获得欧洲混团冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲混团赛场上一副牌的两次安全打法\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/MlG5afey3PhW8jkCKRLwNA", + "creator": "标兵桥牌", + "pubDate": "Wed, 02 Jul 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512660_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "8cf9f3254a25c91aade7bc229bc8c13b", + "highlights": [] + }, + { + "title": "技惊四座的Deep Finesse打法", + "description": "欧洲桥牌团体锦标赛公开团体赛在波兰波兹南激战正酣,目前还在预赛阶段,在预赛第7轮的比赛中,我们看到了一副技惊四座的深飞打法,这是罗森塔尔队与齐默尔曼队之间发生的,主打人是挪威明星布格兰德,防守方则是卡酷司机与卡利塔。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 欧洲桥牌团体锦标赛公开团体赛在波兰波兹南激战正酣,目前还在预赛阶段,在预赛第7轮的比赛中,我们看到了一副技惊四座的深飞(Deep Finesse)打法,这是罗森塔尔队与齐默尔曼队之间发生的,主打人是挪威明星布格兰德,防守方则是卡酷司机与卡利塔。\n \n

\n
\n
\n \n
\n
\n \n 南家主打5♦,首攻将牌如何做庄?\n \n
\n
\n

\n \n 叫牌过程显示了不同寻常的进取。北家巴克开叫2♣强牌,南家布格兰德一个点都没有,2♦等待,此时3♠是4张♠+5张以上♦的进局逼叫,布格兰德虽然白皮,但他有3张♦,直叫5♦,因为他不能叫4♦,这会显示更强的牌。\n \n

\n

\n \n 西家是卡酷司机,首攻将牌,如果你是布格兰德,如何计划这副牌的主打?\n \n

\n

\n \n 将牌首攻十分刁钻,即使将牌对你的分布友好,你也面临如何解决♠输张的问题,♥的输张跑不掉,必须把♠输张限制在1个,而且还不能输将牌。\n \n

\n

\n \n 假如将牌是2-2,你无法从手中向着明手的♠出,那么你怎么限制♠的输墩呢,如果第一墩明手将牌吃住,拔♠A再送♠,对方一定是第二张将牌,那么恐怕你只能希望♠是KQ双张或者KQx了。\n \n

\n

\n \n 所以一定要从手中出♠,明手的♠结构非常奇妙,如果从手中出,你总有很多机会来解决问题。\n \n

\n

\n \n 布格兰德就是这样考虑的,他必须回到手中出♠,以解决♠的输张问题,所以即使卡酷司机首攻将牌,他也决定打卡酷司机有将牌Q,因为他必须第一张牌就进手。当♦10吃进后,布格兰德出♠,卡酷司机顶上K,你现在准备怎么打?\n \n

\n

\n \n 你不能再到手中出♠了,所以这张♠一定要打对,如果你不吃,第二张将牌从西家发出,你就只剩下♠KQx的机会了。\n \n

\n
\n
\n \n
\n
\n \n ♠的打法决定定约的成败\n \n
\n
\n

\n \n 不管桥友们怎么想,只见布格兰德A吃住♠K,然后从明手送♠J,西家Q吃住,第二张将牌到明手,布格兰德再出小♠,将下东家的10,完成定约!!\n \n

\n
\n
\n \n
\n
\n \n 送♠J给西家,然后将吃3张10\n \n
\n
\n

\n \n 全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 布格兰德一张不差打成定约\n \n
\n
\n

\n \n 这副牌如果不首攻将牌,庄家完成定约不难,他只需找到♦Q即可,因为可以将吃两次♠,有些牌桌是北家主打5♦,东首攻♥K,然后看到庄家送♠,再从东家吊将牌,不仅没用,而且还出卖了同伴的将牌Q。\n \n

\n

\n \n 但南家主打,几乎无人成功,特别是首攻将牌的情况下,南家主打首攻将牌的还有意大利明星韦尔萨切。\n \n

\n
\n

\n \n 这副牌另一室的巴司机和舒柏林搞错了约定,叫到4♠定约,也算是奇葩一件。\n \n

\n
\n
\n \n
\n
\n \n 巴司机舒柏林搞错了约定\n \n
\n
\n

\n \n 布格兰德这副牌的主打,丝丝入扣,每一张牌都如双明手分析软件指引一般,张张不错,令人佩服,相信这副牌也一定能够登上公报,并且在未来的年度最佳做庄奖的评选中占有一席之地。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛第一阶段结束、弗姆队获得欧洲混团冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲混团赛场上一副牌的两次安全打法\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/v1PcmPbdlPEcc8B5sGL_fA", + "creator": "标兵桥牌", + "pubDate": "Tue, 01 Jul 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512654_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "97bf92eabb331dfd5a9793e814e4cbc7", + "highlights": [] + }, + { + "title": "欧洲公开桥牌锦标赛第一阶段结束、弗姆队获得欧洲混团冠军", + "description": "6月27日,正在波兰波兹南进行的第11届欧洲公开桥牌锦标赛第一阶段比赛结束,弗姆队获得混合团体冠军,11Jaszczak队获得老年团体冠军,埃德蒙斯队获得混合一副一比团体冠军,Narkiewicz/Czajka获得混合双人赛冠军。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 6月27日,正在波兰波兹南进行的第11届欧洲公开桥牌锦标赛第一阶段比赛结束,弗姆队(Ferm)获得混合团体冠军,11Jaszczak队获得老年团体冠军,埃德蒙斯队(Edmonds)获得混合一副一比团体冠军,Narkiewicz/Czajka获得混合双人赛冠军。\n \n

\n
\n
\n \n
\n
\n \n Ferm队获得混合团体赛冠军\n \n
\n
\n
\n
\n \n
\n
\n \n 老年团体赛前三名\n \n
\n
\n

\n \n 欧洲公开桥牌锦标赛混合团体赛共有94队参加,10轮瑞士移位赛过后,前32强进入淘汰赛,淘汰赛每天一轮,每轮56副牌分4节进行,经过5天的争夺,2022年世界桥牌综合锦标赛混合团体赛巴厘杯冠军弗姆队决赛战胜阿什队(Ashe)夺得冠军。\n \n

\n

\n \n 弗姆队由美国客户老太太弗姆组建,核心成员是来自瑞士的巴司机和舒柏林,还有丹麦美女马德森,3年前他们在波兰夺得世界冠军,如今再返波兰又夺欧洲冠军,看起来波兰是老太太的福地。与3年前的阵容相比,弗姆队更换了一对牌手,由瑞典美女格隆奎斯特和意大利的曼诺,替换了德国名将阿尼姆与荷兰的魏斯,显然更年轻的情侣表现更好,半决赛他们击败了阿尼姆与魏斯的Yoshka队,整个比赛格隆奎斯特/曼诺的表现都很抢眼,冠军实至名归。\n \n

\n
\n
\n \n
\n
\n \n Ferm队的情侣组合半决赛战胜他们的前任\n \n
\n
\n

\n \n 从6月28日开始,欧公赛进入第二阶段,重头戏公开团体赛开赛,目前共有123个队报名,超过了2017年意大利蒙特卡蒂尼121个队,也超过了2011年在波兹南的第5届120个队,成为此项比赛参赛队数最多的一次。比赛先进行3天15轮的瑞士移位赛,前32队进入淘汰赛,淘汰赛每天一场,7月5日结束。\n \n

\n

\n \n 公开团体赛才是真正的重头戏,欧洲强队以及当打知名牌手均出场亮相,这是百慕大杯赛前一次非常好的热身和预演,对于中国队的备战也很重要。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲混团赛场上一副牌的两次安全打法\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/EaSBtOh1aMr3oPsaJMlDHw", + "creator": "标兵桥牌", + "pubDate": "Sat, 28 Jun 2025 12:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512647_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "8b7e76707b846119bb7a39057abcdd4f", + "highlights": [] + }, + { + "title": "欧洲混团赛场上一副牌的两次安全打法", + "description": "桥牌赛场上,打牌是永恒的主题,只有打牌功夫过硬,才有立足于桥牌竞技中不被淘汰的资本。正在波兰波兹南进行的第11届欧洲桥牌公开锦标赛混合团体赛赛场上,不乏精彩之作,但也有令人遗憾的牌局。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 桥牌赛场上,打牌是永恒的主题,只有打牌功夫过硬,才有立足于桥牌竞技中不被淘汰的资本。\n \n

\n

\n \n 正在波兰波兹南进行的第11届欧洲桥牌公开锦标赛混合团体赛赛场上,不乏精彩之作,但也有令人遗憾的牌局。\n \n

\n

\n \n 下面这副牌发生在首轮淘汰赛中,南家是来自拉脱维亚的女牌手罗曼诺夫斯卡,她面临下面这副6♣的主打:\n \n

\n
\n
\n \n
\n
\n \n 如何主打6♣\n \n
\n
\n

\n \n 南家主打6♣,东西方没有叫牌,首攻是♠3,如何计划主打?\n \n

\n

\n \n 看上去这副牌似乎丢了大满贯,将牌如果不输,♥是3-2分布的话,就有13墩了,即使西家有4张将牌,也完全有机会做成大满贯。\n \n

\n

\n \n 不过现在不是考虑是否丢大满贯的时候,而是要把现在的小满贯做成。南家A吃住首攻,拔将牌A,打将牌到Q,西家只有1张将牌,然后出将牌到A,现在拔♥A,西家跟小,东家跟Q,现在如何继续?\n \n

\n
\n
\n \n
\n
\n \n 拔♥对方掉出Q\n \n
\n
\n

\n \n 现在要计算一下赢墩的情况,记住,不是打大满贯,你需要的不是13墩而是12墩。\n \n

\n

\n \n 有6墩将牌,还有两个高花A,拿到4墩♥就可以,你并不需要5墩♥,也就是说,你现在不需要♥3-2,而是要防止4-1如何做成,假设如果东家是单张♥Q,你继续拔♥K,就会发现手中缺少桥路,无法建立♥了,所以你怎么办呢?\n \n

\n

\n \n 你是不是后悔拔♥A了?没错,要防止♥的4-1分布,最好的打法是吊完将牌后,联手送小♥,因为你手中只有一张将牌是进手了,所以在♥4-1的时候,必须保留♥本身的桥路,而防守方也无法用♦逼你将吃来用掉你的将牌桥路。\n \n

\n

\n \n 实战中,南家罗曼诺夫斯卡没有注意桥路的问题,她简单打♥3-2,继续拔♥K,全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 拔♥K定约就做不成了\n \n
\n
\n

\n \n ♥4-1的,6♣再也无法打成。\n \n

\n

\n \n 虽然南家忽视了♥上联手送小,保持桥路的打法,但在拔出♥Q后,仍然有机会完成定约,她应该送小♥,如果原本就是3-2的,♥已经建立,如果是4-1的,西家最顽强的防守是让掉这墩♥,让明手大,但由于♦K在东家,庄家还能打成定约。\n \n

\n

\n \n 庄家错过了第一个安全打法后,及时补救,依靠将吃飞♦K仍然能让定约回家:\n \n

\n
\n
\n \n
\n
\n \n 送小♥还有机会打成\n \n
\n
\n

\n \n 我们此前经常说:安全打法要像呼吸一样伴随在身。而安全打法的熟练程度,也是基本功之一。在同一副牌中能够出现两次安全打法,错过第一次还有第二次机会弥补,也是难得而珍贵的牌局之一。\n \n

\n
\n

\n \n 另外,再提一个话题,就是关于满贯定约的首攻。满贯定约(此处特指小满贯)不同于成局定约,对方叫到满贯,通常不差赢墩,所以满贯定约最好的首攻是积极首攻而非消极首攻,希望在对方脱手时建立自己的防守赢墩。这副牌就是一个很好的例子,首攻♠打掉了庄家一个桥,是给庄家制造最大困难的首攻,而如果不首攻♠,就会像另外一桌,让对方打成大满贯。\n \n

\n

\n \n 另一桌南北方奥肯和韦兰德叫到了大满贯,在常规的将牌首攻后,有足够的桥路建立♥,并且将吃飞♦拿到13墩。\n \n

\n

\n \n \n 如果你担心小满贯不好打,请叫大满贯!\n \n \n

\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 第11届欧洲公开桥牌锦标赛混团预赛结束\n \n \n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/hs5rc1xmnOHOS65BEAotew", + "creator": "标兵桥牌", + "pubDate": "Thu, 26 Jun 2025 23:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512642_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "ed1d317745b122353f0e669c44fe631f", + "highlights": [] + }, + { + "title": "第11届欧洲公开桥牌锦标赛混团预赛结束", + "description": "欧洲桥牌公开锦标赛每两年举办一次,从2003年到2019年共举办了9届,但由于疫情原因2021年中断,2023年再度恢复,今年是第11届比赛,本次比赛将于6月21日-7月5日在波兰波茨南举办,波茨南曾经于2011年举办过欧洲桥牌公开锦标赛。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 6月22日,在波兰波兹南进行的第11届欧洲公开桥牌锦标赛混合团体赛预赛结束,共有94个队参加了混合团体赛的预赛,预赛进行10轮瑞士移位赛,前32名进入淘汰赛。\n \n

\n
\n
\n \n
\n
\n \n 混团32强淘汰赛对阵\n \n
\n
\n

\n \n 10轮结束后,以波兰职业高手率领的埃德蒙斯队获得第一名,波兰/法国牌手组成的SZPILIKA队获得第二名。有趣而遗憾的是,由美国年轻牌手组成的蜜月队在转播桌坐了6轮,第一天结束还是第一名,第二天最后四场全负,最终没能晋级,他们后面有时间继续蜜月之旅了。\n \n

\n

\n \n 淘汰赛每轮进行一天,一共5天结束。\n \n

\n

\n \n 下面是比赛中的一些图片。\n \n

\n
\n
\n \n
\n
\n \n 混团比赛赛场\n \n
\n
\n
\n
\n \n
\n
\n \n 欧洲比赛使用平板叫牌,纸牌打牌,每个牌桌有摄像头,所有的记录都存在\n \n
\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 第11届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/9XZTqX8gjcy09YAq4dCbnQ", + "creator": "标兵桥牌", + "pubDate": "Mon, 23 Jun 2025 23:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512636_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "926d81696677395d95a23772a9ea152c", + "highlights": [] + }, + { + "title": "第11届欧洲桥牌公开锦标赛", + "description": "欧洲桥牌公开锦标赛每两年举办一次,从2003年到2019年共举办了9届,但由于疫情原因2021年中断,2023年再度恢复,今年是第11届比赛,本次比赛将于6月21日-7月5日在波兰波茨南举办,波茨南曾经于2011年举办过欧洲桥牌公开锦标赛。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 始于2003年的欧洲桥牌公开锦标赛(11th European Transnational Championships)是欧洲桥联主办的跨国公开性赛事,包涵了公开、女子、老年、混合四个组别的团体赛和双人赛,是对标世界桥牌综合锦标赛的一项大赛,我国的全国桥牌锦标赛和全国桥牌综合锦标赛也属于这类赛事。虽说名称为欧洲桥牌公开赛,但参赛对象可以是世界各地的桥牌爱好者和专业牌手。\n \n

\n
\n
\n \n
\n
\n \n 欧洲桥牌公开锦标赛在波兰波兹南举办\n \n
\n
\n

\n \n 欧洲桥牌公开锦标赛每两年举办一次,从2003年到2019年共举办了9届,但由于疫情原因2021年中断,2023年再度恢复,今年是第11届比赛,本次比赛将于6月21日-7月5日在波兰波茨南举办,波茨南曾经于2011年举办过第5届欧洲桥牌公开锦标赛。\n \n

\n

\n \n 本次比赛从报名参加的情况来看,全面超过2023年的上一届比赛,考虑到波兰还处于距离战争较近的地区,这个数据已经相当不错。截止到6月18日开赛前3天,参加公开团体赛的有116个队,大幅超过上届的87队,略多于与我国4月结束的全国桥牌锦标赛公开团体赛100个队,但还不及2019年在伊斯坦布尔的122队;女子团体赛20个队,超过上届15队,比全锦赛女子团体赛28队少;老年团体赛21队,超过上届16队,远远不及全锦赛47队;混合团体赛96队,大幅超过上届的69队,基本与全锦赛混团赛的99队接近;公开双人赛172对,超过上届121对,比全锦赛公开双人赛的193对少21对;女子双人赛23对,不如上届的29对,比全锦赛女子双人赛的49对少了一半以上;老年双人赛52对,上届36对;混合双人赛139对,上届113对,接近全锦赛混双的137对。\n \n

\n

\n \n 欧洲公开赛以混合团体赛和公开团体赛为头尾,两项比赛分别是2天预赛和3天预赛,淘汰赛均为5天,先进行混团、后进行公团。期间穿插女团、老年团体和双人赛。\n \n

\n
\n
\n \n
\n
\n \n 比赛场馆外景\n \n
\n
\n

\n \n 由于本次比赛适逢国内全运会桥牌预赛,因此没有国内团队前往波兰参赛。\n \n

\n

\n \n 所有比赛全程在BBO进行转播,比赛从北京时间每天下午4点开始,至午夜结束。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 2023年欧洲公开桥牌锦标赛每日一牌——韦尔萨切的失误,还是对手的高明?\n \n \n

\n

\n \n 相关链接:\n \n 第10届欧洲桥牌公开锦标赛\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛结束\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开赛结束、土耳其人获得公开双人赛冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季运动会结束,奥卡队获得冠军\n \n \n

\n

\n \n 相关链接:\n \n 欧洲冬季桥牌运动会开赛在即\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 2022年欧洲桥牌团体锦标赛即将开赛\n \n \n

\n
\n
\n
\n
\n

\n \n \n 荷兰加冕欧洲之王\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/4UEOFqcgA5tbMw2LeQEk7g", + "creator": "标兵桥牌", + "pubDate": "Sat, 21 Jun 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDQoJpic0ibsIxaF7GAQVwVTT6eGyFJ2u6u8uRPPuRgRemxz9bYpyyQ9DDobFOOPU8ndsqr7ibKoF7EOQ/0?wx_fmt=jpeg", + "id": "2247512631_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "42be146c34516610da8d260cffeec8fb", + "highlights": [] + }, + { + "title": "世界桥联公布2024年大师分排行榜", + "description": "2024年底,世界桥联公布了世界桥牌运动会结束后世界桥联大师分的排行榜。牌坛奇人齐老板仍然领跑公开组,这已经是他自从2021年登顶之后,连续第四年蝉联世界桥联大师分第一人的宝座了。女子排行榜、老年排行榜、混合排行榜的榜首也各有其主。", + "content": "
\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 2024年底,世界桥联公布了世界桥牌运动会结束后世界桥联大师分的排行榜。\n \n

\n

\n \n 牌坛奇人齐老板仍然领跑公开组,这已经是他自从2021年登顶之后,连续第四年蝉联世界桥联大师分第一人的宝座了。女子大师分排行榜、老年大师分排行榜、混合大师分排行榜的榜首,分别是瑞典、丹麦、法国牌手。\n \n

\n

\n \n 下面是公开组前40名牌手的排名:\n \n

\n
\n
\n \n
\n
\n \n 2024年世界桥联公开组大师分排行榜\n \n
\n
\n

\n \n 我们能够看到,排在前六名的是齐刷刷的瑞士队牌手,其中齐老板高居第一,超过了第二名卡酷司机近500分,相当于一个世界季军的名次差距。最晚加入瑞士队的诺沃萨德茨基分数最低,但也比第7名的海尔格莫多了100多分。\n \n

\n

\n \n 瑞士大鳄从2021年开始在世界牌坛的兴风作浪,先后拿到了2022年、2023年百慕大杯冠军,2024年世界桥牌运动会季军,年年登上世界锦标赛的领奖台,大师分增值无人能比。\n \n

\n

\n \n 瑞士队之后的排名相对分散,原因是这些牌手无法在世界比赛中集中火力,形成统一团队竞争。\n \n

\n

\n \n 其中小海借助早年在摩纳哥队的成绩,加上近年代表挪威,还有去年世界桥牌运动会跨国团体赛的冠军,得以领跑除瑞士团队的世界牌手。\n \n

\n

\n \n 小海之下,是波兰队的新科世界冠军布雷茨排在第8名,布雷茨在阿根廷拿到了世界桥牌运动会冠军后,加上他2019年百慕大杯冠军、2022年世界桥牌双人赛冠军,他已经成为波兰唯一的大三冠成员,波兰牌手即使强如加夫雷西、卡利塔、卡酷司机,也没有拿到3种世界冠军的牌手。\n \n

\n

\n \n 再往下排名,是第9名和第12名意大利的韦尔萨切与塞门塔。自从劳爷退休后,“小沃”的发小塞门塔成为他的新搭档,两人很快进入状态,成为意大利队的新台柱,先后拿下2023年百慕大杯季军和2024年世界桥牌运动会亚军,也在世界桥联世界桥牌巡回赛的积分榜上连续两年排名第一。\n \n

\n

\n \n 插在两位意大利牌手中间的是荷兰明星穆勒和魏斯,他们虽然从2024年开始退出了荷兰国家队,但凭借2019年、2022年百慕大杯的亚军、2022年欧锦赛冠军等成绩,仍然领跑荷兰牌手。不过老穆勒与魏斯的状态从2023年开始急剧下滑,已有逐步退出世界级牌手的趋势,最近他们参加了中国的A类俱乐部联赛。\n \n

\n

\n \n 美国的莫斯排在12名,超过了14名和15名的尼老板与搭档凯茨,波兰老将加夫雷西退出瑞士队后,仍然依靠此前的积累,排在第13名。\n \n

\n

\n \n 新西兰的威布利(Michael Whibley)占据了第一页的位置,他排在第17名,是亚太地区排名最高的牌手,得益于新西兰最近不错的成绩,以及去年世界桥牌运动会跨国团体赛的亚军。\n \n

\n

\n \n 在第一页位置的,多数是2024年世界桥牌运动会成绩不错的牌手。\n \n

\n

\n \n 中国牌手排名最高的是现役国家队队员连勇,他以971.75分排在第81名,刚好超过劳爷1.05分。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 世界桥联大师分排行榜齐老板遥遥领先\n \n \n

\n

\n \n 相关链接:\n \n 世界桥联公报最新大师分、齐老板坐稳世界第一\n \n \n

\n

\n \n 相关链接:\n \n 世界桥联最新大师分排行榜、摩纳哥众将排名靠前\n \n \n

\n

\n \n 相关链接:\n \n 世界桥联公布最新大师分、Helgemo登顶世界第一人\n \n \n

\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 世界桥联大师分介绍及排行榜解读\n \n \n

\n
\n
\n
\n
\n

\n \n \n 世界桥联大师分介绍及排行榜解读(二)男子特级大师排行榜解读\n \n \n

\n
\n
\n
\n
\n

\n \n \n 世界桥联大师分介绍及排行榜解读(三)世界桥联女子及中国牌手排行榜\n \n \n

\n
\n
\n
\n
\n

\n \n \n 世界桥联大师分介绍及排行榜解读(四)世界桥联大师分政策和等级制度的变迁对中国牌手的影响\n \n \n

\n
\n
\n
\n
\n

\n \n \n 一览众山小——齐老板登顶世界第一之路\n \n \n

\n
\n
\n
\n
\n

\n \n \n 一览众山小——齐老板登顶世界第一之路(二)\n \n \n

\n
\n
\n
\n
\n

\n \n \n 一览众山小——齐老板登顶世界第一之路 (续完)\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/i8ozGVJzORLNLKLSgY9RYg", + "creator": "标兵桥牌", + "pubDate": "Mon, 16 Jun 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDSibjfuNWY4LAB2pN77qbPPaynicibuLW2nEp8bqVrvuouOCgYlbWfciaLXGkM5VzZpZdpb8Z3HAAS28A/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDSibjfuNWY4LAB2pN77qbPPaynicibuLW2nEp8bqVrvuouOCgYlbWfciaLXGkM5VzZpZdpb8Z3HAAS28A/0?wx_fmt=jpeg", + "id": "2247512614_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "d493b9eff95dc7208df749197028ae29", + "highlights": [] + }, + { + "title": "2025年北欧桥牌锦标赛结束", + "description": "6月5-8日,2025年北欧桥牌锦标赛(The Nordic Championship)在冰岛小镇Laugravatn举行。瑞典、芬兰、挪威、法罗群岛、丹麦、冰岛这6家北欧桥联的成员参加了比赛。丹麦获得公开团体冠军,挪威获得女子团体冠军。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 6月5-8日,2025年北欧桥牌锦标赛(The Nordic Championship)在冰岛小镇Laugravatn举行。瑞典、芬兰、挪威、法罗群岛、丹麦、冰岛这6家北欧桥联的成员参加了比赛。\n \n

\n
\n
\n \n
\n
\n \n 谁能说出北欧六国国旗对应的国家\n \n
\n
\n

\n \n 比赛分为公开团体和女子团体两个项目,由于今年世界桥牌团体锦标赛在丹麦举行,北欧六国中瑞典、挪威、丹麦均获得了参加世锦赛的资格,这次比赛也是他们世锦赛前非常好的练兵机会。\n \n

\n

\n \n 经过4天比赛,丹麦获得公开团体冠军,挪威、瑞典分获二、三名。挪威获得女子团体冠军,丹麦、瑞典分获二、三名。获得两项团体赛前三名的恰好均是参加世锦赛的代表,这也恰如其分地说明了他们在北欧桥牌中的地位。\n \n

\n

\n \n 本次比赛中,丹麦男女队派出的选手基本上是参加世锦赛的队员,挪威女队派出了参加威尼斯杯的队员,挪威男队有一对牌手是参加百慕大杯的队员,对即将参加世锦赛的中国国家队而言,研究和观察他们的比赛,也是赛前备战的内容之一。\n \n

\n

\n \n 从6月开始,欧洲以及北美包括网络上将陆续进行一系列的重要比赛,欧美列强将参加这些比赛进行世锦赛前热身,这也是中国国家队研究对手的良好机会。\n \n

\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 2025年欧洲小联赛布加勒斯特完赛\n \n \n

\n

\n \n 相关链接:\n \n 叫牌用平板、打牌用纸牌——2022年欧洲小联盟赛结束\n \n \n

\n

\n \n 相关链接:\n \n 劳伦特当选欧洲桥联主席、期待开启新时代\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 罗纳时代结束——世界桥联主席换届\n \n \n

\n

\n \n 相关链接:\n \n 欧洲桥牌新纪元——欧洲桥牌团体锦标赛回顾\n \n \n

\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/4FObKuBiU2eBA8lw2Zy-3w", + "creator": "标兵桥牌", + "pubDate": "Tue, 10 Jun 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDRYno20Pe5bW627sL0rMdJqVCibbphJ8abNtTPtwf2CxWwiaouKfUbnD60ASZT2oDDUNicJDPRzvySPg/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDRYno20Pe5bW627sL0rMdJqVCibbphJ8abNtTPtwf2CxWwiaouKfUbnD60ASZT2oDDUNicJDPRzvySPg/0?wx_fmt=jpeg", + "id": "2247512609_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "6e60cc8d1cf3de1b74a9ea47f0bffcc4", + "highlights": [] + }, + { + "title": "美国国家队名单出炉", + "description": "5月26日当地时间,美国国家队选拔赛老年团体赛2025年6月1日,美国桥牌协会(USBF)公布了参加2025年世界桥牌团体锦标赛的8支美国队参赛名单。由于美国选拔赛允许一名选手报名多项比赛,因此在选拔赛全部结束后,各个美国国家队进行了调整。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 2025年6月1日,美国桥牌协会(USBF)公布了参加2025年世界桥牌团体锦标赛的8支美国队参赛名单。\n \n

\n

\n \n 美国国家队选拔赛从4月24日开始,先后经历了公开团体、女子团体、混合团体、老年团体四个项目的选拔赛,产生了每个项目2支,共8支美国队。由于美国选拔赛允许一名选手报名多项比赛,因此在所选拔出来的原始团队中有需要更换队员和增加队员的。在选拔赛全部结束后,进行了调整。\n \n

\n

\n \n 根据美国国家队选拔规则,每名队员可以报名参加多个项目,但必须提前告知所参加项目的优先顺序,比如某位队员同时报名公开团体和混合团体项目,他需要选择哪一个项目是第一顺位,如果选择混合团体是第一顺位,则在公开团体入选后,仍然可以参加混合团体的选拔,如果混合团体选中,则必须代表混合团体放弃公开团体,如果混合团体没有选中,则可以代表公开团体。如果选择公开团体是第一顺位,在公开团体选中后,就不需要参加混合团体的选拔了。\n \n

\n

\n \n 这种现象,在公开团体选拔结束后,发生在了美国2队罗森塔尔队中,他们队中的大部分牌手都同时报名了公开团体和混合团体,优先顺序是公开团体,在入选公开团体美国2队后,该队队员都不再参加混合团体的选拔了。\n \n

\n
\n

\n \n 下面是美国国家队的全部名单:\n \n

\n

\n \n Bermuda Bowl (Open teams):\n \n

\n

\n \n \n USA1\n \n \n
\n \n Adam Kaplan - Finn Kolesnik\n \n
\n \n Adam Grossack - Eddie Wold\n \n
\n \n Kevin Bathurst* - John Hurd\n \n
\n \n NPC:Bob Morris\n \n

\n

\n \n \n 由于美国1队是4人队入选,其中Bathurst/Hurd是他们增加的队员。\n \n \n

\n

\n \n \n USA2\n \n \n
\n \n Andrew Rosenthal - Aaron Silverstein\n \n
\n \n Eldad Ginossar - Chris Wilenken\n \n
\n \n Zach Grossack - Michael Rosenberg\n \n
\n \n NPC:Rob Barrington\n \n

\n

\n \n Venice Cup (Women's Teams):\n \n

\n

\n \n \n USA1\n \n \n
\n \n Lynn Baker - Olivia Schireson\n \n
\n \n Amber Lin - Debbie Rosenberg\n \n
\n \n Emma Kolesnik* - JoAnna Stansby*\n \n
\n \n NPC:Joe Stokes\n \n

\n

\n \n \n 威尼斯杯美国1队入选的队员还有瑞典Rimstedt姐妹,但她们的第一优先权是混合团体,同时又入选了混合团体美国2队,所以威尼斯杯美国1队增加了Kolesnik/Stansby一对。\n \n \n

\n

\n \n \n USA2\n \n \n
\n \n Susan Zhang - Sylvia Shi\n \n
\n \n Jill Meyers - Kerri Sanborn\n \n
\n \n Janice Molson - Migry Campanile*\n \n
\n \n NPC:Josh Donn\n \n

\n

\n \n \n 同样原因,苏珊·张的团队中Jenny Wolpert同时入选了混合团体美国1队,因此苏珊·张队增加了Campanile作为新队员。\n \n \n

\n

\n \n Wuhan Cup (Mixed Teams)\n \n

\n

\n \n \n USA1\n \n \n
\n \n Stewart Rubenstein - Anam Tebha\n \n
\n \n Giorgia Botta - John Kranyak\n \n
\n \n Vince Demuy - Jenny Wolpert\n \n
\n \n NPC: Harrison Luba\n \n

\n

\n \n \n USA2\n \n \n
\n \n Joan Millens - Shan Huang\n \n
\n \n Cecilia Dwyer Rimstedt - Kevin Dwyer Rimstedt\n \n
\n \n Sandra Rimstedt - Joe Grue*\n \n
\n \n NPC: Alex Hudson\n \n

\n

\n \n \n 混合团体美国2队是5人队参赛,增加了Joe Grue作为新队员。\n \n \n

\n

\n \n D'Orsi Senior Trophy (Senior Teams)\n \n

\n

\n \n \n USA1\n \n \n
\n \n Jeff Wolfson - Steve Garner\n \n
\n \n David Berkowitz - Larry Cohen\n \n
\n \n Michael Kamil - Jeff Meckstroth\n \n
\n \n NPC: Jan Martel\n \n

\n

\n \n \n USA2\n \n \n
\n \n Hemant Lall - Reese Milner\n \n
\n \n Bobby Levin - Eric Rodwell\n \n
\n \n Zia Mahmood - Alan Sontag*\n \n
\n \n NPC: Phil Clayton\n \n

\n

\n \n \n 老年团体美国2队更换了一位队员,Alan Sontag替换了Sam Lev。\n \n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n \n

\n

\n \n 相关链接:\n \n 美国老年队选拔赛结束\n \n \n

\n

\n \n 相关链接:\n \n 美国混团选拔赛结束\n \n \n

\n

\n \n 相关链接:\n \n 美国混团选拔赛第一轮淘汰赛结束\n \n \n

\n

\n \n 相关链接:\n \n 公开组美国2队与美国女队产生\n \n \n

\n

\n \n 相关链接:\n \n 美国国家队选拔赛战况及每日一牌——走过路过不要错过3NT\n \n \n

\n

\n \n 相关链接:\n \n 美国国家队选拔赛战况及每日一牌——及时转舵、躲开障眼法\n \n \n

\n

\n \n 相关链接:\n \n 美国国家队选拔赛战况及每日一牌——魏因斯坦的狡诈\n \n \n

\n

\n \n 相关链接:\n \n 小虎队直扑日德兰——卡普兰队获得美国1队资格\n \n \n

\n

\n \n 相关链接:\n \n 转载:通往努沙杜瓦——如风少年冲向巴厘岛——记Kranyak队获得美国1队资格\n \n \n

\n

\n \n 相关链接:\n \n 美国国家队选拔赛战况及每日一牌——老麦与小芬传统与现代的差别\n \n \n

\n

\n \n 相关链接:\n \n 美国国家队选拔赛战况及每日一牌——弗老板失去平衡\n \n \n

\n

\n \n \n 相关链接:\n \n 2025年美国国家队选拔赛战况及每日一牌——时机和控制\n \n \n \n

\n

\n \n \n 相关链接:\n \n 2025年美国国家队选拔赛战况及每日一牌——当老麦遇上老罗\n \n \n \n

\n

\n \n \n 相关链接:\n \n 2025年美国国家队选拔赛战况及每日一牌——小罗森博格的诈叫\n \n \n \n

\n

\n \n \n 相关链接:\n \n 2025年美国国家队选拔赛战况及每日一牌——致命的猜断\n \n \n \n

\n

\n \n \n 相关链接:\n \n 2025年美国国家队选拔赛战况及每日一牌——正常开叫还是阻击开叫\n \n \n \n

\n

\n \n \n 相关链接:\n \n 2025年美国国家队选拔赛\n \n \n \n

\n

\n \n \n 相关链接:\n \n 老罗重回世锦赛——美国老年队、女队选拔赛结束\n \n \n \n

\n

\n \n \n 相关链接:\n \n 美国混团选拔赛结束,苏珊·张队赢得资格\n \n \n \n

\n

\n \n 相关链接:\n \n 弗雷舍获得2024年美国队资格\n \n \n

\n

\n \n 相关链接:\n \n 2024年美国国家队选拔赛开赛\n \n \n

\n

\n \n \n 相关链接:\n \n 2023年美国国家队选拔赛争议中结束\n \n \n \n

\n

\n \n \n 相关链接:\n \n 2022年美国国家队选拔赛结束\n \n \n \n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 尼克尔队率先拿到百慕大杯美国1队资格\n \n \n

\n
\n
\n
\n
\n

\n \n \n 平板电脑还是纸牌?职业牌手有分歧\n \n \n

\n
\n
\n
\n
\n

\n \n \n 通往武汉之路:美国国家队选拔赛\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/GhzYkoR_DU1jwpJEaWo7yQ", + "creator": "标兵桥牌", + "pubDate": "Sun, 08 Jun 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDR7X9icVUiczjyqmaA8vgG0PGfZLhCfDludjw1D8I8qm28RhEg2ibgWIey41EY5icTic2IQboZhr6qqf3A/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDR7X9icVUiczjyqmaA8vgG0PGfZLhCfDludjw1D8I8qm28RhEg2ibgWIey41EY5icTic2IQboZhr6qqf3A/0?wx_fmt=jpeg", + "id": "2247512604_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "904cfda1cd5a396451f15015355b3b1e", + "highlights": [] + }, + { + "title": "最后一张世锦赛门票发出,全华班加拿大女队艰难获得", + "description": "北京时间6月2日上午,加拿大与墨西哥女队的附加赛结束,全华班加拿大女队以202:167IMP战胜对手拿到前往丹麦参加世界桥牌团体锦标赛的最后一张门票。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n
\n \n \n 老朋友\n \n \n
\n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 北京时间6月2日上午,加拿大与墨西哥女队的附加赛结束,全华班加拿大女队以202:167IMP战胜对手拿到前往丹麦参加世界桥牌团体锦标赛的最后一张门票。\n \n

\n
\n
\n \n
\n
\n \n 加拿大女队获得威尼斯杯资格\n \n
\n
\n

\n \n 加拿大与墨西哥同属世界桥联第2区,与美国一个区,该区有3个参加世锦赛的名额,其中美国独占两个资格,余下该区的加拿大、墨西哥争夺另一个名额。在大部分的情况下,墨西哥是不参与竞争世锦赛资格的,因此我们在世界桥牌团体锦标赛上看到的基本上都是加拿大的身影,本次世锦赛资格赛也是一样,公团、混团、老团的资格均由加拿大获得,入选加拿大国家队,就相当于直接进入了世锦赛。\n \n

\n

\n \n 不过今年有点特殊情况,墨西哥宣布要参加女子团体赛的争夺,因此在加拿大女队选拔赛结束后,还要与墨西哥打附加赛。这比赛的时间定在了5月31日,此时所有地区的选拔赛均已结束,只剩下女子团体威尼斯杯这最后一个资格了。\n \n

\n

\n \n 与墨西哥的比赛进行的十分艰苦,8节比赛打完前7节,比分始终胶着,最后的决胜节前,加拿大女队还落后3分,决胜节的发挥堪称完美,大胜对手拿到了通往丹麦的门票。\n \n

\n

\n \n 加拿大女队全部由活跃在北美地区的华人组成,她们热爱桥牌,能够参加世锦赛威尼斯杯是她们的梦想,预祝她们丹麦的圆梦之旅顺利。\n \n

\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n \n 相关链接:\n \n 2025年美国国家队选拔赛\n \n \n \n

\n

\n \n \n 相关链接:\n \n 老罗重回世锦赛——美国老年队、女队选拔赛结束\n \n \n \n

\n

\n \n \n 相关链接:\n \n 美国混团选拔赛结束,苏珊·张队赢得资格\n \n \n \n

\n

\n \n 相关链接:\n \n 弗雷舍获得2024年美国队资格\n \n \n

\n

\n \n 相关链接:\n \n 2024年美国国家队选拔赛开赛\n \n \n

\n

\n \n \n 相关链接:\n \n 2023年美国国家队选拔赛争议中结束\n \n \n \n

\n

\n \n \n 相关链接:\n \n 2022年美国国家队选拔赛结束\n \n \n \n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n 往期推荐\n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n \n \n 尼克尔队率先拿到百慕大杯美国1队资格\n \n \n

\n
\n
\n
\n
\n

\n \n \n 平板电脑还是纸牌?职业牌手有分歧\n \n \n

\n
\n
\n
\n
\n

\n \n \n 通往武汉之路:美国国家队选拔赛\n \n \n

\n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/oMvOUnizaYy4eFU6jMLozg", + "creator": "标兵桥牌", + "pubDate": "Fri, 06 Jun 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDRda8jbPFNWBhWgicGibibbjjNDKCMicY72yicOcSHiaicK2b3J2GCQFoYE8gLvyYicBPDwwXwXicRXMPTX0lA/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDRda8jbPFNWBhWgicGibibbjjNDKCMicY72yicOcSHiaicK2b3J2GCQFoYE8gLvyYicBPDwwXwXicRXMPTX0lA/0?wx_fmt=jpeg", + "id": "2247512600_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "c3ebf678a16026350b5dc82df17d4d69", + "highlights": [] + }, + { + "title": "亚太赛每日一牌回顾:一副小牌的攻防与叫牌", + "description": "亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n \n \n 老朋友\n \n \n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n 亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。\n \n \n

\n
\n

\n \n 5月23日每日一牌:一副小牌的攻防与叫牌\n \n

\n

\n \n 桥友们大多数喜欢大牌,满贯、高阶竞叫、加倍等等,因为大牌来的分数多,让人们看的热血沸腾。相比来说,小牌就很乏味,小牌攻防环节多,也比较复杂,产生的输赢较小,所以通常不被重视。\n \n

\n

\n \n 不过小牌同样重要,小牌产生的输赢,也是非常可观的。\n \n

\n

\n \n 下面这副牌是第二循环第11轮,中国对澳大利亚,此前澳大利亚领先中国,这副小牌在这场双VP的比赛中显得异常重要。\n \n

\n
\n
\n \n
\n
\n \n 东家主打2♣\n \n
\n
\n

\n \n 我是东家,开叫2♣成为最后定约,南家首攻♦A,怎么考虑?\n \n

\n

\n \n 联手有4-4的♠配合,但却难以找到,这是强梅花体系中的2♣开叫所带来不利之处,但好处是对方的8张♥配合也找不到了。从牌面上看,可能的输张有2墩♠、2墩♥、2墩♦、1墩♣,如果♠J、♥A、♣Q的位置有利,也是极有希望做成定约的。\n \n

\n

\n \n 南北方使用反式张数和姿态信号,在有将定约中,他们主要使用张数信号,南家的♦A后,同伴跟3,他改为拔♥A,解决了我的♥问题,北家跟8,然后南家再打♥,我的K吃住。\n \n

\n

\n \n 现在出♣J飞牌,南家有Q,吃住后,他略作思考,又出♣给明手,现在局面如下:\n \n

\n
\n
\n \n
\n
\n \n 现在明手出牌\n \n
\n
\n

\n \n 明手最后一个桥被用掉了,已经输了3墩,还有一个♦要输,看起来就要马上决战♠了,最大的概率就是直接出10飞J,你准备这样打吗?\n \n

\n
\n

\n \n 实战中,我将吃第三张♥,然后清将牌,南家有4张,我把他全清光,明手垫♠,手中送出♦J,南家吃住,全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 南家被投入,只能再拿一墩♠A了\n \n
\n
\n

\n \n 南家只有♠和♦可出了,无论出哪一门,我都只输一墩♠A,完成定约。我为何要这样打,因为南家的防守清楚地告诉我,所有大牌都在他手里,我不能飞♠J,而他的牌型,我也判断他没有很长的套,因为如果有长套,他很可能在2♣后争叫,他的牌很像现在这个牌型。\n \n

\n

\n \n 如果南家在我的♦J不出K如何?我可以明手的Q超打,然后再出小♦,送给南家,还原为实战中的情况。\n \n

\n
\n
\n \n
\n
\n \n 不用♦K吃也只是延缓被投入\n \n
\n
\n
\n

\n \n 值得一提的是叫牌,现在很多打精确法的牌手都不愿意开叫2♣,但有所不知2♣也并非都是弱点,也有它的长处,这副牌在另一室东家开叫10-13点的1NT,南家加倍,然后南北方抢到♥定约做成140分。假如东家开叫自然法的1♣或者精确法的1♦,南家都是争叫1NT,北家转移,东西方很难再行动抢出♠定约,实战中,有8桌都是南北方打♥定约吃到140分,而东西方打2♣的,只有我这一桌。\n \n

\n

\n \n \n
\n
\n
\n

\n
\n \n \n
\n

\n \n \n
\n
\n
\n

\n

\n \n \n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:满贯要有想象力\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:剥光投入显身手\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:连氏自然轻松满贯\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:心中有挡、无将不慌\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:精彩的四红心\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:有趣的四红心\n \n \n

\n

\n \n 相关链接:\n \n 风雨十四载、再夺亚太冠\n \n \n

\n

\n \n 相关链接:\n \n 荏苒十四载、再战亚太赛\n \n \n

\n

\n \n 相关链接:\n \n 十四年归来仍是追风少年\n \n \n

\n

\n \n 相关链接:\n \n 曼谷重启亚太大赛\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛落幕,欧公赛决赛法国内战\n \n \n

\n

\n \n 相关链接:\n \n 中国桥牌队亚太锦标赛大四喜,欧公赛女子团体冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团齐老板被淘汰、亚太赛迎来最后高潮\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团结束首轮淘汰赛、亚太赛接近尾声\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团预赛结束、亚太赛完成上半程比赛\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛结束女团、混团第一循环比赛\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团女团开赛,亚太赛中国占据三项第一\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛第一天中国女队占优,欧洲公开桥牌锦标赛混团冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛开幕,欧洲公开桥牌锦标赛产生老年团体冠军\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛即将开赛\n \n \n

\n

\n \n 相关链接:\n \n 第四届亚洲杯结束、中国香港捧起“宁波杯”\n \n \n

\n

\n \n 相关链接:\n \n 2022年亚洲杯开赛\n \n \n

\n

\n \n 相关链接:\n \n 第三届亚洲杯桥牌赛开幕\n \n \n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/mOns8vzMGRhHVuKF9DajUQ", + "creator": "标兵桥牌", + "pubDate": "Wed, 04 Jun 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "id": "2247512595_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "30306c42a579ceff24b8e7ac06bc2a90", + "highlights": [] + }, + { + "title": "亚太赛每日一牌回顾:满贯要有想象力", + "description": "亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n \n \n 老朋友\n \n \n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n 亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。\n \n \n

\n
\n

\n \n 5月22日每日一牌:满贯要有想象力\n \n

\n

\n \n 桥牌比赛中的满贯叫牌是胜负的关键,满贯叫牌是一个很复杂的工程,不仅需要搭档间非常好的默契、系统中有相应的工具、最重要的还要有想象力。\n \n

\n

\n \n 下面这副牌,发生在第一循环第4轮对阵新西兰的比赛中,中国男队的张永革,就做了一个非常有想象力的叫品,达到了优秀的大满贯。\n \n

\n
\n
\n \n
\n
\n \n 当了解到同伴没有将牌Q后,如何发展?\n \n
\n
\n

\n \n 南北方是强梅花体系,南家开叫1♣,北家2♣自然叫且进局逼叫,南家2♥,北家直接3♠显示4张♥支持和♠单缺,张永革马上4NT问关键张,当知道关键张不缺时,询问将牌Q。\n \n

\n

\n \n 但同伴告知没有将牌Q。\n \n

\n

\n \n 这时怎么办?张永革已经有3墩♠、2墩♥、1墩♦、3墩♣9个顶张大牌赢墩,如果♣3-2分布或者有J甚至有10,则还有2墩♣长牌赢墩,同时以♣做将牌还可以将吃一次♦,这样就有了12墩,如果同伴有♦K,或者单张♠J,或者有♥J时♥是单张Q,或者♥2-2等,这些综合概率,已经远超50%,经过综合考虑,张永革决定叫出颇具想象力的叫品:7♣。\n \n

\n

\n \n 全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 7♣是铁牌\n \n
\n
\n

\n \n 联手牌配置非常完美,首攻是将牌,张永革明手放小吃住东家的9,拔掉♦A,打将牌到明手的A,将吃♦,拔♠A,大将吃♠,吊将牌吃到13墩。\n \n

\n
\n

\n \n 这副牌在公开团体所有牌桌中,有硬拼7♥的,但由于将牌的不利分布而宕掉,也有做得好一些的叫7NT,7NT确实要好于7♥,在没有首攻♠的情况下,虽然打不对♥,但却可以对东西方施行双挤。\n \n

\n

\n \n 可是,7♣才是联手的最佳定约。\n \n

\n

\n \n \n
\n
\n
\n

\n

\n \n \n

\n
\n \n \n
\n

\n \n \n
\n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:剥光投入显身手\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:连氏自然轻松满贯\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:心中有挡、无将不慌\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:精彩的四红心\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:有趣的四红心\n \n \n

\n

\n \n 相关链接:\n \n 风雨十四载、再夺亚太冠\n \n \n

\n

\n \n 相关链接:\n \n 荏苒十四载、再战亚太赛\n \n \n

\n

\n \n 相关链接:\n \n 十四年归来仍是追风少年\n \n \n

\n

\n \n 相关链接:\n \n 曼谷重启亚太大赛\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛落幕,欧公赛决赛法国内战\n \n \n

\n

\n \n 相关链接:\n \n 中国桥牌队亚太锦标赛大四喜,欧公赛女子团体冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团齐老板被淘汰、亚太赛迎来最后高潮\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团结束首轮淘汰赛、亚太赛接近尾声\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团预赛结束、亚太赛完成上半程比赛\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛结束女团、混团第一循环比赛\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团女团开赛,亚太赛中国占据三项第一\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛第一天中国女队占优,欧洲公开桥牌锦标赛混团冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛开幕,欧洲公开桥牌锦标赛产生老年团体冠军\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛即将开赛\n \n \n

\n

\n \n 相关链接:\n \n 第四届亚洲杯结束、中国香港捧起“宁波杯”\n \n \n

\n

\n \n 相关链接:\n \n 2022年亚洲杯开赛\n \n \n

\n

\n \n 相关链接:\n \n 第三届亚洲杯桥牌赛开幕\n \n \n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/krlt_NpTNqw1TntMjo3n-Q", + "creator": "标兵桥牌", + "pubDate": "Tue, 03 Jun 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "id": "2247512589_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "dac49435f96482edfe68df0fb36a008c", + "highlights": [] + }, + { + "title": "亚太赛每日一牌回顾:剥光投入显身手", + "description": "亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n \n \n 老朋友\n \n \n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n 亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。\n \n \n

\n
\n

\n \n 5月21日每日一牌:剥光投入显身手\n \n

\n

\n \n 打牌的基本技术是读牌,认真阅读对方的牌情后,方能找到正确的路线。\n \n

\n

\n \n 下面这副牌发生在第二循环对阵印度尼西亚,孙纲的主打堪称精准。\n \n

\n
\n
\n \n
\n
\n \n 孙纲主打5♣\n \n
\n
\n

\n \n 西家是孙纲,开叫强梅花,北家加倍显示双高花,蔡阳再加倍表示8点以上,进局逼叫,南家阻击3♠,孙纲先Pass,在同伴加倍后,跳叫5♣成为最后定约。\n \n

\n

\n \n 首攻是♠A,继续拔K,庄家将吃后,如何考虑做庄?\n \n

\n
\n
\n \n
\n
\n \n 防守从两张♠大牌开始\n \n
\n
\n

\n \n 做成定约的关键是如何避免♦有两个输张,飞♥是没有用的,解决不了♦的问题。♦的普通打法是飞J,但这副牌成立吗?\n \n

\n

\n \n 孙纲先出将牌到明手,都有跟出,再拔♥AK明手将吃♥,南北方都跟出,然后孙纲出将牌到手中,北家跟出了两张将牌,南家垫♠。局面如下:\n \n

\n
\n
\n \n
\n
\n \n 北家有2张将牌\n \n
\n
\n

\n \n 现在仔细想一想,北家是什么牌?\n \n

\n

\n \n 南北方的♠很像是5-5配合,而北家的牌也很像是5-5高花,他已经跟出两张将牌,那么他的♦就是单张,即使不是单张,也不会超过2张,所以飞♦J的概率大大降低了。\n \n

\n

\n \n 孙纲判断北家是5-5-1-2牌型,于是他打小♦,北家跟小,他明手上Q,全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 打对♦,南家被投入\n \n
\n
\n

\n \n 南家陷入困境,如果A吃,则被投入,如果A不吃,则明手再出♦,就只输一墩♦了。\n \n

\n

\n \n 实战中南家A吃住Q,出小♦,孙纲放小,明手10吃到,完成5♣。\n \n

\n

\n \n 北家必须第二墩换攻♦,南家马上出A给北家将吃,才能击败5♣。如果南家不上A,而是出小,庄家则可以剥光♥,然后从明手出♠Q,手中垫♦,投入北家,北家只有高花可出,被迫给庄家将吃垫牌,♦输张消失。\n \n

\n

\n \n \n

\n

\n \n \n
\n
\n
\n

\n
\n \n \n
\n

\n \n \n
\n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:连氏自然轻松满贯\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:心中有挡、无将不慌\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:精彩的四红心\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:有趣的四红心\n \n \n

\n

\n \n 相关链接:\n \n 风雨十四载、再夺亚太冠\n \n \n

\n

\n \n 相关链接:\n \n 荏苒十四载、再战亚太赛\n \n \n

\n

\n \n 相关链接:\n \n 十四年归来仍是追风少年\n \n \n

\n

\n \n 相关链接:\n \n 曼谷重启亚太大赛\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛落幕,欧公赛决赛法国内战\n \n \n

\n

\n \n 相关链接:\n \n 中国桥牌队亚太锦标赛大四喜,欧公赛女子团体冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团齐老板被淘汰、亚太赛迎来最后高潮\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团结束首轮淘汰赛、亚太赛接近尾声\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团预赛结束、亚太赛完成上半程比赛\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛结束女团、混团第一循环比赛\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团女团开赛,亚太赛中国占据三项第一\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛第一天中国女队占优,欧洲公开桥牌锦标赛混团冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛开幕,欧洲公开桥牌锦标赛产生老年团体冠军\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛即将开赛\n \n \n

\n

\n \n 相关链接:\n \n 第四届亚洲杯结束、中国香港捧起“宁波杯”\n \n \n

\n

\n \n 相关链接:\n \n 2022年亚洲杯开赛\n \n \n

\n

\n \n 相关链接:\n \n 第三届亚洲杯桥牌赛开幕\n \n \n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/wN9dVtuhJM97x5qk8PsV-A", + "creator": "标兵桥牌", + "pubDate": "Mon, 02 Jun 2025 00:02:32 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "id": "2247512585_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "1477f7b86cceef32ddd423d3016b516f", + "highlights": [] + }, + { + "title": "亚太赛每日一牌回顾:连氏自然轻松满贯", + "description": "亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n \n \n 老朋友\n \n \n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n 亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。\n \n \n

\n
\n

\n \n 5月20日每日一牌:连氏自然轻松满贯\n \n

\n

\n \n 中国男队的队长连若旸,使用的叫牌武器是独具风格的“连氏自然“体系,虽然在某些方面不够前卫,但使用熟练、搭档默契,同样具有很强的战斗力。\n \n

\n

\n \n 下面这副牌的满贯叫牌,简洁而清晰,没有使用一个约定叫:\n \n

\n
\n
\n \n
\n
\n \n 没有使用一个约定叫的满贯\n \n
\n
\n

\n \n 连若旸与连勇使用连氏自然体系,连勇开叫1♦,连若旸虽然♥单张,但牌力不足二盖一,又没有4张高花,所以先应叫1NT,连勇逆叫2♥,显示额外实力,♦和♥至少5-4以上,连若旸加叫3♦,连勇3♠,显示♠大牌的同时,也显示了♣单张,连若旸扣叫4♣,连勇跳叫5♦。这时连若旸面临选择,他认为同伴跳叫显示6张♦,他有两个黑花A,且还有单张,于是加叫6♦。\n \n

\n

\n \n 双方叫牌没有使用一个约定叫,全部是自然而流畅地叫品,这也正是连氏自然的特点。\n \n

\n

\n \n 6♦是个非常好的定约,首攻♠后,连勇从明手出♥,然后将吃两次♥轻松做成。\n \n

\n

\n \n 这副牌全场只有一半牌桌叫到满贯,泰国队停在3NT上,中国男队赢10IMP,缩小了本场比赛的差距。\n \n

\n

\n \n \n
\n
\n
\n

\n
\n \n \n
\n

\n \n \n
\n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:心中有挡、无将不慌\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:精彩的四红心\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:有趣的四红心\n \n \n

\n

\n \n 相关链接:\n \n 风雨十四载、再夺亚太冠\n \n \n

\n

\n \n 相关链接:\n \n 荏苒十四载、再战亚太赛\n \n \n

\n

\n \n 相关链接:\n \n 十四年归来仍是追风少年\n \n \n

\n

\n \n 相关链接:\n \n 曼谷重启亚太大赛\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛落幕,欧公赛决赛法国内战\n \n \n

\n

\n \n 相关链接:\n \n 中国桥牌队亚太锦标赛大四喜,欧公赛女子团体冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团齐老板被淘汰、亚太赛迎来最后高潮\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团结束首轮淘汰赛、亚太赛接近尾声\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团预赛结束、亚太赛完成上半程比赛\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛结束女团、混团第一循环比赛\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团女团开赛,亚太赛中国占据三项第一\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛第一天中国女队占优,欧洲公开桥牌锦标赛混团冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛开幕,欧洲公开桥牌锦标赛产生老年团体冠军\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛即将开赛\n \n \n

\n

\n \n 相关链接:\n \n 第四届亚洲杯结束、中国香港捧起“宁波杯”\n \n \n

\n

\n \n 相关链接:\n \n 2022年亚洲杯开赛\n \n \n

\n

\n \n 相关链接:\n \n 第三届亚洲杯桥牌赛开幕\n \n \n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/L75dvQEdNwHh-Zfx5SPVUA", + "creator": "标兵桥牌", + "pubDate": "Sun, 01 Jun 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "id": "2247512579_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "7f580d300fabb2b9fe49f6576a73d9f3", + "highlights": [] + }, + { + "title": "亚太赛每日一牌回顾:心中有挡、无将不慌", + "description": "亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n \n \n 老朋友\n \n \n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n 亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。\n \n \n

\n
\n

\n \n 5月19日每日一牌:心中有挡、无将不慌\n \n

\n

\n \n 桥友们都知道著名的哈曼规则第一条:如果3NT是一个可以选择的定约,就叫3NT。\n \n

\n

\n \n 套用我们的俗话,叫做:走过路过,不要错过3NT。\n \n

\n

\n \n 当我们在叫牌中可以选择时,3NT是优选,这个很容易理解。但是,如果看上去,3NT并不是看上去一个可以选择的定约时,还能选3NT吗?\n \n

\n

\n \n 中国男队的蔡阳,在下面这副牌的处理,就给桥友们做了一个榜样:\n \n

\n
\n
\n \n
\n
\n \n 南家如何选择叫品?\n \n
\n
\n

\n \n 西家开叫3♥,两个Pass转到南家,选择什么叫品?\n \n

\n

\n \n 可供选择的大概有:Pass,加倍,4♦,3NT。\n \n

\n

\n \n 没有一个叫品是舒服的:\n \n

\n

\n \n · Pass太委屈,自己有15点,对方阻击叫,如果同伴有一些点力,就被对方的阻击叫拦住了,绝不情愿。\n \n

\n

\n \n · 加倍的问题是♠太短,同伴如果叫3♠,还是没解决任何问题,如果跳叫4♠,也很不舒服。\n \n

\n

\n \n · 4♦的好处是叫出了自己最长最强的花色,但这牌要打什么呢?5♦太远,4♦都有可能打不成。\n \n

\n

\n \n · 3NT不可选的原因是对方长套花色没有挡张,但除了这一缺点,就没有任何缺陷了。点力足够,赢墩也有,至于挡张嘛…… 管它呢,别忘了你还有个同伴,同伴说不定能帮你挡住,就算同伴挡不住,没准西家间张结构还不攻呢。\n \n

\n
\n

\n \n 蔡阳选择3NT,他成功了吗?\n \n

\n

\n \n 全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 3NT是最佳定约\n \n
\n
\n

\n \n 这是中国男队第一循环对阵中国香港的一副牌,实战中西家首攻♠Q,蔡阳先取6墩♠,东家放弃了♦,蔡阳再拿6墩♦,加上♥A,全卷13墩。\n \n

\n

\n \n 看,西家♥连接张都没首攻,假如明手的♥是Kx或者什么都没有,3NT都做成啦!\n \n

\n

\n \n \n
\n
\n
\n

\n
\n \n \n
\n

\n \n \n
\n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:精彩的四红心\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:有趣的四红心\n \n \n

\n

\n \n 相关链接:\n \n 风雨十四载、再夺亚太冠\n \n \n

\n

\n \n 相关链接:\n \n 荏苒十四载、再战亚太赛\n \n \n

\n

\n \n 相关链接:\n \n 十四年归来仍是追风少年\n \n \n

\n

\n \n 相关链接:\n \n 曼谷重启亚太大赛\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛落幕,欧公赛决赛法国内战\n \n \n

\n

\n \n 相关链接:\n \n 中国桥牌队亚太锦标赛大四喜,欧公赛女子团体冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团齐老板被淘汰、亚太赛迎来最后高潮\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团结束首轮淘汰赛、亚太赛接近尾声\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团预赛结束、亚太赛完成上半程比赛\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛结束女团、混团第一循环比赛\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团女团开赛,亚太赛中国占据三项第一\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛第一天中国女队占优,欧洲公开桥牌锦标赛混团冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛开幕,欧洲公开桥牌锦标赛产生老年团体冠军\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛即将开赛\n \n \n

\n

\n \n 相关链接:\n \n 第四届亚洲杯结束、中国香港捧起“宁波杯”\n \n \n

\n

\n \n 相关链接:\n \n 2022年亚洲杯开赛\n \n \n

\n

\n \n 相关链接:\n \n 第三届亚洲杯桥牌赛开幕\n \n \n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/z0GqwfNMdTFUEdkOglYv1A", + "creator": "标兵桥牌", + "pubDate": "Sat, 31 May 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "id": "2247512576_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "bf069e2911ea545aad791222bdeddb68", + "highlights": [] + }, + { + "title": "亚太赛每日一牌回顾:精彩的四红心", + "description": "亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n \n \n 老朋友\n \n \n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n 亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。\n \n \n

\n
\n

\n \n 5月18日每日一牌:精彩的4♥\n \n

\n

\n \n 我们常说,桥牌比的就是判断力和执行力,特别是攻防环节,先判断牌型和牌点位置,再执行完成目标。\n \n

\n

\n \n 本届亚太赛上,中国男队的连勇,在第一循环迎战澳大利亚时,打出了下面这副精彩的做庄。\n \n

\n
\n
\n \n
\n
\n \n 东家主打4♥\n \n
\n
\n

\n \n 东家连勇开叫1♥,西家连若旸的3♦是限制性加叫或更好,北家争叫4♣,西家4♥结束叫牌。\n \n

\n

\n \n 首攻是♣,北家兑现两墩♣后,出♦脱手,现在如何考虑?\n \n

\n
\n
\n \n
\n
\n \n 如何把♠和♦的输张控制在一个\n \n
\n
\n

\n \n ♦的飞牌如果成功,什么时候都可以进行,连勇♦A拿住,两轮将牌停在明手,北家都跟出,如果♦Q在南家,就需要做好♠垫掉♦,而联手的♠,有可能输1-2墩,在限制只输1墩♠的情况下,能否获得3墩就是焦点。\n \n

\n

\n \n 北家在4阶上争叫,他很可能有♠K,但也不是绝对的,如果北家是3张♠且有K,庄家几乎无法避免输掉两墩♠,如果是两张♠且有K,则可以先拔♠A,北家不解封,就再拔掉♦K,打♠投入北家。\n \n

\n

\n \n 但北家如果没有♠K呢?可以飞中♠K且送3-3,用第4张♠垫♦,也可以打南家4张以上♠和♦Q,挤住南家。\n \n

\n

\n \n 所以,现在首先需要进行的,就是♠K的判断。\n \n

\n

\n \n 连勇找到一个好办法,他从明手出小♠,此时北家有♠K很难不上,至少是给北家增加了一定的压力,如果北家出小牌,可以假设南家有♠K,然后根据北家的牌型对南家实施不同的操作:\n \n

\n

\n \n 兑现♦K,北家如果跟出♦,则♠不超过2张,可以兑现将牌挤住南家;如果北家跟不出♦,则♠是3-3,下一圈飞♠K就可以做好第四张♠。\n \n

\n
\n
\n \n
\n
\n \n 从明手出♠做试探打法\n \n
\n
\n

\n \n 实战中,当连勇打小♠到10,南家打出K,意图迷惑连勇,但连勇仍然采取挤牌路线做成了定约。\n \n

\n

\n \n 全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 南家被挤住\n \n
\n
\n

\n \n 这副牌在锦标赛公团中,只有连勇一桌做成了4♥。与中国台北队对阵的新西兰的庄家,因为北家争叫♣,判断北家有♠K,他决定打北家双张K,但没有成功,亚洲桥王黄光辉建议,如果打♠K在北家,可以先从明手出小♠,这正是连勇实战的打法。\n \n

\n

\n \n 澳大利亚的庄家则飞♠K,虽然成功,但他却追求3-3,定约宕掉。\n \n

\n

\n \n \n
\n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 亚太赛每日一牌回顾:有趣的四红心\n \n \n

\n

\n \n 相关链接:\n \n 风雨十四载、再夺亚太冠\n \n \n

\n

\n \n 相关链接:\n \n 荏苒十四载、再战亚太赛\n \n \n

\n

\n \n 相关链接:\n \n 十四年归来仍是追风少年\n \n \n

\n

\n \n 相关链接:\n \n 曼谷重启亚太大赛\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛落幕,欧公赛决赛法国内战\n \n \n

\n

\n \n 相关链接:\n \n 中国桥牌队亚太锦标赛大四喜,欧公赛女子团体冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团齐老板被淘汰、亚太赛迎来最后高潮\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团结束首轮淘汰赛、亚太赛接近尾声\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团预赛结束、亚太赛完成上半程比赛\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛结束女团、混团第一循环比赛\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团女团开赛,亚太赛中国占据三项第一\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛第一天中国女队占优,欧洲公开桥牌锦标赛混团冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛开幕,欧洲公开桥牌锦标赛产生老年团体冠军\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛即将开赛\n \n \n

\n

\n \n 相关链接:\n \n 第四届亚洲杯结束、中国香港捧起“宁波杯”\n \n \n

\n

\n \n 相关链接:\n \n 2022年亚洲杯开赛\n \n \n

\n

\n \n 相关链接:\n \n 第三届亚洲杯桥牌赛开幕\n \n \n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/YsbU0ZqyoOzWP_V3IZXtzA", + "creator": "标兵桥牌", + "pubDate": "Fri, 30 May 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "id": "2247512572_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "e8464543f510223436e2028719dd5ce0", + "highlights": [] + }, + { + "title": "亚太赛每日一牌回顾:有趣的四红心", + "description": "亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。", + "content": "
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n 新朋友\n \n \n \n \n \n
\n

\n \n \n 点击\n \n \n \n 标兵桥牌\n \n \n \n

\n

\n \n \n 关注微信\n \n \n

\n
\n \n \n 老朋友\n \n \n
\n

\n \n \n 点击\n \n \n \n 右上角\n \n \n \n

\n

\n \n \n 分享本文\n \n \n

\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n

\n \n
\n
\n

\n

\n \n \n 亚太锦标赛结束了,中国男队夺得冠军,在比赛期间所写的“每日一牌”,比赛期间并没有发出,从今天开始,给桥友们提供迟到的每日一牌。\n \n \n

\n
\n

\n \n 5月17日每日一牌:有趣的4♥\n \n

\n

\n \n 在主打时,需要制定计划,找到看似不可能发生但能够完成定约的路线,而找到一条路线时,需要反复确认,是否可行。\n \n

\n

\n \n 下面是亚太锦标赛第一循环中国男队对韩国队的一副牌:\n \n

\n
\n
\n \n
\n
\n \n 南家主打4♥加倍定约\n \n
\n
\n

\n \n 东家开叫1♦,至少4张以上,南家争叫4♥,转到东家加倍,成为最后定约。\n \n

\n

\n \n 南家主打4♥加倍定约,西家首攻♦7,明手的牌看起来没什么用,先摆小,东家A吃, 马上出♦,现在庄家怎么办?\n \n

\n
\n
\n \n
\n
\n \n 首攻♦到A,东家再出♦\n \n
\n
\n

\n \n 将牌足够结实,不怕对方提升将牌,♦和将牌各有一个输墩,♠上面的输墩如何逃脱?如果自己手中出♠,至少要输两墩。\n \n

\n

\n \n 庄家发现,对方只有3张将牌,而且除了A之外,都是小将牌,假如将牌2-1分布,庄家就是铁牌了。他可以大将吃♦,打小将牌,如果西家是Ax两张,无论他出哪一张,明手都可以进手兑现♦赢墩,并且从明手出♠。\n \n

\n

\n \n 再进行下一步行动之前,先考虑一下对方是什么牌,西家是否确定是2张将牌。\n \n

\n

\n \n 西家没有叫4♠,不像有4张以上的♠,假如西家是单张♦,同时也只有2张将牌,那么他就是3-2-1-7牌型,他是否会选择叫5♣?如果西家的高花更短,他的♣相应更长,也更不容易Pass。\n \n

\n

\n \n 如果大将吃♦,打小将牌到明手的路线成功,需要西家是2张将牌、2张♦、不超过3张♠。\n \n

\n

\n \n 实战中,中国男队的庄家决定采取将牌2-1分布的路线,他大将吃♦,打小将牌,西家先跟小,明手将牌9大,发现将牌3-0,只好从明手出♠,东家不知为何抢上♠A,替庄家解决了♠问题,定约做成。\n \n

\n

\n \n 全手牌如下:\n \n

\n
\n
\n \n
\n
\n \n 东家犯错,完成定约\n \n
\n
\n

\n \n 这副牌在另一室的叫牌也是南家直接争叫4♥,但连若旸没有选择Pass准备罚放,而是直接加倍希望同伴叫牌,同伴叫出5♣,还赚了一个加倍。这副牌中国队两边成局,获得16IMP。\n \n

\n

\n \n 顺便谈一下东家的防守,虽然明显的♠A不应该马上出,但在第一墩♦A吃进后,它并不能确定同伴是单张♦,贸然继续♦,一旦庄家单张♦,可能损失惨重,更好的出牌还是试试♣,从同伴Pass 4♥并没有叫4♠来看,庄家的♠有一定的长度,他的♣较短,如果庄家是AQ双张♣,他至少还有4张♠,♦几乎肯定是单张了,所以出♦更不安全。\n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n \n \n \n \n \n 点击\n \n \n \n \n 阅读原文\n \n \n \n \n \n
\n
\n
\n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n
\n
\n
\n
\n
\n

\n \n \n 别忘了点个在看哦!转发那就太好了!\n \n \n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n

\n \n
\n
\n

\n

\n \n 相关链接:\n \n 风雨十四载、再夺亚太冠\n \n \n

\n

\n \n 相关链接:\n \n 荏苒十四载、再战亚太赛\n \n \n

\n

\n \n 相关链接:\n \n 十四年归来仍是追风少年\n \n \n

\n

\n \n 相关链接:\n \n 曼谷重启亚太大赛\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛落幕,欧公赛决赛法国内战\n \n \n

\n

\n \n 相关链接:\n \n 中国桥牌队亚太锦标赛大四喜,欧公赛女子团体冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团齐老板被淘汰、亚太赛迎来最后高潮\n \n \n

\n

\n \n 相关链接:\n \n 欧公赛公团结束首轮淘汰赛、亚太赛接近尾声\n \n \n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团预赛结束、亚太赛完成上半程比赛\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛结束女团、混团第一循环比赛\n \n \n \n
\n
\n

\n

\n \n 相关链接:\n \n 欧洲公开桥牌锦标赛公团女团开赛,亚太赛中国占据三项第一\n \n \n

\n

\n \n 相关链接:\n \n 亚太赛第一天中国女队占优,欧洲公开桥牌锦标赛混团冠军产生\n \n \n

\n

\n \n 相关链接:\n \n 亚太桥牌锦标赛开幕,欧洲公开桥牌锦标赛产生老年团体冠军\n \n \n

\n

\n \n 相关链接:\n \n 第53届亚太桥牌锦标赛即将开赛\n \n \n

\n

\n \n 相关链接:\n \n 第四届亚洲杯结束、中国香港捧起“宁波杯”\n \n \n

\n

\n \n 相关链接:\n \n 2022年亚洲杯开赛\n \n \n

\n

\n \n 相关链接:\n \n 第三届亚洲杯桥牌赛开幕\n \n \n

\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/fs-IXTIprP-cFsg1E2bafQ", + "creator": "标兵桥牌", + "pubDate": "Thu, 29 May 2025 00:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/iauJ3TcMNYDTH0sTiajz6mMGDUjHnftbibdib7FEvMaiahjxG8C2mKODhpuRaUtBEnLTyDUl3T8iciaqCAYSUSymeB1ZA/0?wx_fmt=jpeg", + "id": "2247512565_1", + "language": "", + "folder": "桥牌", + "feed": "标兵1桥牌", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "b2ba7615ea76a0fee1a3212e0c63f7bd", "highlights": [] }, { @@ -3039,28 +3435,6 @@ "hash": "2b6ed1913a5cd728400dd3d540ebddd9", "highlights": [] }, - { - "title": "联合国文件真的是中文版本的最薄吗?", - "description": "
\"头图\"/
\n

问题只问了薄厚,那只需要统计一下文档的页数就好了。

\n

我统计了 2006 年以来的所有联合国安理会决议文件,共计 1099 份。先把结论写在前面:除去有并列最薄的文件后,绝大部分文件,中文是最薄的。

\n

中文 页数最少的决议有 391 份。

\n

英语 页数最少的决议有 7 份。

\n

西班牙语 页数最少的决议有 1 份。

\n

其余的,页数一样或者有并列最少的页码。

\n
\"\"
\n

有哪些文件不是中文最薄呢?

\n

决议 1803 中页数最少的语言是 英语,总页数为 7。(内容是伊朗核问题,内容大概是继续要求伊朗暂停铀浓缩等活动)

\n
\"\"
\n

决议 1877 中页数最少的语言是 英语,总页数为 4。(不好概括,简单来说是有关卢旺达的问题)

\n
\"\"
\n

决议 1932 中页数最少的语言是 西班牙语,总页数为 3。(这份西班牙语的文本,附件没有单起一页,成了唯一一个中英以外的选手)

\n
\"\"
其他语言的版本,即使上面的空白足够,附件都是新开一页
\n
\"\"
但是西班牙语的却紧随其后了,不知道什么原因
\n

决议 1993 中页数最少的语言是 英语,总页数为 2。(关于国际法庭的)

\n
\"\"
\n

决议 2231 中页数最少的语言是 英语,总页数为 104。(这份是伊核问题最主要的决议之一,同时也是我统计的所有决议中最长的一篇。中文 108 页)

\n
\"\"
\n

决议 2260 中页数最少的语言是 英语,总页数为 1。(科特迪瓦问题)(中文超出四行,导致分页)

\n
\"\"
\n

决议 2268 中页数最少的语言是 英语,总页数为 2。(叙利亚问题)

\n

决议 2533 中页数最少的语言是 英语,总页数为 1。(叙利亚人道问题)

\n

其余有意思的发现各个语言在联合国安理会决议中的平均厚度

\n

阿拉伯语:6.29 页

\n

中文:4.54 页

\n

英语:4.97 页

\n

法语:5.47 页

\n

俄语:5.99 页

\n

西班牙语:5.49 页

\n

如果页数能代表语言简略程度,那么第一名是中文,第二名是英文,之后分别是法语,西班牙语,俄语,阿拉伯语

\n

领先最多的一篇决议

\n

决议 2368,中文 28 页,英文 33 页,比英文少了 5 页(伊黎伊斯兰国(达伊沙)和基地组织制裁名单)

\n

如何得出此结论的呢?

\n

联合国的文件都在官网上放着,可以抓下来,统计一下的

\n

按理说这么久了应该有人做个爬虫把联合国各个决议爬取下来啊,居然没人做,那就我来试试吧

\n

前面有些答案提到联合国部分机构翻译的水平不一,所以就先选个大机构,安全理事会,选取近两年的各项决议看看。这些决议有些能直接调动维和部队,应该不会胡乱翻译。

\n

各项决议都在这里下载:

\n
\"\"
\n

比如今年这个 2751 号决议,提供了六种语言的下载,分别为阿拉伯语,中文,英语,法语,俄语,西班牙语(阿拉伯语我不认识,不知道是不是这个)

\n
\"\"
\n

下载的文件格式为 PDF,打开后大概是这样的:

\n
\"\"
\n

决议的具体信息对于我们的答案没有什么帮助,有帮助的是下载链接:

\n
https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=A

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=C

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=E

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=F

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=R

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=S
\n

分别是阿拉伯语,中文,英语,法语,俄语,西班牙语的文件,注意到,2751 是决议编号,后面的 Lang=啥就是语言版本。有规律就好办了,写一段 Python 程序,将这些报告逐一下载下来就好啦

\n

但是代码我肯定是懒得写的,交给 AI 代劳啦,联合国的服务器太烂,我直接 6 线程同时下载,两分钟就下载完成了 2024 年的所有决议。

\n
\"\"
\n
\"\"
\n

我这网络质量不错,偶尔有下载失败的,手动下载一下就行,下载了这么多,就出现了两次

\n
\"\"
\n

只下载到了 2006 年的数据,为什么呢?因为宿舍熄灯了

\n

接下来是数据分析的内容,首当其冲的就是页数了。Python 有个库,PyPDF2,直接这样就可以输出 PDF 的页数了:

\n
\n
reader = PdfReader(pdf_path)\npage_count = len(reader.pages)\n
\n
\n

下载的时候,我就将文件重命名为决议号 + 语言的文件名形式了,并将同一决议号的文件放在了同一个子文件夹中,很容易分辨出来哪几个文件是属于同一份决议

\n
\"\"
\n

接下来,写个循环,遍历读取所有文件夹中的文件,依次比较页数大小。

\n
\n
 for pdf in pdf_files:\n                    language = pdf.split('_')[1][0]  # 提取语言标识\n                    pdf_path = os.path.join(resolution_path, pdf)\n                    reader = PdfReader(pdf_path)\n                    page_count = len(reader.pages)\n
\n
\n

如果有并列第一的,就会返回超过 1 个的元素,排除一下就行,最后即可得出此结论。

\n

附录:完整的代码:

\n

以下是下载决议的代码

\n
\n
import os\nimport requests\nfrom concurrent.futures import ThreadPoolExecutor\nimport time\n# 决议编号范围和语言版本\nstart_number = 1738\nend_number = 1652\nlanguages = [\"A\", \"C\", \"E\", \"F\", \"R\", \"S\"]\nbase_url = \"https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/{}&Lang={}\"\n\ndef download_resolution(number):\n    resolution_folder = f\"UN_Resolutions/{number}\"\n    os.makedirs(resolution_folder, exist_ok=True)\n\n    for lang in languages:\n        url = base_url.format(f\"{number}(2006)\", lang)#换成要下载的年份\n        try:\n            response = requests.get(url, proxies={\n                \"http\": \"http://127.0.0.1:7890\",\n                \"https\": \"http://127.0.0.1:7890\"\n            })\n            response.raise_for_status()  # 检查请求是否成功\n\n            file_name = f\"{resolution_folder}/{number}_{lang}.pdf\"\n            with open(file_name, \"wb\") as file:\n                file.write(response.content)\n            print(f\"{file_name} 下载成功!\")\n        except requests.exceptions.RequestException as e:\n            print(f\"{number} - {lang} 版本下载失败:\", e)\n            print(url)\n\n# 使用线程池下载决议\nwith ThreadPoolExecutor(max_workers=25) as executor:\n    executor.map(download_resolution, range(start_number, end_number - 1, -1))\n    time.sleep(1)\n
\n
\n

以下是统计分析的代码

\n
\n
import os\nfrom PyPDF2 import PdfReader\n\ndef count_pages(resolutions_folder):\n    overall_min_counts = {}\n    total_resolutions = 0\n    non_chinese_min_resolutions = []\n    max_chinese_pages = 0\n    max_chinese_resolution = None\n    longest_resolution = None\n    longest_page_count = 0\n    total_language_pages = {}\n    language_count = {}\n    max_diff = 0\n\n    language_names = {\n        'A': '阿拉伯语',\n        'C': '中文',\n        'E': '英语',\n        'F': '法语',\n        'R': '俄语',\n        'S': '西班牙语'\n    }\n\n    for resolution in os.listdir(resolutions_folder):\n        resolution_path = os.path.join(resolutions_folder, resolution)\n        if os.path.isdir(resolution_path):\n            pdf_files = [f for f in os.listdir(resolution_path) if f.endswith('.pdf')]\n            if len(pdf_files) == 6:\n                total_resolutions += 1\n                language_page_count = {}\n                \n                for pdf in pdf_files:\n                    language = pdf.split('_')[1][0]  # 提取语言标识\n                    pdf_path = os.path.join(resolution_path, pdf)\n                    reader = PdfReader(pdf_path)\n                    page_count = len(reader.pages)\n                    \n                    if language not in language_page_count:\n                        language_page_count[language] = 0\n                    language_page_count[language] += page_count\n\n                    # 累加语言总页数和计数\n                    if language not in total_language_pages:\n                        total_language_pages[language] = 0\n                        language_count[language] = 0\n                    total_language_pages[language] += page_count\n                    language_count[language] += 1\n\n                # 更新最长决议\n                total_pages = sum(language_page_count.values())\n                if total_pages > longest_page_count:\n                    longest_page_count = total_pages\n                    longest_resolution = resolution\n\n                # 找出最小页数和出现的语言\n                min_count = min(language_page_count.values())\n                min_languages = [lang for lang, count in language_page_count.items() if count == min_count]\n\n                # 如果最小页数的语言不唯一,跳过该决议\n                if len(min_languages) > 1:\n                    continue\n\n                # 唯一的最小页数语言\n                min_language = min_languages[0]\n\n                # 输出最少页数语言的信息\n                print(f\"决议 {resolution} 中页数最少的语言是 {language_names[min_language]},总页数为 {min_count}。\")\n\n                # 更新最少页数统计\n                if min_language not in overall_min_counts:\n                    overall_min_counts[min_language] = 0\n                overall_min_counts[min_language] += 1\n\n                # 检查中文是否为最少页数\n                if min_language != 'C':\n                    non_chinese_min_resolutions.append(resolution)\n                else:\n                    # 找出第二少的语言页数\n                    sorted_counts = sorted(language_page_count.values())\n                    if len(sorted_counts) > 1:\n                        second_least_count = sorted_counts[1]\n                        diff = min_count - second_least_count\n                        print(f\"决议 {resolution} 中文页数与第二少语言的差值为 {diff}。\")\n                        max_diff = max(max_diff, diff)\n\n                # 记录中文页数最多的决议\n                if 'C' in language_page_count:\n                    if language_page_count['C'] > max_chinese_pages:\n                        max_chinese_pages = language_page_count['C']\n                        max_chinese_resolution = resolution\n\n    # 输出总统计\n    print(f\"\\n 共计统计了 {total_resolutions} 份决议。\")\n    for language, count in overall_min_counts.items():\n        print(f\"{language_names[language]} 页数最少的决议有 {count} 份。\")\n\n    # 输出中文页数不是最少的决议\n    if non_chinese_min_resolutions:\n        print(\"以下决议的中文页数不是最少:\")\n        for res in non_chinese_min_resolutions:\n            print(res)\n\n    # 输出中文页数最多的决议\n    if max_chinese_resolution:\n        print(f\"中文页数最多的决议是 {max_chinese_resolution},总页数为 {max_chinese_pages}。\")\n        print(f\"中文页数与第二少语言的最大差值为 {max_diff}。\")\n\n    # 输出最长的决议\n    if longest_resolution:\n        print(f\"最长的决议是 {longest_resolution},总页数为 {longest_page_count}。\")\n\n    # 计算并输出各语言的平均页数\n    print(\"\\n 各语言的平均页数:\")\n    for language, total_pages in total_language_pages.items():\n        average_pages = total_pages / language_count[language]\n        print(f\"{language_names[language]}:{average_pages:.2f} 页\")\n\n# 调用函数\ncount_pages('UN_Resolutions')\n
\n
\n
\n
\n\n\n\n\n
\n\n\n\n", - "content": "
\"头图\"/
\n

问题只问了薄厚,那只需要统计一下文档的页数就好了。

\n

我统计了 2006 年以来的所有联合国安理会决议文件,共计 1099 份。先把结论写在前面:除去有并列最薄的文件后,绝大部分文件,中文是最薄的。

\n

中文 页数最少的决议有 391 份。

\n

英语 页数最少的决议有 7 份。

\n

西班牙语 页数最少的决议有 1 份。

\n

其余的,页数一样或者有并列最少的页码。

\n
\"\"
\n

有哪些文件不是中文最薄呢?

\n

决议 1803 中页数最少的语言是 英语,总页数为 7。(内容是伊朗核问题,内容大概是继续要求伊朗暂停铀浓缩等活动)

\n
\"\"
\n

决议 1877 中页数最少的语言是 英语,总页数为 4。(不好概括,简单来说是有关卢旺达的问题)

\n
\"\"
\n

决议 1932 中页数最少的语言是 西班牙语,总页数为 3。(这份西班牙语的文本,附件没有单起一页,成了唯一一个中英以外的选手)

\n
\"\"
其他语言的版本,即使上面的空白足够,附件都是新开一页
\n
\"\"
但是西班牙语的却紧随其后了,不知道什么原因
\n

决议 1993 中页数最少的语言是 英语,总页数为 2。(关于国际法庭的)

\n
\"\"
\n

决议 2231 中页数最少的语言是 英语,总页数为 104。(这份是伊核问题最主要的决议之一,同时也是我统计的所有决议中最长的一篇。中文 108 页)

\n
\"\"
\n

决议 2260 中页数最少的语言是 英语,总页数为 1。(科特迪瓦问题)(中文超出四行,导致分页)

\n
\"\"
\n

决议 2268 中页数最少的语言是 英语,总页数为 2。(叙利亚问题)

\n

决议 2533 中页数最少的语言是 英语,总页数为 1。(叙利亚人道问题)

\n

其余有意思的发现各个语言在联合国安理会决议中的平均厚度

\n

阿拉伯语:6.29 页

\n

中文:4.54 页

\n

英语:4.97 页

\n

法语:5.47 页

\n

俄语:5.99 页

\n

西班牙语:5.49 页

\n

如果页数能代表语言简略程度,那么第一名是中文,第二名是英文,之后分别是法语,西班牙语,俄语,阿拉伯语

\n

领先最多的一篇决议

\n

决议 2368,中文 28 页,英文 33 页,比英文少了 5 页(伊黎伊斯兰国(达伊沙)和基地组织制裁名单)

\n

如何得出此结论的呢?

\n

联合国的文件都在官网上放着,可以抓下来,统计一下的

\n

按理说这么久了应该有人做个爬虫把联合国各个决议爬取下来啊,居然没人做,那就我来试试吧

\n

前面有些答案提到联合国部分机构翻译的水平不一,所以就先选个大机构,安全理事会,选取近两年的各项决议看看。这些决议有些能直接调动维和部队,应该不会胡乱翻译。

\n

各项决议都在这里下载:

\n
\"\"
\n

比如今年这个 2751 号决议,提供了六种语言的下载,分别为阿拉伯语,中文,英语,法语,俄语,西班牙语(阿拉伯语我不认识,不知道是不是这个)

\n
\"\"
\n

下载的文件格式为 PDF,打开后大概是这样的:

\n
\"\"
\n

决议的具体信息对于我们的答案没有什么帮助,有帮助的是下载链接:

\n
https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=A

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=C

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=E

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=F

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=R

https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/2751(2024)&Lang=S
\n

分别是阿拉伯语,中文,英语,法语,俄语,西班牙语的文件,注意到,2751 是决议编号,后面的 Lang=啥就是语言版本。有规律就好办了,写一段 Python 程序,将这些报告逐一下载下来就好啦

\n

但是代码我肯定是懒得写的,交给 AI 代劳啦,联合国的服务器太烂,我直接 6 线程同时下载,两分钟就下载完成了 2024 年的所有决议。

\n
\"\"
\n
\"\"
\n

我这网络质量不错,偶尔有下载失败的,手动下载一下就行,下载了这么多,就出现了两次

\n
\"\"
\n

只下载到了 2006 年的数据,为什么呢?因为宿舍熄灯了

\n

接下来是数据分析的内容,首当其冲的就是页数了。Python 有个库,PyPDF2,直接这样就可以输出 PDF 的页数了:

\n
\n
reader = PdfReader(pdf_path)\npage_count = len(reader.pages)\n
\n
\n

下载的时候,我就将文件重命名为决议号 + 语言的文件名形式了,并将同一决议号的文件放在了同一个子文件夹中,很容易分辨出来哪几个文件是属于同一份决议

\n
\"\"
\n

接下来,写个循环,遍历读取所有文件夹中的文件,依次比较页数大小。

\n
\n
 for pdf in pdf_files:\n                    language = pdf.split('_')[1][0]  # 提取语言标识\n                    pdf_path = os.path.join(resolution_path, pdf)\n                    reader = PdfReader(pdf_path)\n                    page_count = len(reader.pages)\n
\n
\n

如果有并列第一的,就会返回超过 1 个的元素,排除一下就行,最后即可得出此结论。

\n

附录:完整的代码:

\n

以下是下载决议的代码

\n
\n
import os\nimport requests\nfrom concurrent.futures import ThreadPoolExecutor\nimport time\n# 决议编号范围和语言版本\nstart_number = 1738\nend_number = 1652\nlanguages = [\"A\", \"C\", \"E\", \"F\", \"R\", \"S\"]\nbase_url = \"https://daccess-ods.un.org/access.nsf/Get?OpenAgent&DS=s/res/{}&Lang={}\"\n\ndef download_resolution(number):\n    resolution_folder = f\"UN_Resolutions/{number}\"\n    os.makedirs(resolution_folder, exist_ok=True)\n\n    for lang in languages:\n        url = base_url.format(f\"{number}(2006)\", lang)#换成要下载的年份\n        try:\n            response = requests.get(url, proxies={\n                \"http\": \"http://127.0.0.1:7890\",\n                \"https\": \"http://127.0.0.1:7890\"\n            })\n            response.raise_for_status()  # 检查请求是否成功\n\n            file_name = f\"{resolution_folder}/{number}_{lang}.pdf\"\n            with open(file_name, \"wb\") as file:\n                file.write(response.content)\n            print(f\"{file_name} 下载成功!\")\n        except requests.exceptions.RequestException as e:\n            print(f\"{number} - {lang} 版本下载失败:\", e)\n            print(url)\n\n# 使用线程池下载决议\nwith ThreadPoolExecutor(max_workers=25) as executor:\n    executor.map(download_resolution, range(start_number, end_number - 1, -1))\n    time.sleep(1)\n
\n
\n

以下是统计分析的代码

\n
\n
import os\nfrom PyPDF2 import PdfReader\n\ndef count_pages(resolutions_folder):\n    overall_min_counts = {}\n    total_resolutions = 0\n    non_chinese_min_resolutions = []\n    max_chinese_pages = 0\n    max_chinese_resolution = None\n    longest_resolution = None\n    longest_page_count = 0\n    total_language_pages = {}\n    language_count = {}\n    max_diff = 0\n\n    language_names = {\n        'A': '阿拉伯语',\n        'C': '中文',\n        'E': '英语',\n        'F': '法语',\n        'R': '俄语',\n        'S': '西班牙语'\n    }\n\n    for resolution in os.listdir(resolutions_folder):\n        resolution_path = os.path.join(resolutions_folder, resolution)\n        if os.path.isdir(resolution_path):\n            pdf_files = [f for f in os.listdir(resolution_path) if f.endswith('.pdf')]\n            if len(pdf_files) == 6:\n                total_resolutions += 1\n                language_page_count = {}\n                \n                for pdf in pdf_files:\n                    language = pdf.split('_')[1][0]  # 提取语言标识\n                    pdf_path = os.path.join(resolution_path, pdf)\n                    reader = PdfReader(pdf_path)\n                    page_count = len(reader.pages)\n                    \n                    if language not in language_page_count:\n                        language_page_count[language] = 0\n                    language_page_count[language] += page_count\n\n                    # 累加语言总页数和计数\n                    if language not in total_language_pages:\n                        total_language_pages[language] = 0\n                        language_count[language] = 0\n                    total_language_pages[language] += page_count\n                    language_count[language] += 1\n\n                # 更新最长决议\n                total_pages = sum(language_page_count.values())\n                if total_pages > longest_page_count:\n                    longest_page_count = total_pages\n                    longest_resolution = resolution\n\n                # 找出最小页数和出现的语言\n                min_count = min(language_page_count.values())\n                min_languages = [lang for lang, count in language_page_count.items() if count == min_count]\n\n                # 如果最小页数的语言不唯一,跳过该决议\n                if len(min_languages) > 1:\n                    continue\n\n                # 唯一的最小页数语言\n                min_language = min_languages[0]\n\n                # 输出最少页数语言的信息\n                print(f\"决议 {resolution} 中页数最少的语言是 {language_names[min_language]},总页数为 {min_count}。\")\n\n                # 更新最少页数统计\n                if min_language not in overall_min_counts:\n                    overall_min_counts[min_language] = 0\n                overall_min_counts[min_language] += 1\n\n                # 检查中文是否为最少页数\n                if min_language != 'C':\n                    non_chinese_min_resolutions.append(resolution)\n                else:\n                    # 找出第二少的语言页数\n                    sorted_counts = sorted(language_page_count.values())\n                    if len(sorted_counts) > 1:\n                        second_least_count = sorted_counts[1]\n                        diff = min_count - second_least_count\n                        print(f\"决议 {resolution} 中文页数与第二少语言的差值为 {diff}。\")\n                        max_diff = max(max_diff, diff)\n\n                # 记录中文页数最多的决议\n                if 'C' in language_page_count:\n                    if language_page_count['C'] > max_chinese_pages:\n                        max_chinese_pages = language_page_count['C']\n                        max_chinese_resolution = resolution\n\n    # 输出总统计\n    print(f\"\\n 共计统计了 {total_resolutions} 份决议。\")\n    for language, count in overall_min_counts.items():\n        print(f\"{language_names[language]} 页数最少的决议有 {count} 份。\")\n\n    # 输出中文页数不是最少的决议\n    if non_chinese_min_resolutions:\n        print(\"以下决议的中文页数不是最少:\")\n        for res in non_chinese_min_resolutions:\n            print(res)\n\n    # 输出中文页数最多的决议\n    if max_chinese_resolution:\n        print(f\"中文页数最多的决议是 {max_chinese_resolution},总页数为 {max_chinese_pages}。\")\n        print(f\"中文页数与第二少语言的最大差值为 {max_diff}。\")\n\n    # 输出最长的决议\n    if longest_resolution:\n        print(f\"最长的决议是 {longest_resolution},总页数为 {longest_page_count}。\")\n\n    # 计算并输出各语言的平均页数\n    print(\"\\n 各语言的平均页数:\")\n    for language, total_pages in total_language_pages.items():\n        average_pages = total_pages / language_count[language]\n        print(f\"{language_names[language]}:{average_pages:.2f} 页\")\n\n# 调用函数\ncount_pages('UN_Resolutions')\n
\n
\n
\n
\n\n\n\n\n
\n\n\n\n", - "category": "", - "link": "https://daily.zhihu.com/story/9782621", - "creator": "", - "pubDate": "Thu, 17 Jul 2025 12:27:03 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "知乎", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "192365ae8e45cd8faffe4ed124a8ed0f", - "highlights": [] - }, { "title": "哪个瞬间你突然觉得读书真有用?", "description": "
\"头图\"/
\n

当我发现我看懂了《郑伯克段于鄢》,我才明白,读书是真有用啊。

\n

《郑伯克段于鄢》这篇文章,有很高的历史地位和文学地位。

\n
\"\"
\n

中国人为什么重视历史,第一当然是因为我们历史长,历史中有足够多的故事,能给我们足够多的经验和教训,不像某些国家只有几百年的历史,历史太短,就不能全面地总结规律;第二是因为,中国的历史都是血的教训,意义重大,只不过,我们在语文课本里、历史课本里学的时候,因为没有社会阅历,看不懂。等我们步入社会,再回头来看历史,才发现中国的历史真是字字泣血,句句如山,早已经把一切都告诉我们了。

\n

扯远了,还是谈一谈《郑伯克段于鄢》中,作者到底给我们讲了一个怎样的故事吧。

\n

一、【原文第一段】

\n

初,郑武公娶于申,曰武姜,生庄公及共叔段。庄公寤生,惊姜氏,故名曰寤生,遂恶之。爱共叔段,欲立之。亟请于武公,公弗许。

\n

直译就是,姬姓国郑国的国君(名叫姬掘突,也就是)郑武公娶了(姜姓国)申国国君申侯的女儿,这个女人被称作“武姜”,生了两个儿子,一个就是后来的庄公,一个是共叔段。武姜在生庄公的时候,庄公难产,武姜受了很大的惊吓,所以给大儿子庄公起了个小名,叫寤生,而且,武姜对这个大儿子很反感。相反,武姜喜欢自己的小儿子共叔段,想立他为储君,也就是想让小儿子郑武公的接班人。多次向郑武公请示这个想法,郑武公不答应。

\n

这段话里面就有很有意思的故事。

\n

1. 要先讲讲郑国的来历。

\n

郑武公的父亲郑桓公,是郑国的开国国君,名叫姬友(不要想歪了啊,人家真叫这个名字,姬姓,郑氏,名友,受封前称王子友),是周宣王同父异母的弟弟。郑桓公在公元前 806 年,被分封到荥阳这个地方,建立郑国。根据《史记·卷四十二·郑世家第十二》记载“宣王立二十二年,友初封于郑。封三十三岁,百姓皆便爱之。”这位姬友同志挺有政治手腕的,作为开国国君,治理国家能够得到人民的爱戴。于是呢,被自己的侄子周幽王(也就是烽火戏诸侯的主角)召回王室,担任司徒。

\n

这位司徒回到周王室,发现自己这个侄子不大行啊,宠爱褒姒,而且诸侯逐渐开始有反叛的苗头。所以,郑桓公开始给自己留后路了。具体做了两件事:第一件是把郑国向东迁到虢、郐这个地方,这两个地方的国君向这位朝中大佬、天子的亲叔叔献上了十座城池,于是郑国就在这个地方扎下根来。第二件事,郑桓公让自己的儿子姬掘突向当时的太子宜臼靠拢。后面我们就能看到郑桓公的英明之处,这位开国国君指导自己儿子玩儿政治投机是一把好手。

\n

2. 郑武公是一个什么样的人。

\n

老国君郑桓公安排完后路,第二年,周幽王就惹出了乱子。为了赢得美人褒姒的一笑,烽火戏诸侯,并且还要废黜了申侯的女儿王后、外孙太子姬宜臼,而改立褒姒母子为王后和太子,所以申侯一气之下,起兵反叛,联合缯国、犬戎攻打周幽王。在这场叛乱中,周幽王和郑桓公一同被杀。郑桓公去世之后,儿子郑武公继位,正式登上政治舞台。这位郑武公上任干的第一件大事,就是联合秦襄公、晋文侯、卫武公拨乱反正,拥立原来的太子宜臼登基,史称“周平王”。郑武公号召郑国的国民,帮助周平王将王室向东搬迁到洛邑,从此,中国历史进入了东周时代。

\n

郑武公这么卖力给周平王干活,得到了什么好处呢?郑武公又被封为司徒,也就是继承了老父亲的官职。郑武公和自己的儿子郑庄公都被周王室封为卿士,可以说,这里郑国的权力有点“挟天子以令诸侯”的感觉了。这里就能看出提前下注的好处了吧。

\n

3. 郑武公为什么要娶武姜?

\n

申国国君也就是申侯,这个人把犬戎人引进镐京,干掉了自己的女婿周幽王和郑桓公,自己的外孙还当上了周王。因为犬戎人把周王室祸害的太厉害了,老百姓都对申侯这个人比较反感。郑武公呢,不用说了,自己的杀父仇人,不共戴天之仇啊。

\n

那郑武公岂不是娶了杀父仇人的女儿?

\n

理论上来讲,确实是这样的。史书对这件事没有详细的描述。我想,这肯定是一场政治婚姻,周平王为了控制和约束郑武公,用亲上加亲的借口,让自己的亲姨妈嫁给了自己的叔叔郑武公。这下好了,郑武公给周平王既当叔叔又当姨夫,你还好意思欺负自己的外甥兼侄儿吗?周王都给你指婚了,你说你姬掘突同志能推辞不?所以大概率,郑武公对这桩婚事是不满的,不过为了大局考虑,只能捏着鼻子认了。这估计也为后来郑武公跟周平王交恶埋下了种子。

\n

4. 武姜仗着娘家背景强大,骄横跋扈,对郑国指手画脚。

\n

第一,从一个正常人的角度,母亲生儿子的时候因为难产险些丧命,所以厌恶自己的这个儿子,这也还能理解,但是给自己的儿子起个小名叫“难产”(寤生),是不是就有点过分了?可想而知,后来的郑庄公,对自己这位母后是什么感官了。

\n

第二,在分封制的体制下,立长立嫡,是国家传承的基本原则。西周时代,在立谁为储君的问题上,已有公论。正常情况下,只要庄公没什么大毛病,肯定就是储君的天然人选,哪轮得到武姜一个妇人在这儿说三道四的。在立储这么敏感的问题上,武姜就因为自己的喜好,就想扶小儿子上位,而且,还是屡次请求没有得到准许。

\n

各位看到这儿,大概已经明白,国君的意思已经很清楚了,就是要立自己的大儿子。你武姜请示一次被拒绝后,还不赶快夹起尾巴好好做人,去找自己的大儿子未来的国君弥补一下关系,反而屡次向郑武公提请求,这分明是不把郑武公放在眼里啊。

\n

这说明,郑国上层,存在两个山头,一派是郑武公为首,大儿子郑庄公坚定站自己老爸;另一派是武姜为首,政治诉求是拥立自己的小儿子共叔段当国君,这很有可能是来自武姜的外甥周平王的授意和支持。如果武姜能够成功,其实就相当于周平王这一系实际掌控住了郑国,也就不怕郑国臣大欺君了。

\n

5. 郑国咽不下被干涉内政这口气。

\n

郑武公好歹也是一路杀出来的一代雄主,干了不少大事:护送周平王东迁,攻灭东虢国和郐国,吞并周边鄢、蔽、补、丹、依、弢、历、莘八邑。现在看到自己当年拼了老命保下来的周平王不但不对自己这个叔叔感恩戴德,还想着将我郑国纳入你周王室的控制之下,这哪能忍得了?老子现在搞不动你,等老子的儿子搞你。在郑武公的培养之下,儿子郑庄公最终成为一代霸主。

\n

所以就有了《古文观止》的第二篇《周郑交质》。这个故事我们下次再讲,看郑庄公是怎么狠狠打脸周平王的。

\n

二、【原文第二段】

\n

及庄公即位,为之请制。公曰:“制,岩邑也,虢叔死焉,他邑命。”请京,使居之,谓之京城大叔。祭仲曰:“都城过百雉,国之害也。先王之制:大都不过参国之一,中五之一,小九之一。今京不度,非制也,君将不堪。”公曰:“姜氏欲之,焉辟害?”对曰:“姜氏何厌之有!不如早为之所,无使滋蔓,蔓难图也。蔓草犹不可除,况君之宠弟乎!”公曰:“多行不义,必自毙,子姑待之。”

\n

大白话翻译一下:

\n

武姜在郑庄公继位之后,还不死心,想让郑庄公把“制”这个城池分封给自己的小儿子共叔段当领地。郑庄公找了个理由:制这个城池,是险要之地,虢叔就是死在那个地方的,兆头不好,你给弟弟另挑个别的地儿,我都答应。武姜于是请求把京邑分封给共叔段,庄公答应了,于是人们称共叔段为京城太叔。

\n

这时候一位叫祭仲的大臣看不过去了,私底下跟庄公说:一个都市的城墙超过三百丈,这个都市就太大了,将危害到国家安全。按照以前的制度,大的城池不能超过国都的三分之一,中等城池的城墙不能超过国都的五分之一,小城池的城墙不能超过国都的九分之一。现在京邑太大了,分封给共叔段不符合制度,恐怕会给你造成隐患。

\n

庄公手一摊:母后姜氏想这么干,我有什么办法,有害也只能承受了。祭仲说:姜氏胃口太大,没有满足的时候,不如早做谋划,不要让他们的势力膨胀起来,膨胀起来将像藤蔓到处滋生一样难以铲除了。藤蔓都除不干净,更不用说你的亲弟弟了。郑庄公大手一挥:多行不义必自毙,你等着看(我怎么收拾他)就行了。

\n

这段话又讲了什么故事呢?

\n

1. 第一个交锋在于,武姜请求封共叔段到制这个地方。

\n

你武姜是不是有点太蹬鼻子上脸了?太子登基之前你想着废太子,太子登基之后,你仗着自己是太后,不但不夹起尾巴做人,反而找新君给自己小儿子请求封赏,还是一个如此要害的城池,这是想干嘛呀?这不是拿郑庄公当傻子么?

\n

注意了,朋友们,郑庄公继位的时候,只有 13 岁。13 岁的一个孩子, 武姜不拿他当回事儿,也就可以理解了,可能是觉得小孩子好糊弄。

\n

但是,郑庄公能成为春秋一霸,政治天分可能早早就开发出来了。《毛泽东 1959 年 12 月至 1960 年 2 月读苏联政治经济学(教科书)的谈话记录》中记载,毛泽东曾说:春秋时候有个郑庄公,此人很厉害,他对国内斗争和国际斗争都很懂得策略。所以,就是这个 13 岁的孩子,一眼就看穿了武姜的图谋。

\n
\"\"
\n

按郑庄公的说法:制,是一个险要的地方。这个地方险要到什么程度呢?地处郑国最北端,北依黄河 ,岸如绝壁,控此一地可制郑国全境,又是东方诸侯通向周王朝首都洛邑的必经之地,是郑国商业发展的重要关口,后世称之为“虎牢关”。

\n

虎牢关这个名字大家可能更熟悉一些,刘邦死守这里连项羽都打不进去,刘邦和项羽在此地“大战七十,小战四十”,三英战吕布也发生在这里,李世民也是在虎牢关一战拿下王世充、窦建德。

\n

1944 年,日本人动用铃木旅团步骑五六千人,炮二十余门,战车及装甲车七八十辆,想要攻打虎牢关,被路云亭率领一个营的兵力阻击七天七夜,最后路云亭部以伤亡四百余人的代价,歼敌 2500 人。(详见荥阳网《虎牢阻击战——虎牢关最后一场大战》)

\n

虎牢关北面是黄河,南边是嵩山,能够通行大军的路就只有一段狭长的河谷地。这么险要的地方,郑庄公心里有数,肯定是不可能给自己这个亲弟弟的。所以“虢叔死焉”,不吉利,只是个堵武姜嘴的借口罢了。我要是给了你这个城池,将来打不下来可怎么办。

\n

郑庄公还来了一句“他邑唯命”,意思是其他地方你指哪儿就是哪儿,都听你的。各位,如果国君跟一个大臣说“我都听你的”,这个大臣就要掂量掂量自己能不能活到明天早上了,你敢给国君下“命”令?

\n

武姜也不知道真傻还是假傻,愣是没听出来郑庄公话语中的不满,再一次向作死的路上迈出了一大步。《古文观止》的作者吴楚材和吴调侯点评“他邑唯命”,说是“四字毒甚”。

\n

2. 第二次交锋在于,武姜请求封共叔段到京邑。

\n

京邑是个什么地方呢?很有可能是整个郑国除了都城新郑之外,最大的城池。城池越大,人口越多,赋税、粮草越多,能够供养的兵马也就越强。所以,武姜之心,简直是路人皆知。更神奇的操作来了,郑庄公同意了这个请求。这里就是郑庄公政治手腕儿高超的地方了。我们一层一层来分析。

\n

第一层,表面上看起来,郑庄公话都已经说出口了:其他地方随便挑。这时候人家真好意思挑最大的地方了,你要是说不给吧,好像国君有点不守承诺的意思,都说君无戏言嘛。所以,看起来,郑庄公是被自己的话逼到了墙角。

\n

第二层,郑庄公通过装傻充愣,瞒过了武姜和共叔段,也养成了共叔段骄傲自大的心理。郑庄公什么都看破了,但是就是不说,也不表现出来,武姜自然被蒙在鼓里,觉得自己这个儿子还是很好拿捏的嘛,连带着,武姜的小儿子也渐渐看不起自己这个哥哥了,觉得自己实力强了之后,完全能够拿下郑国。郑庄公这一下拿捏了人性,骄人之心,把武姜和共叔段吃得死死的。

\n

第三层,郑庄公不是不知道京邑的重要性,这从后面他跟祭仲的对话就能看出来。为什么他还同意把共叔段封到京邑呢?为了郑国表面上的和谐和稳定。要知道,武姜这一派山头可不仅仅是武姜和共叔段两个人,上头还有个周天子呢,下面可能还有支持武姜的文武大臣等势力。一旦这时候就跟武姜撕破脸,两方斗起来,才 13 岁的郑庄公能不能服众还不知道呢,避免不了郑国混乱衰弱的局面,反而容易让周王室看到机会。所以,也可以称郑庄公这一招是以空间换时间。

\n

第四层,从小被郑武公教育大,郑庄公深刻知道,要执政,最重要的是民心。郑庄公通过忍让,退步,让老百姓和中立派向自己靠拢。老百姓会觉得,人家国君都这么忍让了,你们武姜母子俩还这么得寸进尺,公然违反国家制度(先王之制),实在是太欺负人了。自然而然,时间一长,民意就站在了郑庄公一边。同时,在国际上也拥有了良好的声誉,大家都知道,郑庄公是个孝顺的国君。这样,人设也就立起来了。

\n

相较于这些收获,一个随时能拿回来的京邑,根本什么都不算。为什么说随时能拿回来的京邑呢?我们后面再讨论这个问题。

\n

3. 祭仲与郑庄公的讨论。

\n

祭仲何许人也?这位春秋第一权臣,一生辅佐了郑国的五位国君,他的政治履历长达半个世纪,在郑庄公死之后,祭仲可谓是权势滔天,权力上升到了可以废立国君的地步。

\n

这样一个大臣,私下来向国君阐述自己的忧虑,并指出京城太叔违反了“先王之制”,要求国君早做谋划,除掉京城太叔。看起来像是一个忠诚到不能再忠诚的忠臣。

\n

实际上呢?

\n

我认为,这更像君臣之间的一次试探。都在这玩儿狼人杀呢。

\n

大臣明面上是在讲自己为国家担忧,实际上是在投石问路,看看你郑庄公究竟是个什么水平。要是京城太叔这事你都看不出来,没点城府,大臣一讲完你就大惊失色,大呼“这可如何是好”,那人家大臣就明白了,你国君就是个草包而已,指不定这个权臣现在就能放手做大。

\n

这边国君呢,还保持着自己无辜受害者的人设,回了一句:母后想要这样,我有啥办法?你看,一句话,既表明了自己是被动的,是受害者,又暗示了“我知道这是怎么回事儿,就是演给他们看看”。

\n

祭仲这时候已经把握住了国君的心态,又更近一步:要不咱现在就开始谋划着,除掉他们?这句话,其实是废话。既然郑庄公已经意识到了危害,不可能不严加防备,用不着你祭仲来多这句嘴。那祭仲这句话是表达什么意思呢?一方面,站队表忠心,向国君提出这个建议以表明自己不是武姜的人。另一方面呢,试图进入国君的决策圈子,要是国君能让我来执行这件事,咱祭仲不就成了国君的心腹了吗,帮国君背锅要是成了,可就简在帝心了哇。

\n

4. 郑庄公的经典回答。

\n

郑庄公是怎么回答祭仲的呢?“多行不义必自毙,子姑待之。”这也成为一个中国经典成语。

\n

这句话真的太经典了,很值得细细品味。

\n

第一,郑庄公告诉祭仲,我心里有数,你等着看戏就行了。这句话既显示了帝王的城府,又没有把自己的安排向手下人和盘托出,保持了神秘感。

\n

第二,在这种心机深沉的帝王面前,祭仲把不准脉,就不敢放肆。后来庄公在世时,祭仲老老实实地干活,到了郑庄公死后才敢出来蹦跶。

\n

第三,这时候郑庄公可还没充分信任你祭仲呢,哪敢让你知道或者参与这么大的事情,用人不疑疑人不用可是基本原则。后来的光绪皇帝就是没有学明白郑庄公这个经验,轻信袁世凯能帮他拿下慈禧,最终身陷囹圄,死得也不明不白。

\n

三、【原文第三段】

\n

既而大叔命西鄙、北鄙贰于己。公子吕曰:“国不堪贰,君将若之何?欲与大叔,臣请事之;若弗与,则请除之。无生民心。”公曰:“无庸,将自及。”大叔又收贰以为己邑,至于廪延。子封曰:“可矣,厚将得众。”公曰:“不义不昵,厚将崩。”

\n

翻译大意:

\n

太叔让西鄙北鄙这两个城邑也向自己效忠,甚至最后把这两个城邑收归自己所有,地盘扩大到了廪延这个地方。这时候大臣们都看不过去了,公子吕向郑庄公进言:这个国家都快要有两个主人了,共叔段得到了更多的物资和地盘,能够武装更多的人马,不能再忍让了,该出手了。郑庄公说:没事儿,不要着急,让他作吧,光有物资可笼络不住那么多的人马,你看他是怎么玩儿完的。

\n
\"\"
\n

1. 共叔段的势力膨胀到了什么地步?

\n

“鄙”是春秋时期边邑的称呼,《说文解字》云:“五酂为鄙,百家为酂”,因此一​鄙​约为五百家。如果这个说法是靠谱的,那么西鄙北鄙加起来至少有 1000 户,如果平均一户 5 口人,一户人家能出 1 人作战的话,共叔段从西鄙北鄙这里就能得到一支 1000 人的军队。

\n

汉朝的刘向编写了《战国策书录 - 叙》,其中讲:战国晚世,万乘之国七,千乘之国五,敌哞争权,盖国战国。意思是拥有万乘兵车的大国七个(战国七雄),拥有千乘兵车的有五个国家(鲁,宋,中山,卫,郑)。要知道,郑国这时才立国三代,还处在春秋前期,估计还称不上是个千乘之国。

\n

古代的作战单位,一乘,指一辆战车、四匹马、三个甲士,战车周围还要配备一定数量的步卒。如果按照一乘 20 个人来算,1000 个人也能组个 50 乘了。这可还没算上京邑能动员的兵力。所以大致估算,共叔段怎么也该有个 100-200 乘以上的兵力了。

\n

2. 公子吕表态意味着什么?

\n

公子吕是新出场的人物,他是何许人也?

\n

公子吕是郑武公的弟弟,姓姬名吕,字子封,公子吕也就是郑庄公的叔叔。作为郑国国君的“皇叔”,他能代表的可不只是他一个人的意见,而是整个郑国公室的意见。公子吕出来跟郑庄公讲话,这就说明除掉共叔段,拿下武姜,摆脱周天子钳制,已经成为郑国公室的一致意见。

\n

公子吕第一次出场,还是用激将法,催庄公下决心,免得老百姓无所适从。但是庄公确实是对自己有信心,稳坐钓鱼台:不着急,让他继续作,他快作到头了。

\n

公子吕第二次出场,就更直接了一些:到时候了,再让他武装起来,咱可就对付不了了。这里说明,郑国公室,对于郑庄公确实是鼎力支持了,很可能支持了军队。但是大概这个军队数量并不是很多。公子吕可能觉得,凭自己手里的军队,现在对付共叔段还行,要是共叔段手里人更多的话,可能就对付不了了。说白了,冷兵器时代,没那么多花哨的战术,在没法玩儿太多阴谋的情况下,比人数是最直接的。这里也能看出,共叔段确实可能拥有超过 100 乘的军事力量。

\n

3. 为什么庄公这么有底气?

\n

第一,庄公本来的用意,就是通过表现得宽容、退让,获得民心和公卿大臣们的支持。等的时间越长,共叔段造反的迹象越明显,也就能让庄公获得更多人的效忠,也更能看明白哪些人是一定要站在我对立面的、将来一定要铲除的人。所谓大势在我,时间站在自己这一边,当然庄公不会着急。

\n

第二,庄公可以借此探一探郑国公室的底。我上位这么长时间了,母后和弟弟这么欺负我,你们这些叔伯长辈就这么看着,也不说出来支持一下,现在坐不住了,想出来维持局面了,那也得咱国君点头不是?你想动弹可以啊,给咱交个底,你们手里有多少能动用的力量,都交给我来指挥。咱国君不允许有不听话的军事力量存在。

\n

第三,庄公有自己的底牌,能够确保自己不会输,局势还在自己的掌控之中。这个底牌我们前面提过一句,这里先略过,后面再讲。

\n

第四,现阶段就打击共叔段,不一定能一击致命。虽然共叔段做得不合规矩,但是毕竟是国君的亲弟弟,只要还没有确凿的证据证明他谋反,武姜求求情,说不定共叔段就被保下来了呢?而且,这样也不可能抓到武姜的把柄,不可能把武姜拉下来,砸碎她的势力,斩断周天子的触手。

\n

四、【原文第四段】

\n

大叔完聚,缮甲兵,具卒乘,将袭郑。夫人将启之。公闻其期,曰:“可矣!”命子封帅车二百乘以伐京。京叛大叔段,段入于鄢,公伐诸鄢。五月辛丑,大叔出奔共。

\n

翻译:太叔这边做好了充分的准备,厉兵秣马,准备好偷袭新郑了,武姜都要做内应给太叔开门了。郑庄公听说了他们发动的日期,做出判断:时机成熟了,动吧。于是公子吕率领二百乘去讨伐京邑。京邑背叛了太叔,太叔只好跑到鄢这个地方。庄公又讨伐鄢,于是五月二十三日,太叔逃到了国外(共国)。

\n

这个部分虽然简短,却是整个故事的高潮部分,寥寥数笔,共叔段要偷袭,共叔段失败了,共叔段逃跑了,故事讲完了。春秋如椽大笔,确实笔力雄健,不服不行。真正有意思的细节,也在这一段中。

\n

1. 共叔段到底是什么水平。

\n

其实,纵观全文,共叔段都没有正面出场过,都是在庄公与大臣们对话的场景下,作为背景介绍出现的。我们确实无从知道共叔段的政治手腕。但是,作为一个要造反的主,自己的一举一动都摆在君王的眼皮子底下,连大臣都知道你要干什么,也能看出,至少共叔段是一点保密意识都没有,轻易就能被外人获知信息。“事以密成,语以泄败”的常识都没有,不死才怪。

\n

再者,共叔段不懂民心和政治规矩。你越想夺权,越想上位,越不能表现出一副咄咄逼人的样子,相反,你要学王莽,推辞、低调、谦虚才行。你手里没有啥实力的时候,就仗着武姜撑腰,一副郑国要跟我姓的姿态,难免会惹人反感。

\n

2. 庄公掀开了底牌。

\n

其实说到这里,相信大家已经看出来了,庄公早就在京邑埋下了自己的伏笔,留下了关键的后手。从什么时候开始的呢?至少是庄公说“多行不义必自毙”这句话之前。要知道,郑伯克段于鄢这个战斗发生在郑庄公二十三年,也就是说,庄公这个伏笔,硬生生埋了二十多年,一直忍到王师来的那一天。所以,才有子封伐京,京马上就“叛太叔段”。而且,这应该不是一个人,很可能是一股势力,或者一个组织、一个集团,扎根在京邑。

\n

如果说这是老国君郑武公给儿子留下的死忠,那也就罢了。如果是十三岁的小君王就懂得笼络人心,还能让人死心塌地在敌营中待了二十二年,那这就太可怕了。

\n

此外,庄公在武姜身边,同样埋有间谍,所以,庄公才能准确获知共叔段的偷袭日期。这是一定的,不然,庄公不可能这么有把握,这么有底气。军国大事,碰运气可不行,肯定是存在万全的准备才敢这么玩儿的。

\n

3. 共叔段死没死?

\n

共叔段应该是本来被称为“叔段”,到跑到共国之后,才被世人称为共叔段。共叔段跑到共国之后的事情,《左氏春秋》没有继续交代,我们也无从得知。没有写出来,就是留白,给大家自己想象的空间,都有可能。但是,我认为,就郑庄公这个腹黑加老谋深算的性格来说,不太可能给自己留下这么一个明显的隐患。春秋战国时期,买凶杀人的故事史书上讲得多了,多郑庄公一个不多,少他一个不少。

\n

五、【原文第五段】

\n

书曰:“郑伯克段于鄢。”段不弟,故不言弟;如二君,故曰克;称郑伯,讥失教也;谓之郑志。不言出奔,难之也。

\n

这一段是《左氏春秋》对春秋的注解。这一整篇文章,对应《春秋》原文就六个字“郑伯克段于鄢”。《左氏春秋》对这六个字展开讲解,就拓展成了这一篇文章,现在是来讲:“郑伯”意味着啥、“克”意味着啥、“段”有啥含义、“于鄢”又是出于什么考虑,体现的是《春秋》的微言大义,用什么字都很有讲究。

\n

如果比照《春秋》对其他君主的称呼,这里应该是“庄公”而不是“郑伯”,之所以用“郑伯”,是为了讥讽庄公,点明他是大哥,对于弟弟有管教的责任,但庄公没有尽到管教的义务。克,一般用来形容平级之间的对抗,胜利的一方“克”失败的一方,这儿虽然庄公和共叔段不是平级,但是类似于两个国君在斗争,所以用“克”,而不用“征”“讨”“伐”之类的词。共叔段自身也有做错的地方,没有尽到自己做弟弟的义务,所以不合格,这里就不用“弟”,而用“段”来称呼。“于鄢”指的是,这件事只写到共叔段在鄢这个地方失败了,没有写他跑出国及以后的事,可能是《春秋》感到后面的事儿不好下笔,于是就只讲到“于鄢”这里。

\n

六、【原文第六段】

\n

遂置姜氏于城颍,而誓之曰:“不及黄泉,无相见也。”既而悔之。颍考叔为颍谷封人,闻之,有献于公,公赐之食,食舍肉。公问之,对曰:“小人有母,皆尝小人之食矣,未尝君之羹,请以遗之。”公曰:“尔有母遗,繄我独无!”颍考叔曰:“敢问何谓也?”公语之故,且告之悔。对曰:“君何患焉?若阙地及泉,隧而相见,其谁曰不然?”公从之。公入而赋:“大隧之中,其乐也融融!”姜出而赋:“大隧之外,其乐也泄泄。”遂为母子如初。

\n

翻译:凯旋而归的郑庄公恼怒母亲武姜,就将其放逐到了城颍,并发誓说:不到黄泉,咱们就别相见了。后来呢,郑庄公又后悔了。颍考叔为颍谷的边将,听说了这件事,就献给庄公一些礼物。庄公请他吃饭,他把肉留下不吃。庄公问他原因,他说:“小人有母亲,小人的食物她都尝过,但没尝过君主的肉羹,请允许我把肉羹带给她。”庄公说:“你有母亲可孝敬,就我没有!”颍考叔说:“请问你这话是什么意思?”庄公对他说了原因,并说现在很后悔。在这种情况下,颍考叔建议,何不挖一条地下隧道,取名为“黄泉”,然后母子在此相会。郑庄公大喜,就命人挖了一条可见地下水的隧道,并请母亲前来。郑庄公见到母亲后,非常高兴,说:大隧之中,其乐也融融。武姜随之回应道:大隧之外,其乐也泄泄。这就是成语“其乐融融”的来历。母子两个和好如初了。

\n

看上去合家欢的大结局,背后透露出了什么信息呢?

\n

1. 为什么要置姜氏与城颖?

\n

按理来讲,武姜都失败了,已经被抓到错处了,直接打入冷宫软禁起来不就可以了吗?何必多此一举,流放到城颖?有可能出于以下三种考虑:

\n

第一,郑庄公要向国人表明态度,武姜是共叔段叛乱的重要同犯,并不是无辜的,所以要流放给大家看。

\n

第二,郑庄公趁机清洗了武姜留下来的势力,斩断周平王的干扰,从而把郑国的两派力量捏合成了一个整体。

\n

第三,出于个人感情,确实对这个厌恶自己的母亲反感了,想着眼不见心不烦了。

\n

2. 庄公为什么要后悔?

\n

从《左氏春秋》的角度来讲,肯定是郑庄公渴望母爱,孝子的心发作了,所以后悔了。

\n

政治人物考虑事情哪有这么简单。最大的可能是,郑庄公从胜利的欣喜中冷静了下来,忙完了之后发现,这件事产生了很不好的政治影响。

\n

无论国内国外,都可能会攻击庄公:你郑庄公不孝啊,竟然把自己的母亲流放了,还永不相见。随着时间的流逝,大家只会记得庄公流放了武姜,谁还能记得因为啥流放武姜呢?

\n

所以庄公出于政治考虑,想着挽回一下影响。

\n

3. 演员颍考叔出场。

\n

这是一段很有意思的互动,我们可以好好研究一下。

\n

颍考叔是郑国大夫,得知了这件事,就来给庄公送礼,两个演员就此碰面。庄公赏赐颍考叔吃饭,颍考叔把肉挑出来,准备带回家。庄公问,你这是几个意思?颍考叔说,我家里有老母亲,没吃过国君赏赐的肉,我带回去给她尝尝。都是千年的狐狸了,还玩儿什么聊斋呀,庄公自然知道这位大臣是冲着什么来的了,于是也就演上了:唉,你能孝敬母亲,但是我不能。

\n

注意,颍考叔的下一句话情商很高,确实是个好演员:国君这是何出此言呢?

\n

你看,你颍考叔就是冲着这件事儿来的,但是你不能在国君面前表现得你什么都知道。不然领导会想,怎么滴,你平时对我的八卦很感兴趣吗?领导后悔了是领导的事,你替领导说出来,那可就是你的不对了。颍考叔人精,自然不会犯这种错误。

\n

于是两个人就能继续演下去,庄公诉苦,颍考叔出主意,庄公采纳。

\n

从此之后,颍考叔就进入了国君的视野,你看,多棒的演出。

\n

4. 庄公与武姜的对手戏。

\n

颍考叔导演都已经给出剧本来了,庄公也答应演出了,台阶给到武姜了,请问你武姜肯不肯顺坡下驴呢?武姜这时候也知道大势已去,再硬挺着,下半辈子只能在城颖被软禁到死了,于是,武姜也服软了。

\n

在设置好的场景中,庄公出场,还做了首诗:隧道之中,真开心啊;武姜也配合得很好,应和一首:隧道之外,也很开心。

\n

这样在外人面前,双方都找到了台阶下,就和好如初了。

\n

可是,武姜和庄公心里都清楚,随着共叔段的出走,庄公“他邑唯命”的阶段已经过去了,该轮到你武姜“唯命是从”了。

\n

七、升华与总结

\n

【原文第七段】君子曰:“颍考叔,纯孝也,爱其母,施及庄公。《诗》曰:‘孝子不匮,永锡尔类。’其是之谓乎!”

\n

这就是《左氏春秋》闭着眼睛硬给这篇文章上价值了,大家都要学习孝子颍考叔,孝敬父母。魏禧《左传经世钞》点评颍考叔“敏妙”,真是火眼金睛啊。

\n

从这篇文章中,我们能学到什么东西呢?

\n
    \n
  1. 当你实力不足的时候,千万不要轻举妄动,要忍辱负重,静待时机。
  2. \n
\n

2. 形象很重要,特别是弱势的形象,能够争取大家的同情,建立统一战线,孤立对手。

\n

3. 对于部下来说,在重大的抉择面前,有些废话你必须说。你说了,才能表明你的态度,不说,就不能站队。

\n

4. 古人写书,用了太多的春秋笔法,这也是个门槛。你能看透利益关系,你就能发现字里行间的血迹和“吃人”;如果你看不透,你就会觉得这篇文章真是一个生动的案例,武姜那么欺负人,庄公最后还是这么孝顺,太感人了,看来孝心是人的本能,然后你就会被儒家思想逐渐洗脑。

\n

5. 庄公这么做,是不是太过分了?从《春秋》的立场来看,觉得庄公和共叔段太不讲兄弟情谊,双方都有错误,各打五十大板。但是,从郑国国家利益的角度来看,庄公通过老辣的政治手腕,稳稳地控制局面,防止了国家分裂和社会动荡,将郑国的损失降到最小,最大程度保留和整合了郑国的力量,这简直是大大的有功好吧。

\n

6. 当二把手推你出来跟一把手唱对台戏的时候,如果一把手轻易地退让了,你可千万别欣喜若狂,自觉老子天下第一。注意谨慎、低调,向一把手表现出自己的身不由己,心底里时刻警惕来自一把手的打击报复。不然的话,人家捧杀你,你还不知道,你肯定要被人家算计到死。

\n

第二、三、四篇也写出来了,请大家批评指正!

\n

经常看书的人和不看书的人有什么区别?执白:《谏逐客书》背后的故事为什么网友都说董宇辉善良、老实,从哪里看出来的?你见过哪些父母惊艳到你的教育方式?

\n

码字不易,欢迎大家点赞关注评论收藏。

\n

征集令:大家想看春秋战国期间的哪个历史故事的深度解读?欢迎发到评论区。每一条评论我都会看,我会尽力先写大家想看的那段故事。发出来之后会专门艾特想看的朋友哦!

\n
\n
\n\n\n\n\n
\n\n\n\n", @@ -3083,28 +3457,6 @@ "hash": "7abcb308697f7f873d2ea758d4a0aed0", "highlights": [] }, - { - "title": "瞎扯 · 如何正确地吐槽", - "description": "
\"头图\"/
\n\n
\n
@小队长 :你这话说的,就算全世界国家都提倡吃屎健康,老子也不会吃。
\n
\n\n
\n
@定序王子 :很明显的造谣,编都不会编,非常低级的那种。 8 亿只是什么概念? 2023 年 ,广东常住人口达 1.27 亿人,算下来平均一人一年只吃 6 只鸡。 改成 300 亿就比较可信了。
\n
\n\n
\n
@宠物王大拿 :被公司辞退了!! 越想越气!! 然后跑到公司楼下把公司里的小流浪猫打劫走了!!!
\n
\n\n
\n
@Anjicn :儿子第一次喝可乐,说:就像蜘蛛在舌头上织网。
\n
\n\n
\n
@摸摸狗头 :有个大胆的想法:每年把珠穆朗玛峰加高 4cm ,是不是就相当于月球就没离开?
\n
\n
\n
\n\n\n
\n\n\n\n", - "content": "
\"头图\"/
\n\n
\n
@小队长 :你这话说的,就算全世界国家都提倡吃屎健康,老子也不会吃。
\n
\n\n
\n
@定序王子 :很明显的造谣,编都不会编,非常低级的那种。 8 亿只是什么概念? 2023 年 ,广东常住人口达 1.27 亿人,算下来平均一人一年只吃 6 只鸡。 改成 300 亿就比较可信了。
\n
\n\n
\n
@宠物王大拿 :被公司辞退了!! 越想越气!! 然后跑到公司楼下把公司里的小流浪猫打劫走了!!!
\n
\n\n
\n
@Anjicn :儿子第一次喝可乐,说:就像蜘蛛在舌头上织网。
\n
\n\n
\n
@摸摸狗头 :有个大胆的想法:每年把珠穆朗玛峰加高 4cm ,是不是就相当于月球就没离开?
\n
\n
\n
\n\n\n
\n\n\n\n", - "category": "", - "link": "https://daily.zhihu.com/story/9782605", - "creator": "", - "pubDate": "Wed, 16 Jul 2025 08:27:03 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "知乎", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "d3be966f2c44fa32e43c0e624aff446d", - "highlights": [] - }, { "title": "非洲有 15 万只鸵鸟,为什么狮子不去吃鸵鸟?", "description": "
\"头图\"/
\n

看下图,一头狮子被迫逃到树上瑟瑟发抖,底下有什么可怕的动物?

\n
\"\"
\n

答案是非洲野牛。

\n

这一幕发生在肯尼亚马赛马拉国家公园,由挪威摄影师 Olav Thokle 拍摄,经过数小时的对峙,野牛才慢慢离去,本就爬树本领普通的狮子,为了牢牢固定身躯,爪子都疼的厉害。

\n

在我们的印象中,非洲野牛是狮子的猎物,虽然它们是食草动物,但战斗力却不容小觑,一头成年非洲野牛体长约为 2.1~3.4 米,平均身高在 1.5 米左右,体重 500~800 公斤。

\n
\"\"
\n

最致命的莫过于那一对锋利且坚硬的牛角,每年都有大量狮子在捕猎野牛时,被锋利的牛角划伤或刺穿,又或者遭受一招“野牛冲撞”,要知道两头成年野牛碰撞的冲击力,那力量就像被一辆时速 50 公里汽车撞上来。

\n

大自然没有医院,所以每年都有大量狮子在狩猎野牛的过程中因伤死亡,然而有个奇怪的现象,那就是非洲明明有约 15 万只鸵鸟,为什么狮子不去猎杀鸵鸟呢?

\n
\"\"
\n

非洲鸵鸟体长约 180~300 公分,身高 240~280 公分,体重 130-150 公斤,平均寿命长达 60 年,并且没有非洲野牛一样的攻击性“武器”,从图片不难看出,鸵鸟的肉不少。

\n

然而在狮子的食谱中,牛科动物占比高达 65%,长颈鹿斑马综合占比 21%,疣猪角马综合占比 11%,其他动物占比 3%,而鸵鸟的占比连 1%都不到,这是为什么?原因主要有以下几点:

\n
\"\"
\n

1.鸵鸟警惕性高

\n

鸵鸟不会飞行,虽然在演化过程中因体型过大,逐渐丧失了飞行能力,但仍然属于鸟纲类,而鸟类的警惕性,从我们身边的麻雀、斑鸠、喜鹊等常见鸟类就能窥一斑而见全豹。

\n
\"\"
\n

鸵鸟的警惕性远超非洲野牛、长颈鹿、斑马等,即便在喝水时,也会有专门的鸵鸟负责放哨。

\n

非洲大草原地势平坦,而非洲鸵鸟体高 180~300 公分,就算平均 2.5 米,如此高度的鸵鸟能轻松获得辽阔的视野,失去了层峦叠嶂的地形,再加上狮子是集体狩猎,但凡狮群靠近,鸵鸟就能轻松发现并逃跑。

\n
\"\"
\n

2.鸵鸟奔跑速度快

\n

物种演化无时无刻都在进行,鸵鸟虽然失去了飞行能力,但动辄 150 公斤的体重压在两条腿上,使得鸵鸟的腿部肌肉极其发达。

\n

鸵鸟每一步的距离可达 3~5 公尺,奔跑速度可达 70km/h,想象一下你开着一辆车,脚踩油门到 70km/h 的速度,就能明白鸵鸟的奔跑速度有多快。

\n
\"\"
\n

再来看狮子的奔跑速度,据靠谱一点的数据显示,狮子奔跑速度可达 80km/h,看似狮子的速度超过鸵鸟,但狮子没有任何优势。

\n

鸵鸟占据视野优势,老远就能发现狮群,而狮子虽然速度高达 80km/h,但因体型过大,体力有限,通常只能维持 3 分钟,否则身体会因过热崩溃。

\n

而鸵鸟能以 70km/h 的速度持续奔跑 5 分钟以上,有些甚至超过 10 分钟,在耐力方面鸵鸟肯定完胜狮子。

\n
\"\"
\n

3.鸵鸟的反击

\n

狮群在狩猎时,即便猎杀野牛,基本上也会优先选择年迈的野牛或小牛犊下手,并且牛的反应相当迟钝,跟鸵鸟完全不是一个层面。

\n
\"\"
\n

之所以不敢跟壮年野牛硬碰硬,是因为越是食物链顶端的生物,越懂得趋利避害,但凡被野牛撞断一根骨头或者划伤一个口子,在野外都可能是致命伤。

\n

鸵鸟在反击时,会利用粗壮的小腿进行踢打,它们的大腿骨肌肉十分发达,并且腿很长,看下图,鸵鸟的双脚趾结构,能进一步提高攻击力,狮子一旦被鸵鸟踹一脚,也可能升级成致命伤。

\n
\"\"
\n

综合总结

\n

a.狮群还没靠近鸵鸟,就被鸵鸟发现,狩猎行动失败。

\n

b.狮群好不容易靠近鸵鸟,但还有一段距离,此时狮群开足马力奔袭,结果鸵鸟撒腿就跑,双方你追我逃,当追捕时间超过 3 分钟,狮群非但浪费了巨大能量,而且还没有收获,狩猎行动非但失败,还憋了一肚子气。

\n
\"\"
\n

c.狮群艰难的捕捉到一只鸵鸟,结果被鸵鸟踹了一脚,骂骂咧咧的吃着带羽毛的肉,一瘸一拐的回到老巢,没过几天因伤去世。

\n

狮子只有在食物极度匮乏,没有多余选择的情况下,才会想到去捕猎鸵鸟,例如生活在纳米布沙漠的狮子,但这支狮群的数量不超过 100 头,而绝大多数狮子都会选择 190-550 公斤区间的猎物,这是在非洲这片土地上长期演化出来的食物选择,必然有一定道理。

\n
\n
\n\n\n\n\n
\n\n\n\n", @@ -3127,28 +3479,6 @@ "hash": "432e133ac8c51dd02c10043413734b7d", "highlights": [] }, - { - "title": "世界上大多数人似乎普遍存在一种偏见,认为只有哺乳动物才算是真正的「动物」,造成这一现象的原因是什么?", - "description": "
\"头图\"/
\n

题述现象是人类中心主义的体现,主要归因于人自己是哺乳动物,相关信息的传播依赖社会文化和人脑的模式识别与匹配功能。大多数人的观念并不严格符合提问者的描述,但人们确实相当普遍地更关注哺乳动物的生存状态。

\n
    \n
  • 世界范围内,人们讨论关于生物的话题时,“俺寻思生物就是动物、动物就是四足动物、四足动物就是哺乳动物,充其量再算上鸟”的现象是很常见的。这是进化论的次要证据。
  • \n
\n

在日常生活中,你很容易发现,人们普遍认为人的生命比非人动物的生命更宝贵(或曰“高等”),黑猩猩、大猩猩等看起来比较接近人的动物的生命比花鸟虫鱼的生命更宝贵(或曰“高等”),非人动物的生命比植物的生命更宝贵,人的生命比亿万个细菌、病毒的生命更宝贵。

\n

这叫做“物种歧视 /Speciesism[1]”:

\n
    \n
  • 针对一个群体“仅因物种归属不同”而产生一系列价值差别判断、权利差别判断、特殊对待。
  • \n
\n

例如:

\n

人类物种歧视主义,或曰人类中心主义,指一些人会将非人类排除于人类的道德范围以外,视之为可随意处置的对象。这和道德成员资格的划定有关,其支持者可以提出非人类不能有效地参与人类社会、不能良好地遵守人类的社会规范——但是,人对他人的态度和行为往往也是多重标准的。

\n

“可爱动物保护主义”,指一些人会将长得不符合人的审美的动物视为可随意处置的对象,而对猫、狗等“可爱动物”进行法律保护。

\n
    \n
  • 这既涉及“人用来检测幼体的特征并降低攻击幼体的概率的机制(婴儿图式)对长得在某种程度上像人类幼体的猫狗也有效”,又涉及猫狗长期与人共生、双方的一部分基因已经针对互动进行过筛选(例如人和狗对视时双方的脑释放催产素),不能只归结于当事人双重标准——地球生物圈里的各种共生关系本来就是多重标准的。
  • \n
\n

“人类 - 大猩猩物种歧视主义”,指一些人出于人和大猩猩等类人猿的相似性而支持保护大猩猩的权利,胜过保护猫狗的权利,更胜过保护非哺乳类的权利。

\n
    \n
  • 在世界范围内,动物保护主义者保护哺乳类的积极性明显高于保护无脊椎动物。这或多或少地涉及自然选择塑造的自动判定同类的机制,让人更关注在演化上跟自己相似的生物。
  • \n
  • 所谓“神经系统的复杂程度”,在很大程度上就是“在神经系统方面与人的相似性”“。
  • \n
\n
\n
\n\n\n\n\n
\n\n\n\n

", - "content": "
\"头图\"/
\n

题述现象是人类中心主义的体现,主要归因于人自己是哺乳动物,相关信息的传播依赖社会文化和人脑的模式识别与匹配功能。大多数人的观念并不严格符合提问者的描述,但人们确实相当普遍地更关注哺乳动物的生存状态。

\n
    \n
  • 世界范围内,人们讨论关于生物的话题时,“俺寻思生物就是动物、动物就是四足动物、四足动物就是哺乳动物,充其量再算上鸟”的现象是很常见的。这是进化论的次要证据。
  • \n
\n

在日常生活中,你很容易发现,人们普遍认为人的生命比非人动物的生命更宝贵(或曰“高等”),黑猩猩、大猩猩等看起来比较接近人的动物的生命比花鸟虫鱼的生命更宝贵(或曰“高等”),非人动物的生命比植物的生命更宝贵,人的生命比亿万个细菌、病毒的生命更宝贵。

\n

这叫做“物种歧视 /Speciesism[1]”:

\n
    \n
  • 针对一个群体“仅因物种归属不同”而产生一系列价值差别判断、权利差别判断、特殊对待。
  • \n
\n

例如:

\n

人类物种歧视主义,或曰人类中心主义,指一些人会将非人类排除于人类的道德范围以外,视之为可随意处置的对象。这和道德成员资格的划定有关,其支持者可以提出非人类不能有效地参与人类社会、不能良好地遵守人类的社会规范——但是,人对他人的态度和行为往往也是多重标准的。

\n

“可爱动物保护主义”,指一些人会将长得不符合人的审美的动物视为可随意处置的对象,而对猫、狗等“可爱动物”进行法律保护。

\n
    \n
  • 这既涉及“人用来检测幼体的特征并降低攻击幼体的概率的机制(婴儿图式)对长得在某种程度上像人类幼体的猫狗也有效”,又涉及猫狗长期与人共生、双方的一部分基因已经针对互动进行过筛选(例如人和狗对视时双方的脑释放催产素),不能只归结于当事人双重标准——地球生物圈里的各种共生关系本来就是多重标准的。
  • \n
\n

“人类 - 大猩猩物种歧视主义”,指一些人出于人和大猩猩等类人猿的相似性而支持保护大猩猩的权利,胜过保护猫狗的权利,更胜过保护非哺乳类的权利。

\n
    \n
  • 在世界范围内,动物保护主义者保护哺乳类的积极性明显高于保护无脊椎动物。这或多或少地涉及自然选择塑造的自动判定同类的机制,让人更关注在演化上跟自己相似的生物。
  • \n
  • 所谓“神经系统的复杂程度”,在很大程度上就是“在神经系统方面与人的相似性”“。
  • \n
\n
\n
\n\n\n\n\n
\n\n\n\n

", - "category": "", - "link": "https://daily.zhihu.com/story/9782594", - "creator": "", - "pubDate": "Wed, 16 Jul 2025 08:27:03 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "知乎", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "5be57433b8cb4fc19a3834e90903ead3", - "highlights": [] - }, { "title": "斑马的斑到底有什么用?", "description": "
\"头图\"/
\n

斑马的黑白条纹可能是破坏边缘完整性的伪装色,主要作用于吸血昆虫。在野生斑马经常出没的地区,狮子、猎豹等捕食者看起来并未受到斑马黑白条纹的明显影响。

\n
    \n
  • 在非洲,马蝇、采采蝇等吸血昆虫传播多种流行病。斑马稀疏的毛发不擅长抵御吸血昆虫的叮咬,但是吸血昆虫对斑马的侵袭强度较低。2014 年,Caro 等进行了较大规模的统计,认为斑马的黑白条纹主要用于降低被吸血昆虫叮咬的概率[1]。
  • \n
\n

在此基础上,斑马的黑白条纹可能有助于体温调节[2]。

\n
    \n
  • 参考 2 称,斑马身上黑色毛发的温度可以比白色毛发高 12 至 15 摄氏度,在局部产生有规律的气流。马属动物的汗液含有泡沫蛋白,汗液的表面张力较低,有助于毛发前端的蒸发冷却。观察显示,斑马可以在白色毛发保持倒伏的同时将黑色毛发竖立起来,这大概可以和上述汗液搭配散热。此外,在气温较低时,黑色毛发可能有助于吸热。
  • \n
\n
\n

不限于斑马,破坏轮廓完整性的伪装示意图:

\n
\"\"
By Hugh B. Cott - Adaptive Coloration in Animals; image available at http://camouflage.osu.edu/cott.html, Fair use, https://en.wikipedia.org/w/index.php?curid=35274594
\n

2019 年,一项实验显示,在牛身上画出类似斑马的条纹,会降低螫蝇、角蝇等双翅目吸血昆虫叮咬牛的频率。斑马状条纹可能干扰吸血昆虫视觉系统的运动检测,让它们着陆在牛身上的成功率下降[3]。

\n
\"\"
实验用牛
\n
\"\"
CONT:无条纹牛,B and W:黑白条纹牛,B:黑条纹牛
\n

吸血昆虫仍被有条纹的牛的视觉特征、气味吸引,可以多次尝试降落,不会简单地放弃叮咬有条纹的牛。条纹在实验中提供的保护效果并不强于看起来更平凡的杀虫剂。

\n

读者亦可参考熊猫:

\n

熊猫身体和四肢的配色在较远距离上会有效地破坏轮廓完整性、发挥伪装功能,在较近距离上通过背景匹配(黑色皮毛与树干、阴影匹配,白色皮毛与树叶、雪匹配,其余皮毛[4]与岩石、地面匹配)在一定程度上发挥伪装功能[5]。

\n
\"\"
https://www.nature.com/articles/s41598-021-00742-4/figures/1 未经严格筛选的图片
\n
\"\"
https://www.nature.com/articles/s41598-021-00742-4/figures/2
\n
\n
\n\n\n\n\n
\n\n\n\n

", @@ -3171,28 +3501,6 @@ "hash": "2c5dce9634a6cbf53698f206807d80b3", "highlights": [] }, - { - "title": "瞎扯 · 如何正确地吐槽", - "description": "
\"头图\"/
\n\n
\n
@南瓜周 :沙僧骂街之前先鞠了一躬,八戒和悟空正骂着呢,看见沙僧鞠躬也跟着鞠躬。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@挖坟老狗 :我再说一遍, cos 不知道怎么处理就直接万能公式套上去。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@深港双城男 :能喝酒就不要喝水,把水留给不会喝酒的孩子。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@过世猪猪 :尖叫的瓶子,优秀到我一点都不记得这饮料是什么味道。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@棠风 :大清早的,不知道哪个小孩打错电话, 要跟我请假。 反正我是给他批准了……
\n
\n
\n
\n\n\n
\n\n\n\n", - "content": "
\"头图\"/
\n\n
\n
@南瓜周 :沙僧骂街之前先鞠了一躬,八戒和悟空正骂着呢,看见沙僧鞠躬也跟着鞠躬。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@挖坟老狗 :我再说一遍, cos 不知道怎么处理就直接万能公式套上去。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@深港双城男 :能喝酒就不要喝水,把水留给不会喝酒的孩子。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@过世猪猪 :尖叫的瓶子,优秀到我一点都不记得这饮料是什么味道。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@棠风 :大清早的,不知道哪个小孩打错电话, 要跟我请假。 反正我是给他批准了……
\n
\n
\n
\n\n\n
\n\n\n\n", - "category": "", - "link": "https://daily.zhihu.com/story/9782579", - "creator": "", - "pubDate": "Tue, 15 Jul 2025 08:27:03 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "知乎", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "acfc0018a6d1f24a71ab7931b2488200", - "highlights": [] - }, { "title": "发明魔芋的前辈是经历了什么?", "description": "
\"头图\"/
\n

其实没有那么夸张,最重要的就是水煮。

\n

我们可以对照土法加工魔芋的步骤来看看祖先的研发过程。

\n

1.首先是外观。

\n

大型块茎,切开乳白色含有大量淀粉状物质,

\n

这对于人类来说基本就是“千方百计想要吃”的食材样子了。

\n

剩下的问题就是“怎么吃,好吃么?”

\n
\"\"
\n

魔芋这个东西有毒,但毒性其实不大。

\n

生吃的话,少量会出现恶心、呕吐、腹泻、出汗,对于时常饥荒连草根、树皮都能吃的古代人来说就算是“可以付出的代价了”。

\n

而且只要不是剧毒,就可以不断尝试各种处理方法,看看怎么让吃了之后的副作用减弱。

\n
提示:如果大量食用生魔芋,严重时也会呼吸中枢完全麻痹而导致死亡。大家不要轻易尝试。
\n

2.切碎和浸泡。

\n

这步算是处理大部分弱毒性食材的标准方式。

\n
\"\"
\n

因为植物的毒性很大程度是生物碱,生物碱的分子量通常较小,所以容易溶解于水。

\n

比如马铃薯去毒法里面,就有一种水泡法。浸泡 12 小时候可以去马铃薯毒性。

\n
发芽的马铃薯最好还是扔掉,不值当冒险,这里只是说理论的去毒方法。
\n

而块茎一般含有多糖、淀粉,是比较不容易溶解于水里的,

\n

所以浸泡投洗算是古代比较常见的植物脱毒预处理方式。也最简单容易操作。

\n
魔芋含有的葡甘聚糖(KGM),也是一种具有特殊理化性质的天然高分子多糖。
\n

3.磨碎熬煮。

\n

磨碎是为了进一步增加反应速度,加热熬煮则是人类掌握比较成熟的脱毒方式。

\n
\"\"
\n

像是四季豆、扁豆、金针菇、木薯、蚕豆、黄花菜等,都是必须彻底加热才能吃的食材。

\n

这几种植物原理不同,比如豆角是皂素和红细胞凝集素;蚕豆是巢菜碱苷成分及蚕豆嘧啶葡糖苷;木薯是亚麻仁苦苷,金针菇和黄花菜是秋水仙碱,还有一些植物含有较高草酸。

\n

而破坏生物碱的方式,古代人类最容易掌握的就是加热。

\n

虽然也有不少毒素,比如不少菌类含有的毒素异常稳定,具有耐高温的特性,但这更多是一种“偶然”,因为在自然界中植物不需要面对一百度的高温烹煮。

\n

魔芋的毒性主要应该是生物碱糖苷,这类物质比较常见于植物块茎里。

\n

比如土豆里含有的龙葵碱,就是种典型的生物碱糖苷,难于被胃肠道吸收,会导致肠胃不适。

\n

因为他们对人体的肠胃膜结构油一定破坏作用,还能抑制胆碱酯酶的消化。

\n

所以,凉拌土豆丝是焯水后凉拌的,厨房菜鸟切记。

\n
\"\"
\n

好,我们回到魔芋加工过程。

\n

4.点碱水。

\n

这一步其实和“去毒”应该没有关系。

\n

因为中和生物碱一般是用酸,而加碱显然无助于分解。

\n

如果不考虑外形,煮熟后的魔芋糊糊也是可以吃的。但是不好保存。

\n
\"\"
\n

很可能古人是先吃了很多年的魔芋糊,然后才逐步研究怎么让这个东西凝结,变成类似豆腐的形状,方便保存和携带。

\n

魔芋加碱水的主要原因是为了改善其质地和口感。

\n

让碱水和魔芋中的谷蛋白酶反应,失去活性,从而凝固魔芋,增加其黏度和弹性。‌

\n

农村的这一步是用草木灰(主要成分是碳酸钾(K2CO3))浸泡过滤的水来“点”魔芋。

\n
现在食品工艺,大都加入碱性的氢氧化钙来处理。
显然氢氧化钙更干净、安全,而且是残留量不需限定的加工助剂。
\n
\"\"
\n

用草木灰来凝固蛋白、脱水,也算是古人掌握的一种常见加工方法。

\n

比如用在鸭蛋上,草木灰包裹可以制造松花蛋(蛋白变性作用),把豆腐包裹可以制造出灰培豆腐(脱水作用)。

\n

同时,因为草木灰相对卫生(燃烧后相当于消毒),可以调节食物酸碱度让口感更好,还能长期保存食物(吸水让食物表面干燥),所以古人在食材加工中经常会尝试添加。

\n
哪怕加错了就是多喝了点碱水,也没有大问题。
\n

比如“碱水粽”是用草木灰水浸泡糯米,桑叶凉粉是用草木灰水与桑叶汁制作。在四川,还有用草木灰水和大米制作的“灰水馍馍”。

\n

这些显示出我们的祖先做食物时,经常会尝试添加草木灰,看看会有什么变化。

\n
\"\"
\n

5.成型切分。

\n

用碱水点过之后,快速搅拌、冷却,魔芋就会凝结成块状。可以用竹篾划开。

\n

就成了块状的土法魔芋了,因为草木灰和过滤不彻底,经常是灰褐色的。

\n
\"\"
草木灰魔芋
\n

这里说一下碱水让魔芋成型的化学原理,不感兴趣的可以跳过。

\n
魔芋的主要成分是葡甘露聚糖,由葡萄糖和甘露糖按一定比例结合而成的的长链大分子。
在这个大分子上,除了主链上的葡萄糖和甘露糖之外,还有一些特别的乙酰基。
正是这些乙酰基的存在,阻止了魔芋多糖分子的“亲密聚合”,所以加工之前的魔芋并不是魔芋块、魔芋丝那样 Q 弹的样子。
只有加碱性物质才能把乙酰基的阻拦作用“抵消”,让魔芋多糖分子聚集凝固,并且把很多水分锁在其中,最终摇身一变成为魔芋丝、魔芋豆腐等弹滑的状态。
\n

古人显然不懂这些深奥原理,但不阻碍他们在实验草木灰水的时候,发现了效果。

\n

至此,魔芋就成了我们比较常见的样子,颜色深浅要看熬煮过程的火候和碱水。

\n

使用草木灰的会比较灰暗,颜色深,而使用食用碱来做添加剂,魔芋会更透亮,好看。

\n
\"\"
土法碱水魔芋
\n

一般在魔芋凉了切块后,食用前还会进行二次煮制。

\n

这样可以让口感更有弹性。也防止表面滋生细菌。

\n

总结一下,

\n

古人应该不是一步到位把魔芋的制作过程发明的。

\n

而是发现了可食用的块茎,先凑活生着吃,发现少量毒不死,但吃多了恶心、呕吐、拉肚子。

\n

于是试着洗一洗,发现好像好一点,再试试烤熟了、煮熟了吃,发现又好一些。

\n

等吃腻了糊糊,试着往里面加点木炭粉、草木灰,乱七八糟厨房附近有的,吃不死人的东西。

\n

发现居然变成块了,更容易保存吃好几天。

\n

下次试试只加草木灰的过滤水,原来也可以。颜色更好看了。

\n

于是,经过漫长的摸索,这种“新型豆腐”的加工方法就算定型了。

\n

不得不过,古代人为了吃点好东西,的确是能发动各种研究精神啊。

\n
关注也说,阅读更多有趣的思想。
\n

当年苏联挖地球为什么挖到 12262 米就停止了?明明不开车为啥还被称为副驾驶?假如忽然火了?怎么接住泼天的富贵。

\n
\n
\n\n\n\n\n
\n\n\n\n", @@ -3215,28 +3523,6 @@ "hash": "e55b066bd5cb0fc524a10242af37695b", "highlights": [] }, - { - "title": "少年贪食荔枝后昏迷,确诊为「荔枝病」引发低血糖,为何荔枝是高糖水果会导致低血糖?其他水果也会这样吗?", - "description": "
\"头图\"/
\n

省流:肝脏:视野盲区,还以为是亮氨酸呢,刹不住酶,我们都在用力地活着。

\n

嘛……其实这事真的不是新闻说的那样是因为果糖不能用 + 胰岛素分泌过多导致的……

\n

果糖被吸收后,经过肝门静脉运输到肝,绝大部分被肝吸收,只有一小部分进入血液循环,因此基本不会刺激胰岛素分泌。

\n

那是什么导致了荔枝病呢?答案是——荔枝等无患子目植物中含有的化学防御性物质次甘氨酸 A(Hypoglycin A,准确译名应该是降糖毒素 A)和它的类似物亚甲基环丙基甘氨酸(methylenecyclopropylglycine,MCPG),它俩都是非蛋白质氨基酸,存在于无患子目(尤其是无患子科)植物的种子及未成熟果实中。

\n
\"\"
次甘氨酸 A
\n
\"\"
亚甲基环丙基甘氨酸
\n

那这小小的次甘氨酸又是怎么导致低血糖的呢?

\n

诶,它本身不导致低血糖,意不意外?

\n

虽然它本身确实不导致低血糖,但是肝脏非得作死有什么办法呢?本来它是易溶于水的氨基酸,丢给肾脏扔掉就好了,结果肝脏一没注意,给看成亮氨酸转氨了,转氨之后还给塞进支链酮酸脱氢酶里脱氢了,结果把无害的次甘氨酸 A 硬生生变成了有毒的亚甲基环丙基乙酸(Methylene cyclopropyl acetic acid,MCPA)。

\n
\"\"
亚甲基环丙基乙酸
\n

(肝脏:视野盲区,还以为是亮氨酸呢,刹不住酶,我们都在用力地活着。)

\n
\"\"
支链酮酸脱氢酶复合物(异三聚体)由三个不同的酶组成,分别是α- 酮酸脱氢酶(E1)、二氢硫酰基转酰基酶(E2)和二氢脂肪酰胺脱氢酶(E3)
\n
\"\"
二氢脂肪酰胺脱氢酶从各个方向观察的构象
\n

可以注意到,由支链酮酸脱氢酶复合物中出来的酸已经是与辅酶 A 结合的酰基辅酶 A形态了,而正是这个无法进一步代谢的亚甲基环丙基乙酰辅酶 A导致了后续的一系列酶出了问题,最终导致了低血糖的发生。

\n

那么话讲到这里就有同学要问了:老师老师,这个东西到底是怎么导致酶出问题的啊?

\n

那我问你,糖异生要不要调控?如果要调控你说这样的话啊?那我问你,那你糖异生怎么调控那我问你……

\n

咳咳,不搞抽象了,糖异生的调控主要发生在丙酮酸羧化酶、磷酸烯醇式丙酮酸(PEP)羧激酶、1,6- 二磷酸果糖(F-1,6-BP)磷酸酶这三种酶中,其中丙酮酸羧化酶受到乙酰辅酶 A的正向调控和ADP的负向调控,PEP 羧激酶受ADP的负向调控,F-1,6-BP 磷酸酶受AMP、F-2,6-BP的负向调控和柠檬酸的正向调控。

\n

现在问题来了,在进行糖异生的情况下,乙酰辅酶 A 肯定不会是从糖中来,肯定是脂肪酸代谢的结果,但是脂肪酸要形成乙酰辅酶 A 就要进行β氧化,要进行β氧化就需要辅酶 A……诶等等,我辅酶 A 呢?丸辣,辅酶 A 全被变成亚甲基环丙基乙酰辅酶 A了!

\n

于是乎,糖异生就被一颗小小的荔枝搞瘫痪了。

\n

那么又有同学要问了:老师,用不了葡萄糖我用酮体还不行吗?酮体一样可以穿过血脑屏障啊?

\n

问得好,那我问你:酮体是由什么合成的?

\n
\"\"
乙酰乙酸,一看就知道是两个乙酰辅酶 A 缩合而来的。
\n
\"\"
丙酮,由乙酰乙酸自发或酶催化脱羧而来
\n
\"\"
β- 羟基丁酸,由乙酰乙酸还原而来
\n

酮体都是由乙酰辅酶 A 直接合成为乙酰乙酰辅酶 A,然后形成 HMG-CoA(β- 羟基 -β- 甲基戊二酸单酰辅酶 A),最后再形成乙酰乙酸这一过程得到的,那么如果没有乙酰辅酶 A,拿什么去合成酮体呢?

\n

糖指望不上,酮体也合成不了,人不就低血糖倒了嘛,很正常。

\n

以上。

\n
\n

这玩意有肝毒性,不能用来治糖尿病!!!

\n

这玩意也会抑制脂肪酸氧化(脂肪酸氧化需要先与辅酶 A 结合为脂酰辅酶 A),不能用来减肥!!!

\n
\n
\n\n\n\n\n
\n\n\n\n", - "content": "
\"头图\"/
\n

省流:肝脏:视野盲区,还以为是亮氨酸呢,刹不住酶,我们都在用力地活着。

\n

嘛……其实这事真的不是新闻说的那样是因为果糖不能用 + 胰岛素分泌过多导致的……

\n

果糖被吸收后,经过肝门静脉运输到肝,绝大部分被肝吸收,只有一小部分进入血液循环,因此基本不会刺激胰岛素分泌。

\n

那是什么导致了荔枝病呢?答案是——荔枝等无患子目植物中含有的化学防御性物质次甘氨酸 A(Hypoglycin A,准确译名应该是降糖毒素 A)和它的类似物亚甲基环丙基甘氨酸(methylenecyclopropylglycine,MCPG),它俩都是非蛋白质氨基酸,存在于无患子目(尤其是无患子科)植物的种子及未成熟果实中。

\n
\"\"
次甘氨酸 A
\n
\"\"
亚甲基环丙基甘氨酸
\n

那这小小的次甘氨酸又是怎么导致低血糖的呢?

\n

诶,它本身不导致低血糖,意不意外?

\n

虽然它本身确实不导致低血糖,但是肝脏非得作死有什么办法呢?本来它是易溶于水的氨基酸,丢给肾脏扔掉就好了,结果肝脏一没注意,给看成亮氨酸转氨了,转氨之后还给塞进支链酮酸脱氢酶里脱氢了,结果把无害的次甘氨酸 A 硬生生变成了有毒的亚甲基环丙基乙酸(Methylene cyclopropyl acetic acid,MCPA)。

\n
\"\"
亚甲基环丙基乙酸
\n

(肝脏:视野盲区,还以为是亮氨酸呢,刹不住酶,我们都在用力地活着。)

\n
\"\"
支链酮酸脱氢酶复合物(异三聚体)由三个不同的酶组成,分别是α- 酮酸脱氢酶(E1)、二氢硫酰基转酰基酶(E2)和二氢脂肪酰胺脱氢酶(E3)
\n
\"\"
二氢脂肪酰胺脱氢酶从各个方向观察的构象
\n

可以注意到,由支链酮酸脱氢酶复合物中出来的酸已经是与辅酶 A 结合的酰基辅酶 A形态了,而正是这个无法进一步代谢的亚甲基环丙基乙酰辅酶 A导致了后续的一系列酶出了问题,最终导致了低血糖的发生。

\n

那么话讲到这里就有同学要问了:老师老师,这个东西到底是怎么导致酶出问题的啊?

\n

那我问你,糖异生要不要调控?如果要调控你说这样的话啊?那我问你,那你糖异生怎么调控那我问你……

\n

咳咳,不搞抽象了,糖异生的调控主要发生在丙酮酸羧化酶、磷酸烯醇式丙酮酸(PEP)羧激酶、1,6- 二磷酸果糖(F-1,6-BP)磷酸酶这三种酶中,其中丙酮酸羧化酶受到乙酰辅酶 A的正向调控和ADP的负向调控,PEP 羧激酶受ADP的负向调控,F-1,6-BP 磷酸酶受AMP、F-2,6-BP的负向调控和柠檬酸的正向调控。

\n

现在问题来了,在进行糖异生的情况下,乙酰辅酶 A 肯定不会是从糖中来,肯定是脂肪酸代谢的结果,但是脂肪酸要形成乙酰辅酶 A 就要进行β氧化,要进行β氧化就需要辅酶 A……诶等等,我辅酶 A 呢?丸辣,辅酶 A 全被变成亚甲基环丙基乙酰辅酶 A了!

\n

于是乎,糖异生就被一颗小小的荔枝搞瘫痪了。

\n

那么又有同学要问了:老师,用不了葡萄糖我用酮体还不行吗?酮体一样可以穿过血脑屏障啊?

\n

问得好,那我问你:酮体是由什么合成的?

\n
\"\"
乙酰乙酸,一看就知道是两个乙酰辅酶 A 缩合而来的。
\n
\"\"
丙酮,由乙酰乙酸自发或酶催化脱羧而来
\n
\"\"
β- 羟基丁酸,由乙酰乙酸还原而来
\n

酮体都是由乙酰辅酶 A 直接合成为乙酰乙酰辅酶 A,然后形成 HMG-CoA(β- 羟基 -β- 甲基戊二酸单酰辅酶 A),最后再形成乙酰乙酸这一过程得到的,那么如果没有乙酰辅酶 A,拿什么去合成酮体呢?

\n

糖指望不上,酮体也合成不了,人不就低血糖倒了嘛,很正常。

\n

以上。

\n
\n

这玩意有肝毒性,不能用来治糖尿病!!!

\n

这玩意也会抑制脂肪酸氧化(脂肪酸氧化需要先与辅酶 A 结合为脂酰辅酶 A),不能用来减肥!!!

\n
\n
\n\n\n\n\n
\n\n\n\n", - "category": "", - "link": "https://daily.zhihu.com/story/9782563", - "creator": "", - "pubDate": "Tue, 15 Jul 2025 08:27:03 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "知乎", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "6b64eed1da2738771dce46122e27fcd1", - "highlights": [] - }, { "title": "孩子因基因突变出生几个月后眼睛变成蓝色,如何从医学角度解释这种现象?哪些因素会导致基因突变?", "description": "
\"头图\"/
\n

目前当事人已经说明,孩子的蓝眼是由瓦登伯格综合征(Waardenburg Syndrome)引起的。

\n

但仍然有网友玩梗说到”“这小孩怕不是混血”的玩笑式推测,如果单看结果,这种推测符合来自对“蓝眼=欧美血统”的印象。

\n

不过从医学角度来看,蓝色眼睛并非某一人种的专属特征,也不仅仅是基因突变带来的病理表现。

\n

有些宝宝一开始眼睛偏灰偏蓝,随着黑色素增加,会慢慢变深;而也有少数孩子,黑色素合成减少,眼睛反而变浅、变蓝。

\n

实际上,蓝眼睛的形成机制要复杂得多。除了特定基因突变导致的病理性浅色虹膜,更多时候,眼睛颜色取决于父母双方遗传给孩子的多个基因组合——这些基因共同决定了色素细胞的数量、活性以及色素的种类和沉积程度。

\n

生理性方面,可以以这个顺序来理解:虹膜→肤色 / 血统→黑色素→基因

\n

我们来先说下生理的蓝眼睛是如何形成的。新生儿的眼睛颜色和肤色都受到黑色素含量的影响。总体上,浅肤色人群(如白人)新生儿更可能出生时眼睛呈蓝色或灰色,而深肤色人群(如亚洲人、非洲人)则多出生时即为棕色或深色眼睛。

\n

一种观点认为,人类眼睛颜色的地理分布可能与光照强度有关。在阳光充足的赤道附近,人群普遍虹膜色素较深,可能有助于阻挡部分紫外线;而在高纬度地区,虹膜颜色较浅,或许有利于增加光线透过率。不过,这仍属于演化假说,目前尚无确凿证据说明人眼色进化是光照压力直接导致的。

\n

目前普遍认可虹膜的颜色主要由黑色素含量决定。当黑色素含量高时眼睛呈现棕色,含量低时则呈现蓝色或绿色,不同类型的黑色素以及色素体的密度和结构会影响最终颜色。而再深层次探讨,黑色素又由基因决定,浅肤色人群(如白人)主要是由于OCA2 和 HERC2 基因的变异。

\n
\"\"
\n

OCA2 编码 P 蛋白,HERC2 某些调控区变异可抑制 OCA2 表达,从而减少黑色素,导致蓝眼形成。简单的来说,就是携带 HERC2 基因的婴儿眼睛呈蓝色,并且倾向于保持蓝色;而携带 OCA2 基因的婴儿眼睛则呈绿色或棕色。

\n

Punnett Square(庞尼特方格 / 庞氏表)来预测宝宝的眼睛颜色是很多人常见的做法,但在现代遗传学视角下,这种方法只能作为一个非常初步、简化的工具,实际上没有万无一失的方法。

\n
\"\"
\n

比如以上这个眼睛颜色预测图(Punnett square )虽然第一组表明两个蓝眼睛的父母极生出棕色眼睛的孩子的概率很低,但如果父母双方都携带棕色眼睛的隐性 DNA 变异,他们的孩子仍然有可能遗传棕色眼睛,毕竟父母的眼睛颜色(表型)不等于他们的基因组合(基因型),在多基因性状中,还有隐藏的等位基因,此外还存在基因互作、调控表达、表观遗传等复杂机制。

\n

换句话说,孩子的眼睛颜色,不只是“妈妈是黑眼,爸爸是棕眼”这么简单的加法题,而是涉及复杂的遗传表达和调控机制,不可能完全准确预测。

\n

而在某些特殊情况下,比如像本新闻中的瓦登伯格综合征[1],则是由于调控色素合成的关键基因发生突变,导致虹膜黑色素缺失或显著减少,进而呈现出显著的浅蓝或异色双眼。这类改变,虽然稀有,但确实存在于亚洲人群中。

\n

瓦登伯格综合征并不是一个生理情况下的蓝眼睛,而是一种罕见的遗传性疾病,主要由基因突变引起,常见的相关基因包括 PAX3、MITF、SOX10 等。

\n

这些基因在胚胎发育过程中起着关键作用,当这些基因发生突变时,会影响黑色素细胞的正常发育和功能,产生包括、但不限于——色素沉着异常、听力系统发育障碍等等。当虹膜中黑色素含量减少,光线在虹膜表面发生散射,从而呈现出蓝色。也就是说,瓦登伯格综合征的蓝眼睛是疾病的表现形式之一。

\n

那还有没有其他变成蓝眼睛的可能原因呢?当然也有可能。

\n

白化病患者由于 OCA2 严重突变导致全身黑色素合成缺陷,虹膜淡蓝、灰色甚至透出眼底血管的颜色。由于患者虹膜因色素缺失,透光性增强,眼睛会对强光异常敏感,所以我们通常建议需佩戴防紫外线眼镜保护眼睛,这也是大家不常注意到他们虹膜的原因。

\n

还有一些欧美人的婴儿在出生时眼睛是蓝灰色(因为彩虹膜内的黑色素尚未完全生成或分布,其结构容易让光线散射,造成“蓝色外观”),等随着孩子慢慢长大(一般在出生后 6~12 个月内),随着黑色素合成的进行,眼睛会逐步变为棕色、绿色或保持蓝色。这个就和突变没什么关系了。

\n

此外也不能排除环境因素和染色体异常。怀孕期间如果母亲接触到放射线、有害化学物质、某些药物或病毒感染,也可能干扰胎儿 DNA 结构,引起突变。所以这也是为什么产科的医生非常强调孕妇进行遗传咨询和相关检测的原因。

\n
\n
\n\n\n\n\n
\n\n\n\n", @@ -3259,28 +3545,6 @@ "hash": "2232eb02b1f04636ab86673493880117", "highlights": [] }, - { - "title": "瞎扯 · 如何正确地吐槽", - "description": "
\"头图\"/
\n\n
\n
@执笔顾长安 :奶酪体,荧光笔,每次考试必垫底; 狗爬体,借的笔,一问成绩六百几。
\n
\n\n
\n
@将浊 :不知道啊,学校里说南京打江苏,我就去了。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@知知 :小时候想养猫,费尽千辛万苦说服家长。 当时给出的理由是:「猫长大了可以抓老鼠。」 结果猫长大了……他不会抓老鼠…… 有次听到奶奶和别人聊天说,这猫不会抓老鼠,干脆哪天送走得了。 给我急得,自己抓了三只老鼠,用绳子把它们勒死,再送到隔壁猫嘴下求(逼)他啃几口,再扔自己家猫窝里 第二天给我奶奶惊呆了,逢人就说 不抓而已,一抓就是三只……
\n
\n\n
\n
@柠檬螃小蟹 :初看此图当笑话,结果我们公司就是这么干的!
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@煮自己的唐僧 :你见过骨科手术嘛。 这么说吧。 骨科本质就是比较注重卫生的木匠。
\n
\n
\n
\n\n\n
\n\n\n\n

", - "content": "
\"头图\"/
\n\n
\n
@执笔顾长安 :奶酪体,荧光笔,每次考试必垫底; 狗爬体,借的笔,一问成绩六百几。
\n
\n\n
\n
@将浊 :不知道啊,学校里说南京打江苏,我就去了。
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@知知 :小时候想养猫,费尽千辛万苦说服家长。 当时给出的理由是:「猫长大了可以抓老鼠。」 结果猫长大了……他不会抓老鼠…… 有次听到奶奶和别人聊天说,这猫不会抓老鼠,干脆哪天送走得了。 给我急得,自己抓了三只老鼠,用绳子把它们勒死,再送到隔壁猫嘴下求(逼)他啃几口,再扔自己家猫窝里 第二天给我奶奶惊呆了,逢人就说 不抓而已,一抓就是三只……
\n
\n\n
\n
@柠檬螃小蟹 :初看此图当笑话,结果我们公司就是这么干的!
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"\"\n
 
\n
 
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
\n\n
\n
@煮自己的唐僧 :你见过骨科手术嘛。 这么说吧。 骨科本质就是比较注重卫生的木匠。
\n
\n
\n
\n\n\n
\n\n\n\n

", - "category": "", - "link": "https://daily.zhihu.com/story/9782554", - "creator": "", - "pubDate": "Mon, 14 Jul 2025 08:27:04 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "知乎", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "e31c61c2e82cba6d6292e51dd346799d", - "highlights": [] - }, { "title": "父母会嫉妒自己的子女吗?为什么?", "description": "
\"头图\"/
\n
“你也得吃点苦,才知道生活不容易。”
“我小时候哪有你这待遇?”
“我妈也从来不管我,我不也长大了?”
“这有什么的,我也是这么被养大的,我不也好好吗?”
\n

心理咨询中,父母可能会这样说。但真的是这样吗,你真的“好好的”吗?这听起来像是在自证,实际上却往往是对伤痛的否认与传递。

\n

这些说辞的背后,是父母不愿被看见的伤痛,因为从未被真正处理过,就只能以另一种形式延续下去。心理创伤不会因为扛过来了就自动痊愈,反而可能成为父母控制孩子、否定孩子、阻碍孩子发展的潜在动力。

\n

而那些看起来毫无道理的控制与打压的行为,背后往往藏着人性中最复杂的情绪之一——父母对孩子的嫉妒。

\n

01 隐藏在爱背后的嫉妒

\n

“你还真会享受。”

\n

听起来好像是父母在感叹孩子的美好生活,但可能隐藏着嫉妒的情绪。更准确地说,是一种混杂了悲伤、羡慕、愤怒、失落、无力的复杂感受。

\n

当一个孩子有了父母从未拥有过的幸福、自由和选择权,这对父母来说,可能不只会带来欣慰的感觉,还可能是一种提醒:我从未拥有过这些,我失去了我的幸福,而你有了。

\n

就像一个小时候饿过很久的人,即使现在已经不用饿肚子了,但看到别的小孩丰盛地吃着饭,会不由自主地泛起不满:你咋这么幸运呢,凭什么?孩子的快乐,在一些父母眼中,是不公平的证据。

\n

他们感到自己的苦无人知晓,也会怀疑:“孩子是不是就此要离开我了?”他们焦虑,随着孩子越发独立自主和成功,自己可能就再也无法掌控这个孩子了。

\n

于是,孩子想走向光亮的一步,就被一句“我看也不过如此。”泼了冷水。孩子想分享自己的幸福,就换来一句“你可真会享福,我可享不到这些喽”的阴阳怪气。

\n

这种情绪的核心,不是不够爱孩子,而是创伤太深。

\n

02 “你比我幸福,那我算什么?”

\n

在一些家庭中,父母对子女的态度夹杂着微妙的竞争色彩。

\n

有时是回避或拒绝帮助:

\n
“我小时候也没人帮我。”
\n

有时是明目张胆的控制:

\n
“你听我的就不会错。”
\n

有时则是更隐秘的拉扯:

\n
“你以为你现在就比我强了吗?”
\n

他们并不是在计较一顿饭或者一句赞扬。

\n

他们在意的可能是:你是否正在活出我从未拥有过的人生?这会让一些父母觉得自己失败、无力、被超越,而这一切,恰好都是他们最害怕面对的情绪。

\n

最常见的解决方式不是面对自己的伤痛和失败,因为这太痛苦了,更轻松的方法是把孩子“拉下来”,用否定、指责、打压的方式,恢复自己对孩子的掌控感。

\n

潜意识中,如果孩子永远不超过他们、依赖他们,他们会更好受。

\n

03 孩子不是附属品,更不是补偿

\n

一位母亲说:“孩子拥有了我没拥有过的一切,就像是我的幸福被抢走了一样。

\n

这并不是她不爱孩子,而是她内心那个委屈的小孩从未有机会疗愈。

\n

自体心理学中称之为“自体虚弱”,他们从小缺乏被理解、被肯定的经验,内心长时间处于压抑和否认的状态,所以只能通过孩子的依赖,来补偿自己的匮乏。当孩子不再需要他们时,他们就会感到无比痛苦、无价值,甚至失控。

\n

于是,一些父母会将孩子当作自己的延伸,必须听话、忠诚、感恩。他们很难接受孩子的分化、独立,更不能接受孩子“不属于自己”。

\n

但孩子是独立的个体,他们不是父母未竟梦想的载体,也不是父母人生的安慰奖。

\n

04 “我爸妈见不得我好”,这不是错觉

\n

“我爸妈见不得我开心,每次我有点好事,他们就要来挑刺。”

\n

“有一次我正在超级开心的疯玩儿,妈妈突然过来揪住我说:我小时候从来不会像你这样胡闹。”

\n

这些声音反映了孩子真实的情感创伤:自己最初的欢欣和成就,常常换来的不是父母的共鸣和欣慰,而是冷漠与怀疑,甚至打压。

\n

于是这些孩子开始学会报喜不报忧、降低存在感,学会为了换取爱而牺牲自己的一部分。久而久之,成就带来愧疚,幸福也会带来不安。

\n

这并不正常,这是因为你习惯了隐藏,害怕真实的自己会“太刺眼”,引来不满或攻击。

\n

05 “背叛”父母,是一种必要的成长

\n

如果你成长在这样的环境中,请先告诉自己一件事:你没有疯,你没错。

\n

你所感受到的那些嫉妒、控制、冷漠、否定,是真实存在的情感,它们对你产生了影响,而这不是你的责任。你不需要强迫自己原谅和理解,不需要合理化那些伤害。你首先需要的是:看见自己,接纳自己。

\n

看见父母也是受伤的个体,但不代表你要继续承受他们的伤痛。看见那些控制背后的无力和痛苦,但不代表你要牺牲自己来安抚他们的脆弱。看见那句“我小时候也这样”,其实不是教育方式的证明,而是创伤的延续。

\n

改变,不是反抗父母,而是开始选择为自己而活。当你试图做回自己,找到自己时,你可能会感到一种对父母的背叛感,但这不是对父母的抛弃,而是对自己的诚实,不必愧疚。

\n

你会开始设定边界,明确告诉自己哪些是你愿意接受的,哪些不是。你会不再急于讨好,不再急于证明,不再把自己的生活建立在“获得他们认可”的基础上。

\n

学着为自己的情绪负责,不再无条件承接他们的情绪。当遭遇贬低、抱怨或嘲讽时,区分“这是他们的课题”而非你的缺陷,不再自责、压抑、或陷入争辩的漩涡。

\n

你会发现,当你真的不再执着于父母的爱与认可,你反而更有能力去理解和拥抱他们,也更能看到他们曾经的局限。

\n

因为你终于从他们的影子里,走出来了。

\n

06 孩子是镜子,让我们看见自己

\n

对于父母来说,孩子常常像一面镜子,照见我们内心深处那些未曾被满足的愿望。看到孩子无拘无束地表达自己、追求喜欢的事物,我们有时会泛起复杂的情绪。那不是恨,而是对自己某些被压抑太久的渴望的隐隐心疼。

\n

孩子的自由,是我未曾拥有过的自由。孩子的快乐,是我曾被剥夺过的快乐。孩子的强大,是我渴望又无法实现的强大。

\n

但这面镜子并不是来指责的,而是来提醒的。孩子不仅带着我们向前走,也让我们回头看,他们唤醒了我们未竟的部分。当我们愿意看见自己,承认那份遗憾,也许就能不再被这些情绪带着走。

\n

你眼中看似比你幸福一百倍的孩子,也必然有他们自己需要去面对的痛苦和缺憾。在苦难面前,父母和孩子都是无辜的、需要被爱的人。只有当你愿意面对那个不完美的自己,接纳自己缺憾的人生,才能真正停止对孩子的控制和投射。

\n

而我们自己,也才能开始活出属于自己的人生。

\n

* 相关阅读推荐

\n

有一种心理叫「不允许自己快乐」,这到底是种什么心态? - 知乎

\n

有一种心理叫「不允许自己快乐」,这到底是种什么心态?

\n
\"\"
\n

文 / 红树林心理咨询中心 吴凡

\n
\n
\n\n\n\n\n
\n\n\n\n

", @@ -3303,28 +3567,6 @@ "hash": "e1cdb642d7fa16d2ca26c309c22c9f18", "highlights": [] }, - { - "title": "如果一个行星有两个或者多个大型封闭水域,那么这些水域到底算是海洋还是湖?", - "description": "
\"头图\"/
\n

谢邀,私以为现代地球科学(这是一门学科名称)当中海洋和湖的定义适用范围还是比较限定于地球这一独特的环境,所以这个问题确实挺值得讨论的,我认为异星的海和湖或许需要因“异”制宜来看待,不能按地球的湖海原本定义生搬硬套。那些广袤无垠,站在岸边无法一眼看到对岸的巨型水体,称之为海又何妨呢。

\n
\"\"
NASA 拍摄的地球照片,比起“陆地”覆盖地球表面积的分量,或许我们这颗星球应该叫做“海球”。
\n

众所周知,地球上各大洋是联通的,无比宽广的水体包围着作为少数的陆地,海洋占据了约 71%的地球表面积;正是因为海洋无比广大,而且还相互连通,连续水体的大小压倒性的压制住了其他次要分类条件,故我们可以把这个连续的水体称之为海,通过水体的连续性来划分海洋和内陆湖泊。

\n
\"\"
为了展现海洋连贯性而创作的 Spilhaus 投影,网图侵删。
\n

当然,里海也被称之为海,不过就因为是否与大洋相连续这一问题,他被划分到了内陆咸水湖当中。里海他曾经也是和包裹陆地的那个巨大连续水体相连的,后面因为地质变化,特提斯海的遗存与大洋之间的联系被切断,就变成了帕拉特提斯湖;帕拉特提斯湖曾是世界上最大湖,不过后续的地质变化也让帕拉特提斯湖其中一部分寻回了和大海的联系,形成了现在的黑海,而另一个大的部分就形成了现在的里海。

\n
\"\"
帕拉特提斯湖巨湖,网图侵删。
\n

因为里海曾经作为大洋的一部分,其环境生态和海洋十分相似,水质也是类似海洋的咸水,甚至还有大量海栖生物生活。如果忽略与大洋之间的连续这一条件,里海有着大量与其他海洋的相似性,里海当然是可以被归纳成海,这也是其名称当中保留了“海”的一个原因。

\n
\"\"
里海海豹,截取自 ICUN 的网站,该物种现在因为生存环境的恶化陷入濒危。
\n

要注意的是,这里的连续性应不止是“空间”上的连续,海水成分和咸度与密度等性状也存在一定的连续性。虽然有时候海水当中也会存在密度骤变的“负密度梯度跃变层”这样的特殊的“海底断崖”(会让潜艇发生事故)以及不同海域之间可能也会存在一定的分异,但是一般而言海水的密度、成分、咸度等还是变化幅度较小呈现一定连续性的,这些特征都和淡水河湖等水体存在不小的差异。

\n
\"\"
Landsat 5 卫星在 2010 年拍摄的长江入海口遥感图像(LT51180382010313BJC00),色彩是合成的假彩色有所失真,但是还是可以看到长江和东海存在明显的过渡带与差异。
\n

虽然海洋和河流的水域切分还是很难明确画出一个明确界限的,且因为潮汐洋流等原因,江河和海洋的过渡带还是动态变化的,甚至海洋还会发生海水倒灌侵占河流(如海河据称就是因为在现代造闸之前经常被大量海水侵入导致河水呈现出咸苦等特征而得名的),但明确江河与海的界限可能最后还可能更接近水力学与分形的问题,与题关系不大不在展开。

\n

扯远了,回归正题,前述的基于地球上海洋连续性的判定方式,抑或是将星球上最大的连续水体称之为海的行为,在异星球,恐怕就失去了意义;地球的海洋肯定无法超距连接到异星球的水体,而其他星球上有着占据表面超一半的水体的情况也可能不多见,题设条件显然也不满足这样的条件。

\n

在探索外层空间的过程中,外星球“地理”恐怕还是得用一些不局限于地球的方式来进行判定。不过这方面的建设我也不是非常了解,但是可以知道现在的学者们在地球外将很多水体归类成海洋,哪怕这些“海洋”和地球海洋特征大相径庭。

\n

木卫二大概是一个与地球海洋相近的例子(虽然是和题设不同),其冰下可能存在一个能包裹全球的巨型连续水体,而且可能是含氯化钠的咸水。如果学者们的拟构的木卫结构为真,在水体的覆盖面积和连续性上,木卫二的冰下巨型水体那可是当之无愧的海洋。

\n
\"\"
木卫二“欧罗巴”的构造推测,可能其表层的冰壳下存在一个非常深邃包裹全纬线的海洋。(网图侵删)
\n

当然木卫二的“海洋”是在冰下,在环境上与地球海洋还是大相径庭,这也不影响学者们将其归纳成海洋,顺带一说有不少学者期待能在上面找到生命迹象。这样的“海洋”不止会出现在在木卫二,土卫二、木卫三和木卫四都可能存在。

\n
\"\"
木卫二的冰下海洋结构示意图,网图侵删。
\n

书归正题,回到题设当中来看,“如果一个行星几个水体都很广阔且互不连通呢,或者不连通的水体有大有小,该怎么定义湖和海”,这样能占据一半星球表面积具有压倒性占比的连续水体应并不存在,所以地球的经验就很难套用过来了。

\n

在这种的特殊限定条件下,缺失了能压倒性压制其他条件的那个最重要的条件(海洋的面积),仔细分类海和湖可能意义并不会非常大,或许,这将会变成一种归纳的问题与命名学的问题。

\n

没有那个压倒性的条件,我们可以根据水是否含有氯化钠、氯化钠的含量、水能否直接给人饮用、是否可以放养海栖生物、密度是否大于人体等众多条件分门别类的分出一大堆水体种类,分类为“湖”“海”“亚湖”“巨湖”“微洋”“淡海”“海海”等一系列乱七八糟的种类,而且这样的种类可能除了特定研究并无太大的意义。

\n

有人说从有无“内外流”河来区分,但是外流本身就是基于已经确定了海洋后以更大面积的海洋为外所定下的概念,基于内外流来区分海洋只会是循环论证。缺少了面积断崖式领先的水体,哪会有“内外”之分呢?甚至通过 Spilhaus 投影来理解地球,我们甚至能认为海洋被陆地包裹着,都不需要题设的补充条件把太平洋围起来。而且地球 46 亿年的海陆变迁也非常巨大,往昔的特提斯海今天变成了特提斯成山带(青藏高原就是这个成山带的重要现今组成部分)和诸多海迹湖,哪怕地球的海洋也不是一成不变的。

\n
\"\"
古特提斯洋,在“盘古大陆”(Pangea,直译泛大陆)时期作为被大陆半包围的海洋而存在,因地质运动昔日的海洋变成了今天的高山峻岭和一些海迹湖。(网图侵删)
\n

而从命名学的方式来看,我认为只要是广袤无垠一眼无法看到对岸的巨型水体,都能可以叫成海,而这种方式其实自古就存在,甚至不少语言当中湖海曾经用同一个词就能表示,抑或是能互相混用取代;汉语当中也有很多把湖泊命名为海的地名留存,我还曾经在昆明滇池(亦名滇海)畔看过“海鸥”(红嘴鸥)。

\n

这些只是我的浅薄之见,或许以后会出现什么划定异星湖海的必要吧,但我觉得题设当中出现的多个不连续的水体都叫海其实并没有问题,不需要在意异星的湖海之分,真要分可能还是大小和成分咸淡比较重要吧。而且作为地名而言,一个 XX 海在标志地点和位置之外,他究竟是不是海,重要吗?16 世纪时就有学者给月球朝向地球的面起了一堆湖海的名字,并且这些名字在今天仍然在使用。

\n
\"\"
月球表面有大量以“海”命名的地理单元,被统称为“月海”。(网图侵删)
\n

说句题外话,土卫六和金星表面存在不少流动液体,其表面和内部的流动液体被不少学者称为“甲烷海”(或许成分还有其他有机物),也就是说是否可以认为主要成分是否是“H2O”也不干扰分类湖海呢?你的下一个海,又何必是“海”?

\n
\n
\n\n\n\n\n
\n\n\n\n", - "content": "
\"头图\"/
\n

谢邀,私以为现代地球科学(这是一门学科名称)当中海洋和湖的定义适用范围还是比较限定于地球这一独特的环境,所以这个问题确实挺值得讨论的,我认为异星的海和湖或许需要因“异”制宜来看待,不能按地球的湖海原本定义生搬硬套。那些广袤无垠,站在岸边无法一眼看到对岸的巨型水体,称之为海又何妨呢。

\n
\"\"
NASA 拍摄的地球照片,比起“陆地”覆盖地球表面积的分量,或许我们这颗星球应该叫做“海球”。
\n

众所周知,地球上各大洋是联通的,无比宽广的水体包围着作为少数的陆地,海洋占据了约 71%的地球表面积;正是因为海洋无比广大,而且还相互连通,连续水体的大小压倒性的压制住了其他次要分类条件,故我们可以把这个连续的水体称之为海,通过水体的连续性来划分海洋和内陆湖泊。

\n
\"\"
为了展现海洋连贯性而创作的 Spilhaus 投影,网图侵删。
\n

当然,里海也被称之为海,不过就因为是否与大洋相连续这一问题,他被划分到了内陆咸水湖当中。里海他曾经也是和包裹陆地的那个巨大连续水体相连的,后面因为地质变化,特提斯海的遗存与大洋之间的联系被切断,就变成了帕拉特提斯湖;帕拉特提斯湖曾是世界上最大湖,不过后续的地质变化也让帕拉特提斯湖其中一部分寻回了和大海的联系,形成了现在的黑海,而另一个大的部分就形成了现在的里海。

\n
\"\"
帕拉特提斯湖巨湖,网图侵删。
\n

因为里海曾经作为大洋的一部分,其环境生态和海洋十分相似,水质也是类似海洋的咸水,甚至还有大量海栖生物生活。如果忽略与大洋之间的连续这一条件,里海有着大量与其他海洋的相似性,里海当然是可以被归纳成海,这也是其名称当中保留了“海”的一个原因。

\n
\"\"
里海海豹,截取自 ICUN 的网站,该物种现在因为生存环境的恶化陷入濒危。
\n

要注意的是,这里的连续性应不止是“空间”上的连续,海水成分和咸度与密度等性状也存在一定的连续性。虽然有时候海水当中也会存在密度骤变的“负密度梯度跃变层”这样的特殊的“海底断崖”(会让潜艇发生事故)以及不同海域之间可能也会存在一定的分异,但是一般而言海水的密度、成分、咸度等还是变化幅度较小呈现一定连续性的,这些特征都和淡水河湖等水体存在不小的差异。

\n
\"\"
Landsat 5 卫星在 2010 年拍摄的长江入海口遥感图像(LT51180382010313BJC00),色彩是合成的假彩色有所失真,但是还是可以看到长江和东海存在明显的过渡带与差异。
\n

虽然海洋和河流的水域切分还是很难明确画出一个明确界限的,且因为潮汐洋流等原因,江河和海洋的过渡带还是动态变化的,甚至海洋还会发生海水倒灌侵占河流(如海河据称就是因为在现代造闸之前经常被大量海水侵入导致河水呈现出咸苦等特征而得名的),但明确江河与海的界限可能最后还可能更接近水力学与分形的问题,与题关系不大不在展开。

\n

扯远了,回归正题,前述的基于地球上海洋连续性的判定方式,抑或是将星球上最大的连续水体称之为海的行为,在异星球,恐怕就失去了意义;地球的海洋肯定无法超距连接到异星球的水体,而其他星球上有着占据表面超一半的水体的情况也可能不多见,题设条件显然也不满足这样的条件。

\n

在探索外层空间的过程中,外星球“地理”恐怕还是得用一些不局限于地球的方式来进行判定。不过这方面的建设我也不是非常了解,但是可以知道现在的学者们在地球外将很多水体归类成海洋,哪怕这些“海洋”和地球海洋特征大相径庭。

\n

木卫二大概是一个与地球海洋相近的例子(虽然是和题设不同),其冰下可能存在一个能包裹全球的巨型连续水体,而且可能是含氯化钠的咸水。如果学者们的拟构的木卫结构为真,在水体的覆盖面积和连续性上,木卫二的冰下巨型水体那可是当之无愧的海洋。

\n
\"\"
木卫二“欧罗巴”的构造推测,可能其表层的冰壳下存在一个非常深邃包裹全纬线的海洋。(网图侵删)
\n

当然木卫二的“海洋”是在冰下,在环境上与地球海洋还是大相径庭,这也不影响学者们将其归纳成海洋,顺带一说有不少学者期待能在上面找到生命迹象。这样的“海洋”不止会出现在在木卫二,土卫二、木卫三和木卫四都可能存在。

\n
\"\"
木卫二的冰下海洋结构示意图,网图侵删。
\n

书归正题,回到题设当中来看,“如果一个行星几个水体都很广阔且互不连通呢,或者不连通的水体有大有小,该怎么定义湖和海”,这样能占据一半星球表面积具有压倒性占比的连续水体应并不存在,所以地球的经验就很难套用过来了。

\n

在这种的特殊限定条件下,缺失了能压倒性压制其他条件的那个最重要的条件(海洋的面积),仔细分类海和湖可能意义并不会非常大,或许,这将会变成一种归纳的问题与命名学的问题。

\n

没有那个压倒性的条件,我们可以根据水是否含有氯化钠、氯化钠的含量、水能否直接给人饮用、是否可以放养海栖生物、密度是否大于人体等众多条件分门别类的分出一大堆水体种类,分类为“湖”“海”“亚湖”“巨湖”“微洋”“淡海”“海海”等一系列乱七八糟的种类,而且这样的种类可能除了特定研究并无太大的意义。

\n

有人说从有无“内外流”河来区分,但是外流本身就是基于已经确定了海洋后以更大面积的海洋为外所定下的概念,基于内外流来区分海洋只会是循环论证。缺少了面积断崖式领先的水体,哪会有“内外”之分呢?甚至通过 Spilhaus 投影来理解地球,我们甚至能认为海洋被陆地包裹着,都不需要题设的补充条件把太平洋围起来。而且地球 46 亿年的海陆变迁也非常巨大,往昔的特提斯海今天变成了特提斯成山带(青藏高原就是这个成山带的重要现今组成部分)和诸多海迹湖,哪怕地球的海洋也不是一成不变的。

\n
\"\"
古特提斯洋,在“盘古大陆”(Pangea,直译泛大陆)时期作为被大陆半包围的海洋而存在,因地质运动昔日的海洋变成了今天的高山峻岭和一些海迹湖。(网图侵删)
\n

而从命名学的方式来看,我认为只要是广袤无垠一眼无法看到对岸的巨型水体,都能可以叫成海,而这种方式其实自古就存在,甚至不少语言当中湖海曾经用同一个词就能表示,抑或是能互相混用取代;汉语当中也有很多把湖泊命名为海的地名留存,我还曾经在昆明滇池(亦名滇海)畔看过“海鸥”(红嘴鸥)。

\n

这些只是我的浅薄之见,或许以后会出现什么划定异星湖海的必要吧,但我觉得题设当中出现的多个不连续的水体都叫海其实并没有问题,不需要在意异星的湖海之分,真要分可能还是大小和成分咸淡比较重要吧。而且作为地名而言,一个 XX 海在标志地点和位置之外,他究竟是不是海,重要吗?16 世纪时就有学者给月球朝向地球的面起了一堆湖海的名字,并且这些名字在今天仍然在使用。

\n
\"\"
月球表面有大量以“海”命名的地理单元,被统称为“月海”。(网图侵删)
\n

说句题外话,土卫六和金星表面存在不少流动液体,其表面和内部的流动液体被不少学者称为“甲烷海”(或许成分还有其他有机物),也就是说是否可以认为主要成分是否是“H2O”也不干扰分类湖海呢?你的下一个海,又何必是“海”?

\n
\n
\n\n\n\n\n
\n\n\n\n", - "category": "", - "link": "https://daily.zhihu.com/story/9782544", - "creator": "", - "pubDate": "Mon, 14 Jul 2025 08:27:04 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "知乎", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "a97ef9968a92ae187b5b89a1814fc818", - "highlights": [] - }, { "title": "孩子只在父母面前「情绪失控」,在外却近乎「完美」,正常吗?该如何引导?", "description": "
\"头图\"/
\n

弗洛伊德认为:“攻击性如同是一个人的生命力,如果一个人不能活出自己的攻击性,就会出现心理问题。”

\n

即使环境很糟糕,只要一个人能够正常表达攻击性,就能够保护自我不受外界蹂躏。

\n

心理学研究表明:孩子在很小的时候会强烈地依恋父母或其他养育者,当孩子接触外部世界时,失去这种依恋会使他产生一种不安全感,从而使孩子胆小。

\n

但是如果孩子上学以后对外界表现出过分“完美”“懂事”“胆怯”,很大可能就是家庭教育的问题。

\n

我邻居家的孩子就是这样,在家里,脾气大得惊人。和妈妈顶嘴,对弟弟妹妹呼来喝去,翻脸比翻书还快。

\n

爸妈一说他一句,他能当场怼回几句,搞得全家都不安生。

\n

可一旦出了门,到了学校或者外人面前,立马变脸。

\n

不说话,胆小,做事缩手缩脚,老师点个名都吓一跳,像换了个人。

\n

说白了,孩子在家里发横,是因为他知道自己“横得起”;在外面发怂,是因为他不知道能不能“撑得住”。

\n

而这种反差,很多时候不是性格问题,是家庭结构的问题。

\n

家长要反思自己给孩子是否创造了足够安全的生活环境。例如:夫妻之间的吵架、对孩子言语的伤害或者是过度保护孩子,都是有可能让孩子出现这一表现的原因。

\n

如果想要改变,从这五点做起吧!

\n

一、不过分溺爱,做有原则有底线的父母

\n

“爱孩子”和“立规矩”,从来不是一道单选题。

\n

明确规则,不被孩子牵着鼻子走,不能因为孩子哭闹,就主动打破规则的执行,和善而坚定地对孩子说“不”。让孩子明白,边界感的所在。

\n
\"\"
在孩子的成长过程中,要让他知道:除了爱之外,还要有敬畏
\n

二、每天花 15 分钟的时间和孩子聊天,问问他,学校都发生了什么。

\n

三、每周抽时间给孩子拍一段视频,让他听自己的声音,看自己的表现,发现问题及时调整。

\n
\"\"
\n

四、周末邀请孩子的好朋友到家里来玩,给孩子创造多种社交机会和条件,提升孩子的社交能力。

\n

五、在孩子愿意的前提下,给孩子创造一些上台表演的机会,通过正向的实践提升孩子的自信心。

\n
\"\"
提升孩子自信心的 5 句话
\n

亲测,这几个方法对提高孩子自信心,让孩子变得有原则有担当非常有帮助。

\n
\n
\n\n\n\n\n
\n\n\n\n

", @@ -3347,28 +3589,6 @@ "hash": "54d622541f4f473a8dd14f6e4d7644c7", "highlights": [] }, - { - "title": "当回避型依恋开始回避你时她(他)的内心活动是怎样的?", - "description": "
\"头图\"/
\n

众多回答都告诉题主了,回避型依恋的特征不愿意和爱人亲密。这种不愿意体现在高度的亲密回避,以及极低的被弃焦虑,而这两个点也正是 AAS(成人依恋量表)中的两个维度。

\n

作为咨询师,我会通过认知行为理论和客体关系理论来讲一下这两点到底意味着什么。

\n

首先先从认知行为模式(Cognitive Behavior Therapy)的角度来说一下。亲密回避很好理解,就是避免与你有“过度”的亲密接触。因为这些亲密接触,都会给 TA 一种不安感。

\n

一、回避亲密的根源在于自我否定

\n

这种不安是来自于童年婴儿时期的,TA 的父母因为照顾得并不好,所以让 TA 内心深处一直对自己说:

\n

我不够好,没有人会来帮助我。

\n

慢慢随着他长大,这个内心想法开始逐渐演化成了一种很自然的想法,或者说是生活规则。由于没有人来帮助我。所以,万事不能靠别人,只能靠自己。最终演化为:

\n

别人介入一定会坏事,只有自己是能信任的人

\n

所以通过这个思考回路,TA 也会觉得在感情中也不能靠别人。也就是说,在亲密关系中,TA 依然认为相信别人,或者“过度”依赖别人,会导致“坏事”。所以为了避免这种情况,TA 就会刻意的保持一种若即若离的状态。

\n
    \n
  1. 内心深处:我不够好,没人会帮助我
  2. \n
  3. 行为习惯:别人不可相信,只能相信自己
  4. \n
  5. 情绪感受:一旦亲密就会感觉到不安全
  6. \n
\n
\"\"
\n

TA 之所以会表现出不耐烦以及烦躁,甚至故意做出故意疏远你的行为。其实就是因为 TA 一直都是靠自己生活的,从小到大这已经深深的刻进了 TA 的行为模式之中。所以一旦你和 TA 靠的太近,就会让 TA 陷入一种非常陌生的环境之中。

\n

当我们进入一个完全陌生的环境中时,也会全身肌肉紧绷,随时准备逃跑。而 TA 在亲密关系中,也就相当于进入了一个 TA 完全不适应的环境之中,让 TA 产生了应激反应:

\n

本能的排斥并且想要回避你。

\n

但是需要强调的是,TA 的这种想法和逻辑,都是埋藏在潜意识层面一下的。大部分人看到蜘蛛就心里发毛,这是因为天生的经验在告诉我们蜘蛛很危险。TA 的回避也是一样的,TA 一但和你亲密就觉得难受,不过 TA 并不能知道为什么难受。所以你如果问 TA,得到的答案可能会很模棱两可:

\n
    \n
  • “我就是觉得两个人一起久了太腻了”
  • \n
  • “我喜欢一个人”
  • \n
  • “我也不知道为什么,就是觉得不舒服”
  • \n
\n

TA 可以丰富的向你描述 TA 的感受,但是真要让 TA 说出一个所以然来,是很困难的。因为自动想法部分,多是停留在意识层面之下,也就是说这一套机制是不受意识的自我检查的。

\n

也就是说,这个想法先于自我判断对错的心理行为,TA 永远都不会知道自己为什么要这样,也永远不会思考这样到底对不对。

\n

另外一个特征是很低的被弃焦虑。

\n

这也是回避型依恋相较于恐惧型与痴迷型来说,有着更好的稳定性的表现。低被弃焦虑,可以简单的理解为不怕你主动提分手,TA 比另外两种不安全依恋更容易接受这个结果。因为如此,回避型依恋的人相对而言会作的更少一点。

\n

然而你并不是完全的安全型依恋类型,多多少少你也会在亲密关系中感觉到不安全,有着一定程度的被弃焦虑,进而找 TA 寻求安全感。这个时候攻守易主,你成了所求的一方,TA 反而成了诉求少的一方。所以有些时候,TA 甚至会反过来觉得你很作,让 TA 感觉到很累很烦。

\n

比如在你寻求亲密行为的时候,很可能整个行为只是非常正常的一次亲密互动,但是依然会被他视作是一种过度的诉求,是一种作。面对这种“作”,无论他外在怎么做的,但 TA 的内心一定是排斥的,而且排斥的有理有据。

\n

但是,需要强调的是:不怕被你分手,不意味着希望被你分手。

\n

前面也说过,回避型依恋的 TA,在面对人生的所有事件时,都会有自己一个人单干的习惯。这是因为 TA 的内心想法:认为自己不够好,所有人都不会帮 TA,你也不会帮。这延伸在亲密关系中,就会产生出一种结论:自己不够好,被分手也是正常的。

\n

所以 TA 几乎上是认定了,你与 TA 的这段关系是不长久的。在这个思维的基础上,TA 才不怕分手,因为这已经是 TA 所能预见的最有可能的结局了。

\n
    \n
  • 你和 TA 一起旅行或者出去玩
  • \n
\n

TA 外在的想法:每天都要和腻在一起,没有自己的空间,感觉好难受。

\n

TA 内在的潜意识:我付出和牺牲自己的生活,也很难让关系更好。

\n
    \n
  • 你每天都关心 TA 的生活
  • \n
\n

TA 外在的想法:每天都要和你分享自己的生活,就像报告一样·,让人很烦。

\n

TA 内在的潜意识:我自己的生活节奏被打乱了,我没有办法掌控这段感情了。

\n
    \n
  • 你希望 TA 能对你更上心一点,再多关心一下自己
  • \n
\n

TA 外在的想法:我自己一个人挺舒服,现在还要多照顾一个人,好麻烦啊。

\n

TA 内在的潜意识:我没有能力为别人的生活责任。

\n

你可以发现回避型依恋的人是很悲观的,这认知行为理论中,称为糟糕至极(Awflizing)。TA 会把你们这段感情看的很悲观,比如说 TA 的内心深处可能有这些想法:

\n
    \n
  • “你肯定很难和我感同身受,根本不可能理解我”
  • \n
  • “我真的很难和你说一些内心的话,我说不出口”
  • \n
  • “如果我向你示弱了,你肯定就会伤害我,背叛我”
  • \n
\n

但是 TA 想不想和你亲近呢?——答案是肯定的,TA 当然也不想被车子撞到,也不想自己在亲密关系中永远都是悲剧的男 / 女主角。但是经验告诉 TA,不能多想,做好自己就行了。

\n

所以回避型依恋的人都处于一个很矛盾的境地中,TA 一方面因为想要摆脱悲剧色彩而极度想要亲密关系的帮助,但是一方又对亲密关系不抱期望。

\n

换句话说,TA 期望的是你,但是又对自己失望。而恰巧亲密关系又需要两个人共同承担责任,面对问题,所以回避型依恋的人往往会对亲密关系持有极度正面以及极度负面的两种态度。

\n

现在你应该知道了,回避型依恋的人在亲密关系中是有着大量的不安全感,甚至说带有很大程度的自我否定感。这种感觉渗透到了他们生活中的方方面面。TA 不想和你去旅游,不想更多的关心你,其实是因为 TA 潜意识觉得自己付不起这个责任,觉得自己和你的感情很难有一个完美的结果。

\n

二、对关系的焦虑源于对死亡的恐惧

\n

那这些潜意识又是从什么地方产生的呢?其实就是她的童年成长。客体关系理论(Object-Relations Theory)中讲,我们与外在客体的关系模式,如果一旦定型,那么我们之后对待别人,对待世界的方式都会遵循这种模式。

\n

简单来说,就是爸爸妈妈怎么对的你,你以后就会怎么对别人。回避型依恋的人,在童年早期很可能并没有受到父母很好地照顾。所以认识自我和别人时,可能会出现问题。

\n

温尼科特说:“每个婴儿都是在自己母亲眼眸中所映射的自己的影像中,找到自己的存在”。

\n

所以,回避型依恋的存在感和安全感,都是很缺失的。这种缺失在于重要养育人对自己照顾的疏忽,这种重大的早期经验带给了 TA 非常不安全的感觉。这也是迫使 TA 认为别人不可靠,只能靠自己的原因。

\n

所以说,在心理动力学的层面上,回避型依恋并不简简单单是一个性格的问题,也不是你给与一些安全感,或者照顾一下 TA 的感受,就能解决的问题。这个问题的根本,很可能是涉及到 TA 潜意识中对死亡的恐惧。

\n

当你要求 TA 每天报告自己的生活清单时、要求 TA 必须每天陪你多久多久时,TA 内心深处好像就回到了小时候,无法掌控自己生活的婴儿时期。让他重新再一次感受到了作为婴儿的无力感。

\n

当然,我们知道你并不是这个意思,甚至 TA 的意识层面也知道你不是这个意思。但是这并不影响 TA 的潜意识这样认为,而且 TA 的潜意识甚至会再度感觉到童年时期那种不被照顾,不被关心的状态。

\n

简单地说:作为一个回避型依恋的人,TA 已经成长为了一个事事只靠自己的独立个体。而亲密关系在一定程度上会让 TA 重新回到一个共有的关系之中,这种关系的变化让 TA 又一次感觉自己失去独立感,从而带来的就是无法掌握自己生活的恐惧感。

\n

这些最底层的恐惧感,甚至让 TA 即使想和你卿卿我我,但也没有办法违抗最本能的恐惧感。对于 TA 来说,“过度”的亲密就代表着不独立,就代表着没有独立活下去的可能。这些恐惧感的背后,其实是一次次童年创伤以及成长经历所累计起来的一种创伤后应激反应(PTSD)。

\n

三、回避型依恋要慢慢感化

\n

亲密关系中两个人甚至可以说是重温了童年时期父母的爱,但同时还有童年时期父母的伤害。你可以把 TA 的回避看做是在回避童年早期经验的伤害,TA 只是在潜意识中把你当做了 TA 的父母了。

\n

所以急于解决 TA 的回避行为,只会让 TA 感觉到更没有安全感。你可以试着相信 TA,接纳 TA。很多时候 TA 在怀疑你,伤害你的时候,其实也在怀疑自己,伤害自己。你可以表现出没有攻击性的一面,让 TA 慢慢能够主动地和你更加亲近。

\n

回避型在回避你时,其实是因为不相信你能够疗愈与自己,即使是能够疗愈自己,也不见得能够认同自己的孤独。当然,这些都是 TA 潜意识层面的恐惧和顾虑,TA 在具体生活中的表现就是喜欢一个人,不喜欢腻在一起。

\n

我有很多情侣的案例,两个人三天两头就要吵架。两个人对于吵架这个事情都已经很累了,很厌烦了,但为什么还要去做呢?其实很简单,当你对一个事情很烦很讨厌,但依然要继续做时,那说明这个事情只能是非做不可的。

\n

两个人通过吵架,通过矛盾来一次又一次的重新体验童年早期经验的创伤,最后又通过和好理解来达到童年创伤的疗愈。回避也是一样的道理,只是具体的情况与其他的类型稍有不同:别人都是爆发冲突,TA 是害怕冲突而躲避冲突,或者说这种回避其实就是 TA 所经历的创伤。

\n

所以当你下次再感觉到 TA 在回避的时候,你可以认为 TA 的内心现在为了寻求一些 TA 自己认为的安全空间而在疯狂的做着努力。而 TA 的潜意识深处,其实是希望你能帮助 TA 脱离这个苦海的,只是在脱离苦海的前一步是进入苦海。

\n

温尼科特还说过,他认为真正完美的亲密关系是:窝在爱人怀里的孤独(Dare to be lonely in someone else‘s arms)。

\n

Dare代表亲密关系是需要勇气的,Arms代表亲密关系是疗愈和信任,同时最重要的Lonely说明亲密关系中的个体,再如何亲密其内心——依然是孤独的。

\n

不要害怕 TA 这么回避你,你要知道的是:TA 正在尝试找到能够让你满意也能够让自己满意的关系距离。

\n

太远了你没有安全感,太近了他没有安全感,但 TA 相信会有那么一个距离能够同时满足你和 TA 两个人,所以 TA 也在为此努力之中。如果 TA 都如此相信,那么你又有什么理由不去相信呢。

\n
\n

我是 @远叔 国家认证心理咨询师,成都精神分析协会会员、全网粉丝累计超 80w,从业 10 年,4000+ 咨询案例。 回避型创伤修复、焦虑型依恋成长、原生家庭疗愈、社交障碍解决、失恋疗愈........ 与其自己纠结,不如与我并肩,欢迎来到主角的世界→咨询请联系(vx:jyxfd001)

\n
\n

关于回避型,我写过很多回答:

\n

01 回避型依恋者怎么谈恋爱?当喜欢的人也喜欢自己,想要逃跑?

\n

02 怎么追回避型依恋的女生?

\n

03 回避型依恋的人适合和什么人在一起?

\n

04 回避型依恋者在亲密关系中的需求是什么?他们希望伴侣给予他们什么?

\n

05 当回避型依恋开始回避你时她(他)的内心活动是怎样的?

\n

06 怎样摆脱焦虑型依恋?

\n

07 回避型的人为什么那么冷漠?

\n

08 回避型人格的人会真心爱上一个人吗?

\n

09 如何与回避型依恋的人谈恋爱?

\n
\n
\n\n\n\n\n
\n\n\n\n", - "content": "
\"头图\"/
\n

众多回答都告诉题主了,回避型依恋的特征不愿意和爱人亲密。这种不愿意体现在高度的亲密回避,以及极低的被弃焦虑,而这两个点也正是 AAS(成人依恋量表)中的两个维度。

\n

作为咨询师,我会通过认知行为理论和客体关系理论来讲一下这两点到底意味着什么。

\n

首先先从认知行为模式(Cognitive Behavior Therapy)的角度来说一下。亲密回避很好理解,就是避免与你有“过度”的亲密接触。因为这些亲密接触,都会给 TA 一种不安感。

\n

一、回避亲密的根源在于自我否定

\n

这种不安是来自于童年婴儿时期的,TA 的父母因为照顾得并不好,所以让 TA 内心深处一直对自己说:

\n

我不够好,没有人会来帮助我。

\n

慢慢随着他长大,这个内心想法开始逐渐演化成了一种很自然的想法,或者说是生活规则。由于没有人来帮助我。所以,万事不能靠别人,只能靠自己。最终演化为:

\n

别人介入一定会坏事,只有自己是能信任的人

\n

所以通过这个思考回路,TA 也会觉得在感情中也不能靠别人。也就是说,在亲密关系中,TA 依然认为相信别人,或者“过度”依赖别人,会导致“坏事”。所以为了避免这种情况,TA 就会刻意的保持一种若即若离的状态。

\n
    \n
  1. 内心深处:我不够好,没人会帮助我
  2. \n
  3. 行为习惯:别人不可相信,只能相信自己
  4. \n
  5. 情绪感受:一旦亲密就会感觉到不安全
  6. \n
\n
\"\"
\n

TA 之所以会表现出不耐烦以及烦躁,甚至故意做出故意疏远你的行为。其实就是因为 TA 一直都是靠自己生活的,从小到大这已经深深的刻进了 TA 的行为模式之中。所以一旦你和 TA 靠的太近,就会让 TA 陷入一种非常陌生的环境之中。

\n

当我们进入一个完全陌生的环境中时,也会全身肌肉紧绷,随时准备逃跑。而 TA 在亲密关系中,也就相当于进入了一个 TA 完全不适应的环境之中,让 TA 产生了应激反应:

\n

本能的排斥并且想要回避你。

\n

但是需要强调的是,TA 的这种想法和逻辑,都是埋藏在潜意识层面一下的。大部分人看到蜘蛛就心里发毛,这是因为天生的经验在告诉我们蜘蛛很危险。TA 的回避也是一样的,TA 一但和你亲密就觉得难受,不过 TA 并不能知道为什么难受。所以你如果问 TA,得到的答案可能会很模棱两可:

\n
    \n
  • “我就是觉得两个人一起久了太腻了”
  • \n
  • “我喜欢一个人”
  • \n
  • “我也不知道为什么,就是觉得不舒服”
  • \n
\n

TA 可以丰富的向你描述 TA 的感受,但是真要让 TA 说出一个所以然来,是很困难的。因为自动想法部分,多是停留在意识层面之下,也就是说这一套机制是不受意识的自我检查的。

\n

也就是说,这个想法先于自我判断对错的心理行为,TA 永远都不会知道自己为什么要这样,也永远不会思考这样到底对不对。

\n

另外一个特征是很低的被弃焦虑。

\n

这也是回避型依恋相较于恐惧型与痴迷型来说,有着更好的稳定性的表现。低被弃焦虑,可以简单的理解为不怕你主动提分手,TA 比另外两种不安全依恋更容易接受这个结果。因为如此,回避型依恋的人相对而言会作的更少一点。

\n

然而你并不是完全的安全型依恋类型,多多少少你也会在亲密关系中感觉到不安全,有着一定程度的被弃焦虑,进而找 TA 寻求安全感。这个时候攻守易主,你成了所求的一方,TA 反而成了诉求少的一方。所以有些时候,TA 甚至会反过来觉得你很作,让 TA 感觉到很累很烦。

\n

比如在你寻求亲密行为的时候,很可能整个行为只是非常正常的一次亲密互动,但是依然会被他视作是一种过度的诉求,是一种作。面对这种“作”,无论他外在怎么做的,但 TA 的内心一定是排斥的,而且排斥的有理有据。

\n

但是,需要强调的是:不怕被你分手,不意味着希望被你分手。

\n

前面也说过,回避型依恋的 TA,在面对人生的所有事件时,都会有自己一个人单干的习惯。这是因为 TA 的内心想法:认为自己不够好,所有人都不会帮 TA,你也不会帮。这延伸在亲密关系中,就会产生出一种结论:自己不够好,被分手也是正常的。

\n

所以 TA 几乎上是认定了,你与 TA 的这段关系是不长久的。在这个思维的基础上,TA 才不怕分手,因为这已经是 TA 所能预见的最有可能的结局了。

\n
    \n
  • 你和 TA 一起旅行或者出去玩
  • \n
\n

TA 外在的想法:每天都要和腻在一起,没有自己的空间,感觉好难受。

\n

TA 内在的潜意识:我付出和牺牲自己的生活,也很难让关系更好。

\n
    \n
  • 你每天都关心 TA 的生活
  • \n
\n

TA 外在的想法:每天都要和你分享自己的生活,就像报告一样·,让人很烦。

\n

TA 内在的潜意识:我自己的生活节奏被打乱了,我没有办法掌控这段感情了。

\n
    \n
  • 你希望 TA 能对你更上心一点,再多关心一下自己
  • \n
\n

TA 外在的想法:我自己一个人挺舒服,现在还要多照顾一个人,好麻烦啊。

\n

TA 内在的潜意识:我没有能力为别人的生活责任。

\n

你可以发现回避型依恋的人是很悲观的,这认知行为理论中,称为糟糕至极(Awflizing)。TA 会把你们这段感情看的很悲观,比如说 TA 的内心深处可能有这些想法:

\n
    \n
  • “你肯定很难和我感同身受,根本不可能理解我”
  • \n
  • “我真的很难和你说一些内心的话,我说不出口”
  • \n
  • “如果我向你示弱了,你肯定就会伤害我,背叛我”
  • \n
\n

但是 TA 想不想和你亲近呢?——答案是肯定的,TA 当然也不想被车子撞到,也不想自己在亲密关系中永远都是悲剧的男 / 女主角。但是经验告诉 TA,不能多想,做好自己就行了。

\n

所以回避型依恋的人都处于一个很矛盾的境地中,TA 一方面因为想要摆脱悲剧色彩而极度想要亲密关系的帮助,但是一方又对亲密关系不抱期望。

\n

换句话说,TA 期望的是你,但是又对自己失望。而恰巧亲密关系又需要两个人共同承担责任,面对问题,所以回避型依恋的人往往会对亲密关系持有极度正面以及极度负面的两种态度。

\n

现在你应该知道了,回避型依恋的人在亲密关系中是有着大量的不安全感,甚至说带有很大程度的自我否定感。这种感觉渗透到了他们生活中的方方面面。TA 不想和你去旅游,不想更多的关心你,其实是因为 TA 潜意识觉得自己付不起这个责任,觉得自己和你的感情很难有一个完美的结果。

\n

二、对关系的焦虑源于对死亡的恐惧

\n

那这些潜意识又是从什么地方产生的呢?其实就是她的童年成长。客体关系理论(Object-Relations Theory)中讲,我们与外在客体的关系模式,如果一旦定型,那么我们之后对待别人,对待世界的方式都会遵循这种模式。

\n

简单来说,就是爸爸妈妈怎么对的你,你以后就会怎么对别人。回避型依恋的人,在童年早期很可能并没有受到父母很好地照顾。所以认识自我和别人时,可能会出现问题。

\n

温尼科特说:“每个婴儿都是在自己母亲眼眸中所映射的自己的影像中,找到自己的存在”。

\n

所以,回避型依恋的存在感和安全感,都是很缺失的。这种缺失在于重要养育人对自己照顾的疏忽,这种重大的早期经验带给了 TA 非常不安全的感觉。这也是迫使 TA 认为别人不可靠,只能靠自己的原因。

\n

所以说,在心理动力学的层面上,回避型依恋并不简简单单是一个性格的问题,也不是你给与一些安全感,或者照顾一下 TA 的感受,就能解决的问题。这个问题的根本,很可能是涉及到 TA 潜意识中对死亡的恐惧。

\n

当你要求 TA 每天报告自己的生活清单时、要求 TA 必须每天陪你多久多久时,TA 内心深处好像就回到了小时候,无法掌控自己生活的婴儿时期。让他重新再一次感受到了作为婴儿的无力感。

\n

当然,我们知道你并不是这个意思,甚至 TA 的意识层面也知道你不是这个意思。但是这并不影响 TA 的潜意识这样认为,而且 TA 的潜意识甚至会再度感觉到童年时期那种不被照顾,不被关心的状态。

\n

简单地说:作为一个回避型依恋的人,TA 已经成长为了一个事事只靠自己的独立个体。而亲密关系在一定程度上会让 TA 重新回到一个共有的关系之中,这种关系的变化让 TA 又一次感觉自己失去独立感,从而带来的就是无法掌握自己生活的恐惧感。

\n

这些最底层的恐惧感,甚至让 TA 即使想和你卿卿我我,但也没有办法违抗最本能的恐惧感。对于 TA 来说,“过度”的亲密就代表着不独立,就代表着没有独立活下去的可能。这些恐惧感的背后,其实是一次次童年创伤以及成长经历所累计起来的一种创伤后应激反应(PTSD)。

\n

三、回避型依恋要慢慢感化

\n

亲密关系中两个人甚至可以说是重温了童年时期父母的爱,但同时还有童年时期父母的伤害。你可以把 TA 的回避看做是在回避童年早期经验的伤害,TA 只是在潜意识中把你当做了 TA 的父母了。

\n

所以急于解决 TA 的回避行为,只会让 TA 感觉到更没有安全感。你可以试着相信 TA,接纳 TA。很多时候 TA 在怀疑你,伤害你的时候,其实也在怀疑自己,伤害自己。你可以表现出没有攻击性的一面,让 TA 慢慢能够主动地和你更加亲近。

\n

回避型在回避你时,其实是因为不相信你能够疗愈与自己,即使是能够疗愈自己,也不见得能够认同自己的孤独。当然,这些都是 TA 潜意识层面的恐惧和顾虑,TA 在具体生活中的表现就是喜欢一个人,不喜欢腻在一起。

\n

我有很多情侣的案例,两个人三天两头就要吵架。两个人对于吵架这个事情都已经很累了,很厌烦了,但为什么还要去做呢?其实很简单,当你对一个事情很烦很讨厌,但依然要继续做时,那说明这个事情只能是非做不可的。

\n

两个人通过吵架,通过矛盾来一次又一次的重新体验童年早期经验的创伤,最后又通过和好理解来达到童年创伤的疗愈。回避也是一样的道理,只是具体的情况与其他的类型稍有不同:别人都是爆发冲突,TA 是害怕冲突而躲避冲突,或者说这种回避其实就是 TA 所经历的创伤。

\n

所以当你下次再感觉到 TA 在回避的时候,你可以认为 TA 的内心现在为了寻求一些 TA 自己认为的安全空间而在疯狂的做着努力。而 TA 的潜意识深处,其实是希望你能帮助 TA 脱离这个苦海的,只是在脱离苦海的前一步是进入苦海。

\n

温尼科特还说过,他认为真正完美的亲密关系是:窝在爱人怀里的孤独(Dare to be lonely in someone else‘s arms)。

\n

Dare代表亲密关系是需要勇气的,Arms代表亲密关系是疗愈和信任,同时最重要的Lonely说明亲密关系中的个体,再如何亲密其内心——依然是孤独的。

\n

不要害怕 TA 这么回避你,你要知道的是:TA 正在尝试找到能够让你满意也能够让自己满意的关系距离。

\n

太远了你没有安全感,太近了他没有安全感,但 TA 相信会有那么一个距离能够同时满足你和 TA 两个人,所以 TA 也在为此努力之中。如果 TA 都如此相信,那么你又有什么理由不去相信呢。

\n
\n

我是 @远叔 国家认证心理咨询师,成都精神分析协会会员、全网粉丝累计超 80w,从业 10 年,4000+ 咨询案例。 回避型创伤修复、焦虑型依恋成长、原生家庭疗愈、社交障碍解决、失恋疗愈........ 与其自己纠结,不如与我并肩,欢迎来到主角的世界→咨询请联系(vx:jyxfd001)

\n
\n

关于回避型,我写过很多回答:

\n

01 回避型依恋者怎么谈恋爱?当喜欢的人也喜欢自己,想要逃跑?

\n

02 怎么追回避型依恋的女生?

\n

03 回避型依恋的人适合和什么人在一起?

\n

04 回避型依恋者在亲密关系中的需求是什么?他们希望伴侣给予他们什么?

\n

05 当回避型依恋开始回避你时她(他)的内心活动是怎样的?

\n

06 怎样摆脱焦虑型依恋?

\n

07 回避型的人为什么那么冷漠?

\n

08 回避型人格的人会真心爱上一个人吗?

\n

09 如何与回避型依恋的人谈恋爱?

\n
\n
\n\n\n\n\n
\n\n\n\n", - "category": "", - "link": "https://daily.zhihu.com/story/9782524", - "creator": "", - "pubDate": "Sun, 13 Jul 2025 08:27:02 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "知乎", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "052d9ff428f7bbcde846d2cd16d98e16", - "highlights": [] - }, { "title": "为什么没熟透的香蕉总是皮厚肉少,而熟透的香蕉总是薄皮肉多?", "description": "
\"头图\"/
\n

让我们看下香蕉君の成熟之路。

\n

首先,我们都知道,香蕉苹果猕猴桃芒果等属于典型的呼吸跃变型水果。

\n

就是在绿熟期即可摘下,放一段时间自己会成熟。

\n

与之对应的就是非呼吸跃变型水果,比如樱桃草莓葡萄荔枝,

\n

出道即巅峰,多放一天坏一天。

\n
\"\"
\n

而促使呼吸跃变型水果成熟启动的主要信号分子大家都知道——乙烯[1]。

\n

乙烯的合成始于甲硫氨酸,

\n

想合成乙烯需要经过三次转化。

\n
首先是在 S - 腺苷甲硫氨酸合成酶作用下转化为 S - 腺苷甲硫氨酸(SAM),
然后在 ACC 合成酶(ACS)催化下生成 1 - 氨基环丙烷 - 1 - 羧酸(ACC),
最后在 ACC 氧化酶(ACO)作用下形成乙烯。
\n
\"\"
乙烯生物合成与信号传导通路图 b 为信号传导通路图
\n

这个过程随着温度上升呼吸作用的加强而飙升,

\n

最终到达顶峰后迅速下降,被称为跃变期。[2]

\n
\"\"
香蕉成熟度里乙烯和呼吸强度的速率,可以看到到了后期断崖式上升,下降
\n

而在这之前,香蕉刚被摘下来时还是只青涩的蕉,

\n

注意啦,

\n

青涩不是形容词,而是叙述词。

\n

此时果肉里 70%-80%是淀粉,结构紧密不说,

\n

这类淀粉人的肠胃很难消化吸收,可以说是又硬又难吃。

\n

同时,果肉里还含有不少单宁(鞣酸)和果胶,

\n

有小伙伴讲了:

\n

单宁我知道,干红葡萄酒里有,喝嘴里会产生褶皱感。

\n

没错,单宁具有强收敛作用,

\n

不光会让嘴巴产生褶皱感,还可能影响肠道功能,

\n

咱常吃的生柿子就含有不少,

\n

简单的说,吃起来不光涩,吃多了还容易便秘。

\n
所以生香蕉就压根不能吃,更不能减肥。
\n

香蕉皮就更别说了,果皮塞满了叶绿素 a 和 b,整个看起来是绿油油的,

\n

同时细胞壁由果胶基质 - 纤维素 - 半纤维素构成坚挺的网络,导致香蕉皮此时很硬,甚至很难扒开。

\n

这个阶段被称为青熟期。

\n

香蕉没法吃,但是已经满足收获的条件了。

\n

收获好的香蕉被运往全国各地,

\n
此时一段焦灼的小调响起,又到了奥德彪拉香蕉的时间。
\n
\"\"
\n

正常来说香蕉在树上会受到乙烯的刺激,触发自我催化。

\n

ACC 合成酶(ACS)和 ACC 氧化酶(ACO)基因表达上调,

\n

使乙烯爆发式增长,激活 ERF 转录因子调控成熟基因,

\n

此时,呼吸速率显著提高。

\n

乙烯激活了香蕉内部的淀粉酶、糖苷酶,淀粉水解为可溶性糖,果肉变软变甜。[3]

\n

香蕉表皮的叶绿素 a 和 b 被叶绿素酶降解,导致绿色褪去,

\n
\"\"
成熟香蕉果皮力度叶绿素和可溶性固形物含量,可以看到叶绿色消失,而可溶性固形物大大增加。
\n

类胡萝卜素合成开始增加,类黄酮含量上升,使果皮被显现出黄色,

\n

部分品种还会积累花青素,出现红香蕉。[4]

\n
\"\"
红香蕉长这样,变红是因为花青素。
\n

再之后,,,,,

\n

多聚半乳糖醛酸酶 (polygalaturonase,PG)催化果胶分子中的 α-1,4- 半乳糖苷键裂解,

\n

使得果胶降解,香蕉软了。

\n

α-L- 阿拉伯呋喃糖苷酶(α-L-Arabinofuranosidase, α-L-Af)降解细胞壁多糖中的阿拉伯糖残基,

\n

导致果胶溶解和细胞壁结构松散,香蕉更软了。[5]

\n

纤维素酶(Cellulase,CEL)和β-D- 木聚糖苷酶活性增强,干掉香蕉皮细胞壁中的部分骨架结构,

\n

使纤维素半纤维素降解,香蕉更更软了。

\n

香蕉皮中还积累了部分抗性淀粉,也也被降解成可溶性糖,用于给果皮代谢供能。

\n

更更更软了,所以,香蕉皮软了,也薄了。

\n

但是没变强。

\n

正常来说,这个过程随着气温升高而加快,

\n
\"\"
香蕉在 20°C 和 30°C 里各种酶的变化,可以看到温度越高曲线越高
\n

但是过了 30°C 后,高温会抑制叶绿素酶的发挥,

\n

导致出现香蕉果肉熟了,果皮还是绿色的情况。[6]

\n
\"\"
香蕉在 20°C 和 30°C 果实硬度和果皮色度变化,可以明显看到 30°C 果实软了,但是果皮颜色还是绿色。
\n

由于香蕉摘下后自然产出的乙烯含量明显降低,

\n

所以会在袋子里放入含有乙烯利(2- 氯乙基磷酸)的纸片。

\n

在运输过程中缓慢产出乙烯,模拟这一过程。

\n
\"\"
常见乙烯利卡片,类似一张小纸片。
\n

而除了乙烯,呼吸作用也是促使香蕉后熟的重要原因。

\n

所以提高环境中的二氧化碳浓度(大概在 4% - 6% ),

\n

降低氧气浓度(大约 2% - 5% )会显著提高香蕉的保鲜期。

\n

这就是气调储藏的原理。

\n

气调包装听着挺高大上,咱也挺常见,香蕉箱里那个透明袋就是气调袋。

\n
\"\"
香蕉气调袋
\n

当然了,万事皆有度,

\n

人工乙烯过度催熟,

\n

除了会因催熟不均导致部分单宁等物质未完全转化,使一些不是特别熟的香蕉发涩。

\n

还会导致香蕉后熟过快,

\n

而香蕉成熟的过程中代谢前体分解的过程会产生挥发性酯类化合物,是香蕉香味的来源。

\n

后熟过快会使得这些酯类化合物产出过少,失去香味。

\n

这就是为啥感觉有的香蕉熟了特别特别香,而有些香蕉却没味的原因。

\n
\"\"
香蕉从青熟到成熟后的过程。
\n

那么,现在。

\n

大声告诉我,香蕉君变软变黄的原因是哈?!!!!

\n

是乙烯吗?

\n

不,是哲♂学!!!!!!

\n
\"\"
\n
\n
\n\n\n\n\n
\n\n\n\n

", @@ -3391,28 +3611,6 @@ "hash": "effd0addb60e241f3b0f566c8634b7ee", "highlights": [] }, - { - "title": "为什么热带鱼的颜色五彩缤纷,其它地带的就没有那么鲜艳呢", - "description": "
\"头图\"/
\n

动物行为学的祖师爷康拉德·洛伦茨在他出版于 1963 年的《论攻击》一书里,也对热带鱼的颜色之鲜艳多变惊叹不已:

\n
\"\"
\n
\"\"
\n

所以这些鱼为什么有如此鲜艳的颜色呢?在潜水中,洛伦茨发现,这些鲜明的鱼有三个特性:

\n

1、它们定居在固定的地盘。

\n

2、它们用凶猛的攻击保护领地。

\n

3、除了捕食者猎食以外,它们只攻击同类的鱼。

\n

在实验室里,也出现了同样的现象,一个水族箱不能容下两条色彩鲜艳的鱼,否则会自相残杀到一条死去为止。

\n

为了进一步研究,洛伦茨和他的研究伙伴 Doris Zumpe 订做了一个两立方米的特大水缸,这样这些鱼都可以得到足够的空间建立自己的地盘。他们放进了 25 种小鱼,每种四条。Zumpe 经过统计发现,虽然鱼缸里同类的鱼只占很少的比例,每种鱼同类和异类之间咬架的频次之比为 85:15。

\n

所以答案就很明确了,鲜艳的色彩是同类互相争夺地盘时发出的信号,表示“别惹我!”。色彩越鲜明,同类越能清楚地感知到这一信息。

\n
\"\"
\n

那么为什么是热带的鱼而不是别的地方的鱼呢?下面是猫盟编辑的推测,未必全可信,但我想不会特别离题的。

\n

生物拥有两条基本的化学性质:

\n

1,所有生物控制生化活动的酶都对温度敏感,所以超出或者低于它们的最适温度,生命活性都会大打折扣。

\n

2,所有生物的生化活动都离不开水。

\n

另外还要加上第三条,大部分食物链是从绿色植物和藻类(光合作用)开始的,所以大部分生物离不开阳光。

\n

因此生命在什么样的地方最繁盛?集齐适宜的水、热、光三大因素的地方。所以庄稼在夏天生长而不是在冬天。

\n

热带的浅海就是具有丰富的水、热、光资源的地方。结果是这里的生物量和生物多样性都非常高,这是一个生命非常拥挤,或者说“卷”的地方。

\n

“卷”的环境有什么特征?

\n

你遭受到的压力大多是来自其他人,而不是来自物理环境的。

\n

同理,在一个生物密度非常高,生物之间的互动非常多的环境里,生物受到的自然选择大多是来自其他生物。

\n

于是在这种环境下,生物演化出大量的信号发给其他生物,颜色就是常用的一种发信号的方式。除了表示“从我的地盘滚开!”的颜色,还有表示“我有毒”的警告色。顺便一提,这些信号不一定意味着相互仇视,比如雄性动物可能有鲜艳颜色来吸引雌性,会给大鱼抓寄生虫的清洁鱼和清洁虾,也有鲜艳的条纹作为“医生制服”。

\n

类似的演化逻辑也适用于热带雨林。

\n
\"\"
\n
\"\"
\n
\"\"
\n
\"\"
\n
\"\"
猫盟在云南考察中拍下的一些色彩鲜艳的动植物。
\n

反过来在缺乏某一条件的环境,比如冰原、荒漠,动物的颜色就要单调得多。

\n

而光照条件差的环境比如深海,不仅生物的数量少,而且视觉信号也很难发出,也就是“深海里黑咕隆咚,大家谁也看不见谁,随便长长就得了”。

\n

但是要说明这个原则不是绝对的。比如以色彩鲜艳著称的鸡形目鸟,很多都不是生活在热带地区。比如六盘山的气候属于温带半湿润大陆性气候,我们在这里拍到了很多的红腹锦鸡。

\n
\"\"
\n
\n
\n\n\n\n\n
\n\n\n\n", - "content": "
\"头图\"/
\n

动物行为学的祖师爷康拉德·洛伦茨在他出版于 1963 年的《论攻击》一书里,也对热带鱼的颜色之鲜艳多变惊叹不已:

\n
\"\"
\n
\"\"
\n

所以这些鱼为什么有如此鲜艳的颜色呢?在潜水中,洛伦茨发现,这些鲜明的鱼有三个特性:

\n

1、它们定居在固定的地盘。

\n

2、它们用凶猛的攻击保护领地。

\n

3、除了捕食者猎食以外,它们只攻击同类的鱼。

\n

在实验室里,也出现了同样的现象,一个水族箱不能容下两条色彩鲜艳的鱼,否则会自相残杀到一条死去为止。

\n

为了进一步研究,洛伦茨和他的研究伙伴 Doris Zumpe 订做了一个两立方米的特大水缸,这样这些鱼都可以得到足够的空间建立自己的地盘。他们放进了 25 种小鱼,每种四条。Zumpe 经过统计发现,虽然鱼缸里同类的鱼只占很少的比例,每种鱼同类和异类之间咬架的频次之比为 85:15。

\n

所以答案就很明确了,鲜艳的色彩是同类互相争夺地盘时发出的信号,表示“别惹我!”。色彩越鲜明,同类越能清楚地感知到这一信息。

\n
\"\"
\n

那么为什么是热带的鱼而不是别的地方的鱼呢?下面是猫盟编辑的推测,未必全可信,但我想不会特别离题的。

\n

生物拥有两条基本的化学性质:

\n

1,所有生物控制生化活动的酶都对温度敏感,所以超出或者低于它们的最适温度,生命活性都会大打折扣。

\n

2,所有生物的生化活动都离不开水。

\n

另外还要加上第三条,大部分食物链是从绿色植物和藻类(光合作用)开始的,所以大部分生物离不开阳光。

\n

因此生命在什么样的地方最繁盛?集齐适宜的水、热、光三大因素的地方。所以庄稼在夏天生长而不是在冬天。

\n

热带的浅海就是具有丰富的水、热、光资源的地方。结果是这里的生物量和生物多样性都非常高,这是一个生命非常拥挤,或者说“卷”的地方。

\n

“卷”的环境有什么特征?

\n

你遭受到的压力大多是来自其他人,而不是来自物理环境的。

\n

同理,在一个生物密度非常高,生物之间的互动非常多的环境里,生物受到的自然选择大多是来自其他生物。

\n

于是在这种环境下,生物演化出大量的信号发给其他生物,颜色就是常用的一种发信号的方式。除了表示“从我的地盘滚开!”的颜色,还有表示“我有毒”的警告色。顺便一提,这些信号不一定意味着相互仇视,比如雄性动物可能有鲜艳颜色来吸引雌性,会给大鱼抓寄生虫的清洁鱼和清洁虾,也有鲜艳的条纹作为“医生制服”。

\n

类似的演化逻辑也适用于热带雨林。

\n
\"\"
\n
\"\"
\n
\"\"
\n
\"\"
\n
\"\"
猫盟在云南考察中拍下的一些色彩鲜艳的动植物。
\n

反过来在缺乏某一条件的环境,比如冰原、荒漠,动物的颜色就要单调得多。

\n

而光照条件差的环境比如深海,不仅生物的数量少,而且视觉信号也很难发出,也就是“深海里黑咕隆咚,大家谁也看不见谁,随便长长就得了”。

\n

但是要说明这个原则不是绝对的。比如以色彩鲜艳著称的鸡形目鸟,很多都不是生活在热带地区。比如六盘山的气候属于温带半湿润大陆性气候,我们在这里拍到了很多的红腹锦鸡。

\n
\"\"
\n
\n
\n\n\n\n\n
\n\n\n\n", - "category": "", - "link": "https://daily.zhihu.com/story/9782530", - "creator": "", - "pubDate": "Sun, 13 Jul 2025 08:27:02 +0800", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "资讯", - "feed": "知乎", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "565a00b28612b35d0e8b652eefd57d4e", - "highlights": [] - }, { "title": "为什么有时候无法控制自己的情绪?", "description": "
\"头图\"/
\n

由于天性敏感,成长至今我一直都在与强烈的情绪做对抗。管理情绪是我无时无刻都在做的事情,因为我相信:“ 驾驭情绪 = 驾驭人生。”

\n

如果一个人无法管理自己的情绪,任由情绪控制自己,不仅会伤到身边的人,更会伤到自己。无法控制情绪,有时候比生活无法自理后果更严重。

\n

当你意识到这个问题的存在,就已经是一件非常好的事情。以下是这些年我整理的一套对我自己适用的方法:

\n

1. 认识情绪 - 情绪圆盘

\n

应该有许多人和我一样,小时候并没有人教过我们情绪的种类。我在这几年养育自己的孩子时,因为他不会说话,所以我必须观察他的表情和动作,再给他的情绪进行命名,才知道如何去处理他的情绪。

\n

也就是在这个时候,我意识到我根本就不具备 “ 开心 ” “ 伤心 ” “ 生气 ” 等基础情绪词汇以外的词汇。这也就导致我在最初处理我孩子的情绪时,只能手忙脚乱的什么都给他,直到给到他要的那个东西为止。

\n

联想到我小时候,一件事情刺激了我的情绪时,我的大脑死机时只会会发生 “冻结 ” “ 攻击 ” “ 逃跑 ” 三种原始状态。为了高效识别我那还不会说话的孩子的需要,我第一次在人生中向自己提问,到底情绪有多少种?

\n

在无意间,我看到了这个:

\n
\"\"
\n

这张图叫作情绪圆盘(Emotion Wheel),又叫情绪之轮、情感轮盘、情绪图谱,最早由美国心理学家 Robert Plutchik 提出。他认为情绪像颜色一样有核心原色,也有混合、层级与强度。

\n

情绪圆盘的目的是帮助我们从模糊的 “我不太舒服” “我很烦”中,精准识别出情绪的种类、强度与成因,从而提升自我理解、沟通能力和情绪调节力。

\n

最基本的感受,Plutchik 定义为 8 种“情绪原色”:喜悦、信任、恐惧、惊讶、悲伤、厌恶、愤怒、期待。此外,还有衍生情绪与细化表达让情绪的定义更加丰富多彩。

\n

词汇量的限制让我们无法识别与命名自己的情绪,就导致我们无法控制情绪。所以我们首先需要去学会识别,在有情绪的那一秒,先问问自己:“ 你感受到了什么?” 才能逐渐去控制和驾驭自己的情绪。

\n

2. “ 你现在是什么感受?”

\n

这个问题,是无法控制情绪者直接跳过却最关键的问题。因为在我们的教育中,我们常常将被动的接受他人的感受视为一种礼仪与宽容。而我们常常忽略自己的感受,并将它压制在心底。一直到我们爆发为止。

\n

在我第一次教我孩子什么是情绪时,发现光说没用,于是我给他买了一个情绪小镜子。

\n
\"\"
\n

每当我感受到孩子的不同情绪时,我则会尽可能的用丰富的词汇帮他定义他此刻的感受。并且陪着他一起找到他真正想要做却自己做不到的事情。

\n

我的问题通常是三个:

\n
    \n
  • “ 你怎么啦?”
  • \n
  • “ 为什么会这样?”
  • \n
  • “ 可以不可以指给我看你要什么?”
  • \n
\n

同理,每个人对待自己,应该好好问问自己心里的小孩为什么会愤怒、伤心、痛苦,除了闷在心里或者爆发,我们有没有别的方式去表达?

\n

情绪是我们与世界互动最直接的语言。当你能精准地说出情绪,就拥有了更强的 自我掌控力、沟通能力与人际穿透力。

\n

所以常常要问自己:“ 你怎么啦?”

\n

3. 未被处理的心理创伤

\n

弗洛伊德说:“ 人会反复寻找类似早年创伤场景来“重新演出”,试图这一次赢回掌控感、修复当年的无力。”

\n

有时候我们的情绪无法控制,也是因为小时候没有治愈与闭环的一个心理创伤的重演。我们选择的人,常常又一次让我们失望。这就叫作 “ 重演强迫(Repetition Compulsion)”

\n

你的反应不是“过度”,而是你小时候的那部分受伤的你,在今天被某句话、某个动作,激活了旧有痛点。于是在心理学上,我们使用 “ 内在小孩(Inner Child)疗法” 去识别当年我们的伤,并以成年人的方式完成闭环。

\n

4. 情绪管理实操4.1. 呼吸法

\n

很长时间以来,由于有正念练习的习惯,我控制自己强烈情绪的最常用方式就是深呼吸。快速激活副交感神经的方式,深而缓的吸气和呼气,可以激活迷走神经,让心率减慢从而平静情绪。除此之外可以调节血氧与二氧化碳平衡、让注意力回到身体。

\n

我的钢琴老师教给我的呼吸方式是在脑子里数数,每一秒一个数字。吸 6 下,停顿,呼 4 下,停顿。吸气时,肚子鼓起来,呼气时,肚子扁下去(腹式呼吸)。

\n

4.2. 5-4-3-2-1 情绪锚定法

\n

这种适用于激烈情绪来临,并且你已经快失控的时候。也可以用于焦虑症患者濒死感爆发、恐慌发作、失眠等等情景。

\n
    \n
  • 看
  • \n
\n

环顾四周,说出你能看见的 5 个东西,详细描述外观

\n
    \n
  • 碰
  • \n
\n

说出你现在能碰到的 4 个东西,详细描述质感

\n
    \n
  • 听
  • \n
\n

并说出你现在能听到的 3 种声音,并描述它们的来源

\n
    \n
  • 闻
  • \n
\n

说一说你现在能闻到的两种味道,并描述这种味道的来源

\n
    \n
  • 尝
  • \n
\n

感受一下你嘴巴里的味道

\n

最后,慢慢吐气,反复一轮。

\n

4.3. 情绪小游戏

\n

这是我在一本叫《小学生心理手册》上看到的,由于我是教育学专业,课程中很大一部分占比是心理学。然而我觉得专业心理学知识其实并不适合每个人看。因为心理学是一个庞大的学科,里面包含了神经学、生物学、医学等交叉领域。很容易把自己看出问题,觉得自己有病。

\n

这本书是我在给孩子做情绪引导的时候真正会用的一本书,帮助他说出他想说的话。也在这个过程中,我找到了很多我小时候感觉受伤却不知道为什么的成因。这本书名字虽然很不怎么样,但是它其实同样适用于成年人,可以重新治愈一次内心小小的自己。

\n
\"\"
\n

这里面我最喜欢的游戏例如:

\n
    \n
  • 写出能立即让自己开心的几件事情,例如:吃个冰激凌、吃个火锅、买一件新衣服等等
  • \n
  • 写出让自己恐惧的事情,
  • \n
  • 将自己现在的情绪全部都剪成小纸片,塞到一个瓶子里
  • \n
\n

时间久了你会发现,原来有情绪,并不是那么可怕的事情,甚至是有趣的。只是我们也许从小没有真正的经历过系统性的情绪管理训练,导致我们一直都觉得自己:

\n

有情绪 = 不稳定 = 有病。

\n

情绪的输出是必要的,也是健康的。我们要告诉自己,我们没有病,我们只是却不知道怎么表达自己的情绪。

\n

5. 允许自己有情绪才能更好的认识自己

\n

一个没有情绪的人,要么生病了,要么死了。真正的情绪稳定,并不是不发脾气压抑自己,而是能够直面情绪的存在与发生,并且接受它存在的合理性。

\n

即使是焦虑和恐惧,也都是原始社会中让人活命的必要情绪,否则你将识别不出危险。所以情绪的存在是必要的。而我们不能以绝对的方式去 “攻击” 或 “逃跑”, 而是要学会在不伤害他人的情况下,表明自己的情绪。

\n

记住,你的情绪,决定了你的命运。

\n

最后,请好好治愈你自己吧!愿每个像我一样的人,最终找到一个驾驭自己情绪的方式,快乐开心的生活。

\n
\n
\n\n\n\n\n
\n\n\n\n

", @@ -3559,25 +3757,487 @@ "description": "知乎日报全文RSS。获取更多全文RSS:https://feedx.net", "items": [ { - "title": "独腿博士研发智能假肢,让更多残疾人穿得起Wear robotic knees", - "description": "幼时截肢的他,最终发明、制造出一种独特而“有思想”的智能假肢!", - "content": "幼时截肢的他,最终发明、制造出一种独特而“有思想”的智能假肢!", - "category": "人物", - "link": "http://www.i21st.cn/story/3805.html", - "creator": "www.i21st.cn", - "pubDate": "Fri, 2 Sep 2022 07:00:00", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "双语", - "feed": "21世纪", + "title": "一周练完!100个Python实战项目,太实用了,绝对不能错过(附完整版源码+教程)", + "description": "Python 是一种极具可读性和通用性的编程语言。", + "content": "
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n Python 是一种极具可读性和通用性的编程语言\n \n \n \n \n \n \n 。Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣。Python 易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择。\n \n

\n

\n \n Python 是一种多范式语言,也就是说,它支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的。随着越来越多地在工业中,被诸如联合太空联盟\n \n \n \n \n \n \n (NASA 的主要飞机支持承包商)和工业光魔\n \n \n \n \n \n \n (VFX 和卢卡斯影业的动画工作室\n \n \n \n \n \n \n )等组织使用,Python 为那些寻求额外编程语言的人提供了巨大的潜力 。\n \n

\n

\n \n 当一个重要的被称为 comp.lang.python 的 Python 新闻组\n \n \n \n \n \n \n 在 1994 年形成时,Python 的用户基础不断增长,这为 Python 成为开源开发中最受欢迎的编程语言之一铺平了道路。\n \n

\n

\n \n Python当下真的很火。Python实战项目,也一直尤为关注,接下来,和大家介绍下100个Python练手的实战项目。\n \n

\n
\n \"图片\"\n
\n
\n \"图片\"\n
\n

\n \n \n \n 每个项目都有详细的视频讲解,跟随老师带你一步步完成敲代码的过程,在过程中结合多学知识提升能力,帮助怒更好地完成练习。\n \n \n \n \n
\n
\n

\n

\n \n 100个Python项目列表:\n \n

\n
    \n
  1. \n

    \n \n 1.python自动获取海量IP工具\n \n

    \n
  2. \n
  3. \n

    \n \n 2.python自动获取酷狗音乐工具\n \n

    \n
  4. \n
  5. \n

    \n \n 3.Python自动化开发-制作名片卡\n \n

    \n
  6. \n
  7. \n

    \n \n 4.Python自动化开发-制作名片卡\n \n

    \n
  8. \n
  9. \n

    \n \n 5.Python自动化开发-批量发邮件通知\n \n

    \n
  10. \n
  11. \n

    \n \n 6.Python自动化开发-考勤处理\n \n

    \n
  12. \n
  13. \n

    \n \n 7.Python双色球系统\n \n

    \n
  14. \n
  15. \n

    \n \n 8.Python批量获取王者荣耀皮肤\n \n

    \n
  16. \n
  17. \n

    \n \n 9.Python获取阴阳师壁纸\n \n

    \n
  18. \n
  19. \n

    \n \n 10.Python获取小说数据并分析\n \n

    \n
  20. \n
  21. \n

    \n \n 11.Python获取NBA数据\n \n

    \n
  22. \n
  23. \n

    \n \n 12.python获取拉钩工具\n \n

    \n
  24. \n
  25. \n

    \n \n 13.Python获取房天下数据\n \n

    \n
  26. \n
  27. \n

    \n \n 14.Python获取彩票信息\n \n

    \n
  28. \n
  29. \n

    \n \n 15.Python合成女神图片\n \n

    \n
  30. \n
  31. \n

    \n \n 16.Python法拍网数据\n \n

    \n
  32. \n
  33. \n

    \n \n 17.Python操作Excel自动化开发\n \n

    \n
  34. \n
  35. \n

    \n \n 18.python百行制作查询工具\n \n

    \n
  36. \n
  37. \n

    \n \n 19.python百行制作登录系统\n \n

    \n
  38. \n
  39. \n

    \n \n 20.Python百行代码实现点赞系统\n \n

    \n
  40. \n
  41. \n

    \n \n 21.Python百行代码实现抽奖系统\n \n

    \n
  42. \n
  43. \n

    \n \n 22.Python自动获取小说工具\n \n

    \n
  44. \n
  45. \n

    \n \n 23.python获取喜马拉雅音频\n \n

    \n
  46. \n
  47. \n

    \n \n 24.python快速获取斗图表情\n \n

    \n
  48. \n
  49. \n

    \n \n 25.python获取主播小视频\n \n

    \n
  50. \n
  51. \n

    \n \n 26.python自动工资条\n \n

    \n
  52. \n
  53. \n

    \n \n 27.python协程详解公开课\n \n

    \n
  54. \n
  55. \n

    \n \n 28.python制作12306查票工具\n \n

    \n
  56. \n
  57. \n

    \n \n 29.python爬虫30行拿LOL皮肤\n \n

    \n
  58. \n
  59. \n

    \n \n 30.python抓取相亲网数据\n \n

    \n
  60. \n
  61. \n

    \n \n 31.python抓取百合网数据\n \n

    \n
  62. \n
  63. \n

    \n \n 32.python游戏开发公开课\n \n

    \n
  64. \n
\n

\n \n ......\n \n

\n

\n \n \n 91.【Python 图片转字符画】\n \n \n \n
\n
\n \n \n 92.【200行Python代码实现2048】\n \n \n \n
\n
\n \n \n 93.【Python3 实现火车票查询工具】\n \n \n \n
\n
\n \n \n 94.【高德API+Python解决租房问题】\n \n \n \n
\n
\n \n \n 95.【Python3色情图片识别】\n \n \n \n
\n
\n \n \n 96.【Python 破解验证码】\n \n \n \n
\n
\n \n \n 97.【Python实现简单的Web服务器】\n \n \n \n
\n
\n \n \n 98.【pygame开发打飞机游戏】\n \n \n \n
\n
\n \n \n 99.【Django 搭建简易博客】\n \n \n \n
\n
\n \n \n 100.【Python基于共现提取《釜山行》人物关系】\n \n \n

\n

\n \n \n \n 完整项目已经打包整理好了,希望对正在学习的你带来帮助~多动手练习,才能不断地巩固知识,更快的进步!\n \n \n \n

\n

\n \n \n \n \n 获取方式:\n \n \n \n \n

\n

\n \n \n \n \n 1.点赞+在看\n \n \n \n \n

\n

\n \n \n \n \n 2.私信回复:学习  领取。\n \n \n \n \n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/FbDBJnT9ltXgkcS6vViYaA", + "creator": "python开发工程师", + "pubDate": "Mon, 14 Jul 2025 07:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwm6QzeJkQsibiaKQWY9iaEoFlmS0lJ0jg9ou1icgCTBtGmsr8KagTiaWf98S2u6H1pR6JeNMSunLmsUMg/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwm6QzeJkQsibiaKQWY9iaEoFlmS0lJ0jg9ou1icgCTBtGmsr8KagTiaWf98S2u6H1pR6JeNMSunLmsUMg/0?wx_fmt=jpeg", + "id": "2247511348_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", "read": false, "favorite": false, "created": false, "tags": [], - "hash": "676d7c24905f895766b5d18b3fa0fd8c", + "hash": "2352d4354695dde18515b9b7b64ead5e", + "highlights": [] + }, + { + "title": "自学python必看的书籍《Python编程:从入门到实践》PDF版拿走不谢", + "description": "自学python必看的书籍《Python编程:从入门到实践》内容简介本书是一本针对所有层次的Python 读者", + "content": "
\n

\n \n \n 自学python必看的书籍《Python编程:从入门到实践》\n \n \n

\n

\n \n
\n
\n

\n

\n \n \"图片\"\n \n

\n

\n \n \n 内容简介\n \n \n

\n

\n \n 本书是一本针对所有层次的Python 读者而作的Python 入门书。全书分两部分:\n \n

\n

\n \n 第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy 和Pygal 等强大的Python 库和工具介绍,以及列表、字典、if 语句、类、文件与异常、代码测试等内容;\n \n

\n

\n \n 第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的Python 2D 游戏开发如何利用数据生成交互式的信息图,以及创建和定制简单的Web 应用,并帮读者解决常见编程问题和困惑。\n \n

\n

\n \n
\n
\n

\n

\n \n \n 目录\n \n \n

\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n

\n \n \n 书籍的分享格式为PDF电子版,小伙伴们手机也可以阅读学习哦!\n \n \n

\n

\n \n \n 书籍终归只是辅助,想要真的深入学习python,当然还要有系统的学习方法和学习教程才可以让你在学习的路上一帆风顺哦!\n \n \n

\n

\n \n \n 本套视频一共400集,本套视频共分3季:\n \n \n

\n

\n \n 第一季 【基础篇】Python基础 (115集)\n \n

\n

\n \n 第二季 【提高篇】Python深入和扩展(100集)\n \n

\n

\n \n 第三季 【扩展篇】网络编程、多线程、扩展库(85集)\n \n

\n

\n \n 第四季 【高手篇】算法、Python源码、函数式编程、手工实现神经网络(100集)\n \n

\n

\n \n
\n
\n

\n
\n \n \"图片\"\n \n
\n

\n \n \n 以上这些教程我已经为大家打包准备好了,希望对正在学习的你有所帮助!\n \n \n

\n
    \n
  1. \n

    \n \n \n \n 获取方式:公众号私信回复“学习”即可\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 需要的小伙伴可以多多点赞转发 让更多的人看到\n \n \n \n

    \n
  4. \n
\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/CFfrCyYKJX5rJG0qS4_CqQ", + "creator": "python开发工程师", + "pubDate": "Sat, 12 Jul 2025 06:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwm6QzeJkQsibiaKQWY9iaEoFlhj1dyuLP0Bqe2vJOHbia2M04j6GCRMERWfZVcZialbuOxhrZKTN0j3mg/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwm6QzeJkQsibiaKQWY9iaEoFlhj1dyuLP0Bqe2vJOHbia2M04j6GCRMERWfZVcZialbuOxhrZKTN0j3mg/0?wx_fmt=jpeg", + "id": "2247511336_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "6ece793eae1a41b9db83f1da32129968", + "highlights": [] + }, + { + "title": "太强了!Python+Excel真的是神仙组合!", + "description": "这本书是由流行开源Python库xlwings 创始人:费利克斯 •朱姆斯坦(Felix Zumstein)所", + "content": "
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n 这本书是由流行开源Python库xlwings 创始人:费利克斯 •朱姆斯坦(Felix Zumstein)所撰写,书中详细阐述了如何将Python与Excel结合使用,让任务自动化,从而实现效率飞跃!\n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n 为了让初学者克服对Python的恐惧,作者特意将教程内容设计成从简单到复杂的顺序进行介绍\n \n

\n

\n \n 这本教程共分为12章:\n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n 第一至三章主要是Python入门知识:如何搭建 Python环境、掌握基础知识,以及如何导入和使用Python模块\n \n

\n

\n \n 第四至八章通过丰富的实例教学,详细讲解了如何利用Python对Excel进行各种操作\n \n

\n

\n \n 第九至十二章则专注于如何在Excel中执行 Python代码,如何实现自动化,以及案例解析\n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n
\n

\n \n \n 以上这些教程我已经为大家打包准备好了,希望对正在学习的你有所帮助!\n \n \n

\n
    \n
  1. \n

    \n \n \n \n 获取方式:公众号内回复“学习”即可\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 需要的小伙伴可以多多点赞转发 让更多的人看到\n \n \n \n

    \n
  4. \n
\n
\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/1GdvQhdggH083l4xd2DsaQ", + "creator": "python开发工程师", + "pubDate": "Fri, 11 Jul 2025 06:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwSZYGiaKv8xXtfjx0PZ3rnz7UVVAicqkGIn3hx7YibZjucNnNicZyITia0QzVDKickCAGud4ehhrFhVQog/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwSZYGiaKv8xXtfjx0PZ3rnz7UVVAicqkGIn3hx7YibZjucNnNicZyITia0QzVDKickCAGud4ehhrFhVQog/0?wx_fmt=jpeg", + "id": "2247511330_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "d933a65ab5f209bc10d5d61a42d78b61", + "highlights": [] + }, + { + "title": "自学python必看的书籍《Python编程:从入门到实践》PDF版拿走不谢", + "description": "自学python必看的书籍《Python编程:从入门到实践》内容简介本书是一本针对所有层次的Python 读者", + "content": "
\n

\n \n \n 自学python必看的书籍《Python编程:从入门到实践》\n \n \n

\n

\n \n
\n
\n

\n

\n \n \"图片\"\n \n

\n

\n \n \n 内容简介\n \n \n

\n

\n \n 本书是一本针对所有层次的Python 读者而作的Python 入门书。全书分两部分:\n \n

\n

\n \n 第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy 和Pygal 等强大的Python 库和工具介绍,以及列表、字典、if 语句、类、文件与异常、代码测试等内容;\n \n

\n

\n \n 第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的Python 2D 游戏开发如何利用数据生成交互式的信息图,以及创建和定制简单的Web 应用,并帮读者解决常见编程问题和困惑。\n \n

\n

\n \n
\n
\n

\n

\n \n \n 目录\n \n \n

\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n

\n \n \n 书籍的分享格式为PDF电子版,小伙伴们手机也可以阅读学习哦!\n \n \n

\n

\n \n \n 书籍终归只是辅助,想要真的深入学习python,当然还要有系统的学习方法和学习教程才可以让你在学习的路上一帆风顺哦!\n \n \n

\n

\n \n \n 本套视频一共400集,本套视频共分3季:\n \n \n

\n

\n \n 第一季 【基础篇】Python基础 (115集)\n \n

\n

\n \n 第二季 【提高篇】Python深入和扩展(100集)\n \n

\n

\n \n 第三季 【扩展篇】网络编程、多线程、扩展库(85集)\n \n

\n

\n \n 第四季 【高手篇】算法、Python源码、函数式编程、手工实现神经网络(100集)\n \n

\n

\n \n
\n
\n

\n
\n \n \"图片\"\n \n
\n

\n \n
\n
\n

\n

\n \n \n 以上这些教程我已经为大家打包准备好了,希望对正在学习的你有所帮助!\n \n \n

\n
    \n
  1. \n

    \n \n \n \n 获取方式:公众号私信回复“学习”即可\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 需要的小伙伴可以多多点赞转发 让更多的人看到\n \n \n \n

    \n
  4. \n
\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/4lrbYqMOMaeZY0ePHWyBVg", + "creator": "python开发工程师", + "pubDate": "Thu, 10 Jul 2025 06:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwSZYGiaKv8xXtfjx0PZ3rnzgwZqTn10rhwticCVNicEzMpLia4Bvko08qBXYSYPcRNLtEm6ZiaJRHWpmw/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwSZYGiaKv8xXtfjx0PZ3rnzgwZqTn10rhwticCVNicEzMpLia4Bvko08qBXYSYPcRNLtEm6ZiaJRHWpmw/0?wx_fmt=jpeg", + "id": "2247511324_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "fb4a24facd693493c2b06a9376b12688", + "highlights": [] + }, + { + "title": "2025神仙级Python入门教程(非常详细),从零基础入门到精通,从看这篇开始", + "description": "一、初聊Python1.为什么要学习Python?", + "content": "None", + "category": "", + "link": "https://mp.weixin.qq.com/s/aPfUq3xH50ek4TFkAOq2fA", + "creator": "python开发工程师", + "pubDate": "Thu, 10 Jul 2025 06:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwSZYGiaKv8xXtfjx0PZ3rnzYppRh6oj0fAdf8PNtTib0Y6DV8edz3pEbyDBpb2Rk6SFAwibqrOaWHrQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwSZYGiaKv8xXtfjx0PZ3rnzYppRh6oj0fAdf8PNtTib0Y6DV8edz3pEbyDBpb2Rk6SFAwibqrOaWHrQ/0?wx_fmt=jpeg", + "id": "2247511324_1", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "743550d894428decfbde5b814601cf70", + "highlights": [] + }, + { + "title": "每天五分钟—Python知识点总结13张思维导图(附全套教程)", + "description": "如果初学者接触的第一门语言是Python,学习曲线则会平滑得多,掌握一些基本语法和Python内置的数据结构,", + "content": "
\n

\n \n
\n
\n

\n
\n

\n \n \n 如果初学者接触的第一门语言是Python,学习曲线则会平滑得多\n \n \n \n ,掌握一些基本语法和Python内置的数据结构,已经可以上手写一些小工具或者小型应用。这对初学者来说,非常重要。因为学习的过程是一个突破舒适区的过程,会面临很多痛苦,如果学习过程得不到激励,很容易半途而废,类似我们开玩笑说的「从入门到放弃」。\n \n \n \n Python还有很多优点:\n \n \n \n 上手快,第三方库丰富,资料丰富,很容易做出“可见可得”的应用。\n \n \n \n Python所需要学习的知识基础知识\n \n \n \n Python最基本的语言特性和语法:•变量•数据类型与数据结构•输入和输出•运算符、表达式、语句•控制流(顺序控制,选择控制和循环控制)•面向过程编程•面向对象编程•异常处理•组织代码•标准库、第三方库\n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n \n 为大家准备了一些python的学习教程和PDF格式的python电子书籍,希望可以帮助到大家。\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n 以上这些教程我已经为大家打包准备好了,希望对正在学习的你有所帮助!\n \n \n

\n
    \n
  1. \n

    \n \n \n \n 获取方式:公众号内回复“学习”即可\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 需要的小伙伴可以多多点赞转发 让更多的人看到\n \n \n \n

    \n
  4. \n
\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/p1kNytp-ZuUyIa4g6FQemg", + "creator": "python开发工程师", + "pubDate": "Wed, 09 Jul 2025 06:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzibdZyOl6Eib8HHXcT1nesbEDU5QxVTKl7ibKiaia6p9HI6PiausBDyjib4ibx7TlS7XX8xicFn6hJdXnpuRQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzibdZyOl6Eib8HHXcT1nesbEDU5QxVTKl7ibKiaia6p9HI6PiausBDyjib4ibx7TlS7XX8xicFn6hJdXnpuRQ/0?wx_fmt=jpeg", + "id": "2247511318_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "5b731a170332c34c2ac69fa674d01432", + "highlights": [] + }, + { + "title": "一周练完!100个Python实战项目,太实用了,绝对不能错过(附完整版源码+教程)", + "description": "Python 是一种极具可读性和通用性的编程语言。", + "content": "
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n Python 是一种极具可读性和通用性的编程语言\n \n \n \n \n \n \n 。Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣。Python 易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择。\n \n

\n

\n \n Python 是一种多范式语言,也就是说,它支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的。随着越来越多地在工业中,被诸如联合太空联盟\n \n \n \n \n \n \n (NASA 的主要飞机支持承包商)和工业光魔\n \n \n \n \n \n \n (VFX 和卢卡斯影业的动画工作室\n \n \n \n \n \n \n )等组织使用,Python 为那些寻求额外编程语言的人提供了巨大的潜力 。\n \n

\n

\n \n 当一个重要的被称为 comp.lang.python 的 Python 新闻组\n \n \n \n \n \n \n 在 1994 年形成时,Python 的用户基础不断增长,这为 Python 成为开源开发中最受欢迎的编程语言之一铺平了道路。\n \n

\n

\n \n Python当下真的很火。Python实战项目,也一直尤为关注,接下来,和大家介绍下100个Python练手的实战项目。\n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n \n 每个项目都有详细的视频讲解,跟随老师带你一步步完成敲代码的过程,在过程中结合多学知识提升能力,帮助怒更好地完成练习。\n \n \n \n \n
\n
\n

\n

\n \n 100个Python项目列表:\n \n

\n
    \n
  1. \n

    \n \n 1.python自动获取海量IP工具\n \n

    \n
  2. \n
  3. \n

    \n \n 2.python自动获取酷狗音乐工具\n \n

    \n
  4. \n
  5. \n

    \n \n 3.Python自动化开发-制作名片卡\n \n

    \n
  6. \n
  7. \n

    \n \n 4.Python自动化开发-制作名片卡\n \n

    \n
  8. \n
  9. \n

    \n \n 5.Python自动化开发-批量发邮件通知\n \n

    \n
  10. \n
  11. \n

    \n \n 6.Python自动化开发-考勤处理\n \n

    \n
  12. \n
  13. \n

    \n \n 7.Python双色球系统\n \n

    \n
  14. \n
  15. \n

    \n \n 8.Python批量获取王者荣耀皮肤\n \n

    \n
  16. \n
  17. \n

    \n \n 9.Python获取阴阳师壁纸\n \n

    \n
  18. \n
  19. \n

    \n \n 10.Python获取小说数据并分析\n \n

    \n
  20. \n
  21. \n

    \n \n 11.Python获取NBA数据\n \n

    \n
  22. \n
  23. \n

    \n \n 12.python获取拉钩工具\n \n

    \n
  24. \n
  25. \n

    \n \n 13.Python获取房天下数据\n \n

    \n
  26. \n
  27. \n

    \n \n 14.Python获取彩票信息\n \n

    \n
  28. \n
  29. \n

    \n \n 15.Python合成女神图片\n \n

    \n
  30. \n
  31. \n

    \n \n 16.Python法拍网数据\n \n

    \n
  32. \n
  33. \n

    \n \n 17.Python操作Excel自动化开发\n \n

    \n
  34. \n
  35. \n

    \n \n 18.python百行制作查询工具\n \n

    \n
  36. \n
  37. \n

    \n \n 19.python百行制作登录系统\n \n

    \n
  38. \n
  39. \n

    \n \n 20.Python百行代码实现点赞系统\n \n

    \n
  40. \n
  41. \n

    \n \n 21.Python百行代码实现抽奖系统\n \n

    \n
  42. \n
  43. \n

    \n \n 22.Python自动获取小说工具\n \n

    \n
  44. \n
  45. \n

    \n \n 23.python获取喜马拉雅音频\n \n

    \n
  46. \n
  47. \n

    \n \n 24.python快速获取斗图表情\n \n

    \n
  48. \n
  49. \n

    \n \n 25.python获取主播小视频\n \n

    \n
  50. \n
  51. \n

    \n \n 26.python自动工资条\n \n

    \n
  52. \n
  53. \n

    \n \n 27.python协程详解公开课\n \n

    \n
  54. \n
  55. \n

    \n \n 28.python制作12306查票工具\n \n

    \n
  56. \n
  57. \n

    \n \n 29.python爬虫30行拿LOL皮肤\n \n

    \n
  58. \n
  59. \n

    \n \n 30.python抓取相亲网数据\n \n

    \n
  60. \n
  61. \n

    \n \n 31.python抓取百合网数据\n \n

    \n
  62. \n
  63. \n

    \n \n 32.python游戏开发公开课\n \n

    \n
  64. \n
\n

\n \n ......\n \n

\n

\n \n \n 91.【Python 图片转字符画】\n \n \n \n
\n
\n \n \n 92.【200行Python代码实现2048】\n \n \n \n
\n
\n \n \n 93.【Python3 实现火车票查询工具】\n \n \n \n
\n
\n \n \n 94.【高德API+Python解决租房问题】\n \n \n \n
\n
\n \n \n 95.【Python3色情图片识别】\n \n \n \n
\n
\n \n \n 96.【Python 破解验证码】\n \n \n \n
\n
\n \n \n 97.【Python实现简单的Web服务器】\n \n \n \n
\n
\n \n \n 98.【pygame开发打飞机游戏】\n \n \n \n
\n
\n \n \n 99.【Django 搭建简易博客】\n \n \n \n
\n
\n \n \n 100.【Python基于共现提取《釜山行》人物关系】\n \n \n

\n

\n \n \n \n 完整项目已经打包整理好了,希望对正在学习的你带来帮助~多动手练习,才能不断地巩固知识,更快的进步!\n \n \n \n

\n

\n \n \n \n \n 获取方式:\n \n \n \n \n

\n

\n \n \n \n \n 1.点赞+在看\n \n \n \n \n

\n

\n \n \n \n \n 2.私信回复:学习  领取。\n \n \n \n \n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/XrEsOr0cazZXOOMbBlWUqg", + "creator": "python开发工程师", + "pubDate": "Mon, 07 Jul 2025 06:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZxW21P2Wlme8ePMGec1BlUXI51Wbbiaf3qiadUcNt2w96yO3gInlACicOaN1ibuj14dxFPocqYkhs8grg/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZxW21P2Wlme8ePMGec1BlUXI51Wbbiaf3qiadUcNt2w96yO3gInlACicOaN1ibuj14dxFPocqYkhs8grg/0?wx_fmt=jpeg", + "id": "2247511306_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "d18f8425d7748ea43c815c70b404cbd4", + "highlights": [] + }, + { + "title": "自学python必看的书籍《Python编程:从入门到实践》", + "description": "内容简介本书是一本针对所有层次的Python 读者而作的Python 入门书。", + "content": "
\n

\n \n
\n
\n

\n

\n \n \"图片\"\n \n

\n

\n \n \n 内容简介\n \n \n

\n

\n \n 本书是一本针对所有层次的Python 读者而作的Python 入门书。全书分两部分:\n \n

\n

\n \n 第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy 和Pygal 等强大的Python 库和工具介绍,以及列表、字典、if 语句、类、文件与异常、代码测试等内容;\n \n

\n

\n \n 第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的Python 2D 游戏开发如何利用数据生成交互式的信息图,以及创建和定制简单的Web 应用,并帮读者解决常见编程问题和困惑。\n \n

\n

\n \n
\n
\n

\n

\n \n \n 目录\n \n \n

\n

\n \n
\n
\n

\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n

\n \n
\n
\n

\n

\n \n \n 书籍的分享格式为PDF电子版,小伙伴们手机也可以阅读学习哦!\n \n \n

\n

\n \n \n 书籍终归只是辅助,想要真的深入学习python,当然还要有系统的学习方法和学习教程才可以让你在学习的路上一帆风顺哦!\n \n \n

\n

\n \n \n 本套视频一共400集,本套视频共分3季:\n \n \n

\n

\n \n 第一季 【基础篇】Python基础 (115集)\n \n

\n

\n \n 第二季 【提高篇】Python深入和扩展(100集)\n \n

\n

\n \n 第三季 【扩展篇】网络编程、多线程、扩展库(85集)\n \n

\n

\n \n 第四季 【高手篇】算法、Python源码、函数式编程、手工实现神经网络(100集)\n \n

\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \n \"图片\"\n \n
\n

\n \n
\n
\n

\n

\n \n \n 以上这些教程我已经为大家打包准备好了,希望对正在学习的你有所帮助!\n \n \n

\n
    \n
  1. \n

    \n \n \n \n 获取方式:公众号私信回复“学习”即可\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 需要的小伙伴可以多多点赞转发 让更多的人看到\n \n \n \n

    \n
  4. \n
\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/c_5LNvw3SAjwBdMs9TRztQ", + "creator": "python开发工程师", + "pubDate": "Sat, 05 Jul 2025 06:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZxW21P2Wlme8ePMGec1BlUXOFYxYplAyK6CLl2x2bH4d2ZWosUWkQlGPFHSr7MpMNoggFfhVnvzag/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZxW21P2Wlme8ePMGec1BlUXOFYxYplAyK6CLl2x2bH4d2ZWosUWkQlGPFHSr7MpMNoggFfhVnvzag/0?wx_fmt=jpeg", + "id": "2247511294_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "7dcfc8e3ce8ac73a506470cf4f75b40b", + "highlights": [] + }, + { + "title": "非常喜欢python!读懂这三本书,学python事半功倍。", + "description": "非常喜欢python我非常喜欢python,在前面5年里,它一直是我热衷使用并不断研究的语言,迄今为止,pyt", + "content": "
\n

\n \n \n 非常喜欢python\n \n \n

\n \n 我非常喜欢python,在前面5年里,它一直是我热衷使用并不断研究的语言,迄今为止,python都非常友好并且易于学习!\n \n

\n

\n \n 它几乎可以做任何事,从简单的脚本创建、web,到数据可视化以及AI人工智能,使热衷python的人群变得越来越多。\n \n

\n

\n \n 接下来推荐3本学python一定要看的书籍,有了他们,至少能节省50%的时间少走一半的弯路!\n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n

\n \n 零基础学python必看\n \n

\n

\n \n 《父与子编程:与小卡特一起学python》\n \n

\n

\n \n 这本书是零基础看的书籍,对于很多刚接触编程的小白来说,对于很多名词是很难理解的,本书把知识点拆的很细,更难得的是那些难理解的技术名词,这本书都是用场景对话、动画的形式展现,让初学者更容易学会;\n \n \n \n 看了它,你就会发现python是多么容易!\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n python技能加强必看\n \n

\n

\n \n \n 《\n \n \n \n \n python cookbook\n \n \n \n \n 》\n \n \n

\n

\n \n \n 本书介绍了应用在各个领域的技巧和方法,涵盖了很多高级主题:元编程、网络、\n \n \n \n \n web编程\n \n \n \n \n 、实用脚本、系统管理、C语言拓展等。\n \n \n

\n

\n \n 本书还覆盖了许多python日常开发中的问题以及解决方案,在实际开发中的编程技巧,告诉你python如何工作并且为什么工作!\n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n python项目经验\n \n

\n

\n \n 《python高手之路》\n \n

\n

\n \n 众所周知,项目经验以及底层知识拓展对于一个程序员的进阶来说是非常重要的!\n \n

\n

\n \n 《python高手之路》它是从一个项目的第一步开始,从整个项目的架构设计、对模块和库的处理来构建一个完整的项目。\n \n

\n

\n \n 它还设计了很多比较底层的知识,性能优化,架构设计等拓展知识来增加读者的专业技能!\n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n 附赠三本python必学书电子档\n \n

\n

\n \n 对于初学python,或者才接触编程这个行业的人来说,这三本书将帮助你少走很多弯路,节省你许多的学习时间。\n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n 如果你需要这三本书籍的电子档,\n \n \n \n 可以\n \n \n

\n

\n \n \n 1.点赞+再看\n \n \n

\n

\n \n \n 2.公众号私信内回复:“学习”\n \n \n

\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/klHD6BcO82lOyTusTlp5Tg", + "creator": "python开发工程师", + "pubDate": "Fri, 04 Jul 2025 04:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwqm1fyIIFpxnqmrUNyQznwvvWZ7aEib8uGSiambx2okPyrWWPPibmRz0queMXr6U7qvAgLME9r34ibpw/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwqm1fyIIFpxnqmrUNyQznwvvWZ7aEib8uGSiambx2okPyrWWPPibmRz0queMXr6U7qvAgLME9r34ibpw/0?wx_fmt=jpeg", + "id": "2247511287_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "dcf70fe51f897760827e674a15584849", + "highlights": [] + }, + { + "title": "练完这102个项目,你的Python就牛了", + "description": "Python 初学者在迈过安装编程环境和基本语法的门槛,准备大展身手的时候,可能突然就会进入迷茫期:不知道做些", + "content": "
\n

\n \n
\n
\n

\n

\n \n \n \n \n

\n
\n \"图片\"\n
\n

\n \n Python 初学者在迈过安装编程环境和基本语法的门槛,准备大展身手的时候,可能突然就会进入迷茫期:\n \n

\n

\n \n 不知道做些什么、再学些什么。\n \n

\n

\n \n 然后对编程的兴趣就会慢慢消退,找不到坚持下去的理由,从而慢慢淡忘之前学会的编程知识。\n \n

\n

\n \n 所以找到自己感兴趣、能够跟着动手和学习的 Python 项目是特别重要的❗❗❗\n \n

\n

\n \n 这样才能把学会的Python 知识用起来,不断地提高。最终从新手晋升为高手\n \n

\n

\n \n 不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦\n \n

\n

\n \n 不用多说大家都知道学编程语言一定要做项目才行。\n \n

\n

\n \n 1、[Python 图片转字符画]\n \n

\n

\n \n 2、【200行Python代码实现2048]\n \n

\n

\n \n 3、[Python3实现火车票查询工具]\n \n

\n

\n \n 4、【高德API+Python解决租房问题]\n \n

\n

\n \n 5、【Python3色情图片识别]\n \n

\n

\n \n 6、【Python破解验证码]\n \n

\n

\n \n 7、【Python实现简单的Web服务器]\n \n

\n

\n \n 8、【pygame开发打飞机游戏]\n \n

\n

\n \n 9、[Django搭建简易博客]\n \n

\n

\n \n 10、[Python基于共现提取《釜山行》人物关系]\n \n

\n

\n \n 11、【基于scrapy爬虫的天气数据采集(python)]\n \n

\n

\n \n 12、【Flask开发轻博客]\n \n

\n

\n \n 13、【Python3图片隐写术]\n \n

\n

\n \n 14、【Python 实现简易Shell)\n \n

\n

\n \n 15、【使用Python解数学方程]\n \n

\n

\n \n 16、【PyQt实现简易浏览器]\n \n

\n

\n \n 17、【神经网络实现手写字符识别系统]\n \n

\n

\n \n 18、【Python实现简单画板]\n \n

\n

\n \n 19、【Python实现3D建模工具]\n \n

\n

\n \n 20、【NBA常规赛结果预测--利用Python进行\n \n \n \n 比赛数据分析]\n \n \n

\n

\n \n 21、\n \n \n \n 【神经网络实现人脸识别任务]\n \n \n

\n

\n \n 22、【\n \n \n \n [Python文本解析器]\n \n \n

\n

\n \n 23、\n \n \n \n [Python3&OpenCV视频转字符动画]\n \n \n

\n

\n \n 24、[Python3实现淘女郎照片爬虫]\n \n

\n

\n \n 25、\n \n \n \n [Python3实现简单的FTP认证服务器]\n \n \n

\n

\n \n 26、\n \n \n \n [基于Flask与MySQL实现番剧推荐系统]\n \n \n

\n

\n \n 27、[Python实现端口扫描器]\n \n

\n

\n \n 28、\n \n \n \n 【使用Python3编写系列实]\n \n \n

\n

\n \n 29、【Python实现康威生命游戏实用脚本]\n \n

\n

\n \n 30、\n \n \n \n 【川普撞脸希拉里(基于OpenCV\n \n \n \n \n 征交换]\n \n \n

\n

\n \n 31、【Python 3实现Markdown解析器]\n \n

\n

\n \n 32、【Python气象数据分析--《Python数据分\n \n \n \n 析实战》]\n \n \n

\n

\n \n 33、\n \n \n \n 【Python实现键值数据库]\n \n \n

\n

\n \n 34、\n \n \n \n [k-近邻算法实现手写数字识别系统]\n \n \n

\n

\n \n 35、\n \n \n \n 【ebay在线拍卖数据分析]\n \n \n

\n

\n \n 36、\n \n \n \n [Python实现英文新闻摘要自动提取]\n \n \n

\n

\n \n 37、\n \n \n \n 【Python实现简易局域网视频聊大工具]\n \n \n

\n

\n \n 38、【基于Flask及爬虫实现微信娱乐机器人]\n \n

\n

\n \n 39、[Python实现Python解释器]\n \n

\n

\n \n 40、【Python3基于Scapy实现DDos]\n \n

\n

\n \n 41、[Python实现密码强度检测器]\n \n

\n

\n \n 42、【使用Python实现深度神经网络]\n \n

\n

\n \n 43、【Python实现从excel读取数据并绘制成精\n \n \n \n 美图像]\n \n \n

\n

\n \n 44、【人机对战初体验Python基于Pygame实现\n \n \n \n 四子棋游戏]\n \n \n

\n

\n \n 45、【Python3实现可控制肉鸡的反向Shell1\n \n

\n

\n \n \n 获取方式:\n \n \n

\n

\n \n \n \n 1.点赞+在看\n \n \n \n

\n

\n \n \n 2.点击下方小卡片发送‘学习’即可获取~\n \n \n

\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/uOAr9KwYg-6HvbJGRBLxvw", + "creator": "python开发工程师", + "pubDate": "Fri, 04 Jul 2025 04:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwqm1fyIIFpxnqmrUNyQznwjRjhPW9ic9u3d6IlWcphPpBA01tZtwhmSZBXLxAa7YiajapwmwNq1gkw/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZwqm1fyIIFpxnqmrUNyQznwjRjhPW9ic9u3d6IlWcphPpBA01tZtwhmSZBXLxAa7YiajapwmwNq1gkw/0?wx_fmt=jpeg", + "id": "2247511287_1", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "28a2618c1b234cc3ef8658429dea6b8e", + "highlights": [] + }, + { + "title": "自学python必看的书籍《Python编程:从入门到实践》PDF版拿走不谢", + "description": "自学python必看的书籍《Python编程:从入门到实践》内容简介本书是一本针对所有层次的Python 读者", + "content": "
\n

\n \n \n 自学python必看的书籍《Python编程:从入门到实践》\n \n \n

\n

\n \n
\n
\n

\n

\n \n \"图片\"\n \n

\n

\n \n \n 内容简介\n \n \n

\n

\n \n 本书是一本针对所有层次的Python 读者而作的Python 入门书。全书分两部分:\n \n

\n

\n \n 第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy 和Pygal 等强大的Python 库和工具介绍,以及列表、字典、if 语句、类、文件与异常、代码测试等内容;\n \n

\n

\n \n 第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的Python 2D 游戏开发如何利用数据生成交互式的信息图,以及创建和定制简单的Web 应用,并帮读者解决常见编程问题和困惑。\n \n

\n

\n \n
\n
\n

\n

\n \n \n 目录\n \n \n

\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n

\n \n \n 书籍的分享格式为PDF电子版,小伙伴们手机也可以阅读学习哦!\n \n \n

\n

\n \n \n 书籍终归只是辅助,想要真的深入学习python,当然还要有系统的学习方法和学习教程才可以让你在学习的路上一帆风顺哦!\n \n \n

\n

\n \n \n 本套视频一共400集,本套视频共分3季:\n \n \n

\n

\n \n 第一季 【基础篇】Python基础 (115集)\n \n

\n

\n \n 第二季 【提高篇】Python深入和扩展(100集)\n \n

\n

\n \n 第三季 【扩展篇】网络编程、多线程、扩展库(85集)\n \n

\n

\n \n 第四季 【高手篇】算法、Python源码、函数式编程、手工实现神经网络(100集)\n \n

\n

\n \n
\n
\n

\n
\n \n \"图片\"\n \n
\n

\n \n \n 以上这些教程我已经为大家打包准备好了,希望对正在学习的你有所帮助!\n \n \n

\n
    \n
  1. \n

    \n \n \n \n 获取方式:公众号私信回复“学习”即可\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 需要的小伙伴可以多多点赞转发 让更多的人看到\n \n \n \n

    \n
  4. \n
\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/tcflJ9s2_9sz64YaYGR7Zg", + "creator": "python开发工程师", + "pubDate": "Wed, 02 Jul 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzTvd1vr2rzDSOOIRMB4TLicTUXCSzcuIR9Pbtic23niaoI1AzFXBprib5Iia7yvq2EvuBIIUjs3sGM5MQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzTvd1vr2rzDSOOIRMB4TLicTUXCSzcuIR9Pbtic23niaoI1AzFXBprib5Iia7yvq2EvuBIIUjs3sGM5MQ/0?wx_fmt=jpeg", + "id": "2247511275_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "934dc0c78abe4f4d7b3496f12820db70", + "highlights": [] + }, + { + "title": "使用Python6年后,发现学Python看完这几本书少走一半弯路,别错过", + "description": "在前面6年里,它一直是我热衷使用并不断研究的语言,迄今为止,python都非常友好并且易于学习!", + "content": "
\n

\n \n 在前面6年里,它一直是我热衷使用并不断研究的语言,迄今为止,python都非常友好并且易于学习!它几乎可以做任何事,从简单的脚本创建、web,到数据可视化以及AI人工智能,使热衷python的人群变得越来越多。接下来推荐4本学python一定要看的书籍,有了他们,至少能节省50%的时间少走一半的弯路!\n \n

\n
\n \"图片\"\n
\n

\n \n \n
\n
\n
\n

\n

\n \n \n 零基础学python必看两本 一\n \n \n \n 《21天学通Python》\n \"图片\"\n \n \n \n \n
\n
\n

\n

\n \n \n 《21天学通Python》\n \n \n \n 共分三篇。第一篇介绍Python语言的特点、安装、语法基础、程序流程控制、面向过程的编程方法、面向对象的编程方法、程序异常的处理;第二篇介绍了Python语言中的包与模块、迭代器、生成器、装饰器、上下文管理器等进阶语法,同时介绍了使用Python标准库中的文件系统处理、图形化界面编程、正则表达式、网络编程、多进(线)程编程、数据库编程。此外,还介绍了运用第三方库的Web网站编程、图片处理;第三篇通过两个案例介绍Python的综合编程技术。二《python 程序员指南》\n \n

\n

\n \n \"图片\"\n \n

\n

\n \n 1、本书主要讲解Python语言的基础知识、编程 及应用 2、本书的概念和思路清晰,并对相应的概念提供了大量的编程实例,具有很高的参考和应用价值 3、本书的内容深入浅出、通俗易懂、从最简单的例子着眼逐步进阶、不仅适合初学者,对使用Python编写各种大型、复杂应用的程序员来说也是一本实用的参考书 python技能获取拓展\n \n \n \n 《python数据可视化编程实战》\n \"图片\"\n \n \n

\n

\n \n 本书是一本使用 Python 实现数据可视化编程的实战指南,介绍了如何使用 Python 流行的库,通过 70 余种方法创建美观的数据可视化效果。全书共 9 章,分别介绍了准备工作环境、了解数据、绘制并定制化图表、学习更多图表和定制化、创建 3D 可视化图表、用图像和地图绘制图表、使用正确的图表理解数据、更多的 matplotlib 知识以及使用\n \n \n \n Plot.ly\n \n \n \n 进行云端可视化。本书适合那些对 Python 编程有一定基础的开发人员阅读,可以帮助读者从头开始了解数据、数据格式、数据可视化,并学会使用 Python 可视化数据。\n \n \n \n 《Python编程快速上手——让繁琐工作自动化》\n \"图片\"\n \n \n

\n

\n \n \n 电子版已经给大家准备好了,早日成为Python大佬!\n \n \n \n 由于篇幅原因,所有章节就不一一截图展示,有需要的小伙伴可以\n \n \n \n

\n

\n \n \n 获取方式:\n \n \n

\n
    \n
  1. \n

    \n \n 点赞+再看\n \n

    \n
  2. \n
  3. \n

    \n \n 公众号内私信回复“学习”\n \n

    \n
  4. \n
\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/xiNrfMycIKR5iK9CRQLnRg", + "creator": "python开发工程师", + "pubDate": "Tue, 01 Jul 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzTvd1vr2rzDSOOIRMB4TLicSPxKqGGBPVOWu8SjWLRMExd0LYnWI4PqU879eNSmrLFzVTF7Q6R5pg/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzTvd1vr2rzDSOOIRMB4TLicSPxKqGGBPVOWu8SjWLRMExd0LYnWI4PqU879eNSmrLFzVTF7Q6R5pg/0?wx_fmt=jpeg", + "id": "2247511269_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "25b3ac08e2f72fa4d222dc9703f673c2", + "highlights": [] + }, + { + "title": "一周练完!100个Python实战项目,太实用了,绝对不能错过(附完整版源码+教程)", + "description": "Python 是一种极具可读性和通用性的编程语言。", + "content": "
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n Python 是一种极具可读性和通用性的编程语言\n \n \n \n \n \n \n 。Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣。Python 易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择。\n \n

\n

\n \n Python 是一种多范式语言,也就是说,它支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的。随着越来越多地在工业中,被诸如联合太空联盟\n \n \n \n \n \n \n (NASA 的主要飞机支持承包商)和工业光魔\n \n \n \n \n \n \n (VFX 和卢卡斯影业的动画工作室\n \n \n \n \n \n \n )等组织使用,Python 为那些寻求额外编程语言的人提供了巨大的潜力 。\n \n

\n

\n \n 当一个重要的被称为 comp.lang.python 的 Python 新闻组\n \n \n \n \n \n \n 在 1994 年形成时,Python 的用户基础不断增长,这为 Python 成为开源开发中最受欢迎的编程语言之一铺平了道路。\n \n

\n

\n \n Python当下真的很火。Python实战项目,也一直尤为关注,接下来,和大家介绍下100个Python练手的实战项目。\n \n

\n
\n \"图片\"\n
\n
\n \"图片\"\n
\n

\n \n \n \n 每个项目都有详细的视频讲解,跟随老师带你一步步完成敲代码的过程,在过程中结合多学知识提升能力,帮助怒更好地完成练习。\n \n \n \n \n
\n
\n

\n

\n \n 100个Python项目列表:\n \n

\n
    \n
  1. \n

    \n \n 1.python自动获取海量IP工具\n \n

    \n
  2. \n
  3. \n

    \n \n 2.python自动获取酷狗音乐工具\n \n

    \n
  4. \n
  5. \n

    \n \n 3.Python自动化开发-制作名片卡\n \n

    \n
  6. \n
  7. \n

    \n \n 4.Python自动化开发-制作名片卡\n \n

    \n
  8. \n
  9. \n

    \n \n 5.Python自动化开发-批量发邮件通知\n \n

    \n
  10. \n
  11. \n

    \n \n 6.Python自动化开发-考勤处理\n \n

    \n
  12. \n
  13. \n

    \n \n 7.Python双色球系统\n \n

    \n
  14. \n
  15. \n

    \n \n 8.Python批量获取王者荣耀皮肤\n \n

    \n
  16. \n
  17. \n

    \n \n 9.Python获取阴阳师壁纸\n \n

    \n
  18. \n
  19. \n

    \n \n 10.Python获取小说数据并分析\n \n

    \n
  20. \n
  21. \n

    \n \n 11.Python获取NBA数据\n \n

    \n
  22. \n
  23. \n

    \n \n 12.python获取拉钩工具\n \n

    \n
  24. \n
  25. \n

    \n \n 13.Python获取房天下数据\n \n

    \n
  26. \n
  27. \n

    \n \n 14.Python获取彩票信息\n \n

    \n
  28. \n
  29. \n

    \n \n 15.Python合成女神图片\n \n

    \n
  30. \n
  31. \n

    \n \n 16.Python法拍网数据\n \n

    \n
  32. \n
  33. \n

    \n \n 17.Python操作Excel自动化开发\n \n

    \n
  34. \n
  35. \n

    \n \n 18.python百行制作查询工具\n \n

    \n
  36. \n
  37. \n

    \n \n 19.python百行制作登录系统\n \n

    \n
  38. \n
  39. \n

    \n \n 20.Python百行代码实现点赞系统\n \n

    \n
  40. \n
  41. \n

    \n \n 21.Python百行代码实现抽奖系统\n \n

    \n
  42. \n
  43. \n

    \n \n 22.Python自动获取小说工具\n \n

    \n
  44. \n
  45. \n

    \n \n 23.python获取喜马拉雅音频\n \n

    \n
  46. \n
  47. \n

    \n \n 24.python快速获取斗图表情\n \n

    \n
  48. \n
  49. \n

    \n \n 25.python获取主播小视频\n \n

    \n
  50. \n
  51. \n

    \n \n 26.python自动工资条\n \n

    \n
  52. \n
  53. \n

    \n \n 27.python协程详解公开课\n \n

    \n
  54. \n
  55. \n

    \n \n 28.python制作12306查票工具\n \n

    \n
  56. \n
  57. \n

    \n \n 29.python爬虫30行拿LOL皮肤\n \n

    \n
  58. \n
  59. \n

    \n \n 30.python抓取相亲网数据\n \n

    \n
  60. \n
  61. \n

    \n \n 31.python抓取百合网数据\n \n

    \n
  62. \n
  63. \n

    \n \n 32.python游戏开发公开课\n \n

    \n
  64. \n
\n

\n \n ......\n \n

\n

\n \n \n 91.【Python 图片转字符画】\n \n \n \n
\n
\n \n \n 92.【200行Python代码实现2048】\n \n \n \n
\n
\n \n \n 93.【Python3 实现火车票查询工具】\n \n \n \n
\n
\n \n \n 94.【高德API+Python解决租房问题】\n \n \n \n
\n
\n \n \n 95.【Python3色情图片识别】\n \n \n \n
\n
\n \n \n 96.【Python 破解验证码】\n \n \n \n
\n
\n \n \n 97.【Python实现简单的Web服务器】\n \n \n \n
\n
\n \n \n 98.【pygame开发打飞机游戏】\n \n \n \n
\n
\n \n \n 99.【Django 搭建简易博客】\n \n \n \n
\n
\n \n \n 100.【Python基于共现提取《釜山行》人物关系】\n \n \n

\n

\n \n \n \n 完整项目已经打包整理好了,希望对正在学习的你带来帮助~多动手练习,才能不断地巩固知识,更快的进步!\n \n \n \n

\n

\n \n \n \n \n 获取方式:\n \n \n \n \n

\n

\n \n \n \n \n 1.点赞+在看\n \n \n \n \n

\n

\n \n \n \n \n 2.私信回复:学习  领取。\n \n \n \n \n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/MhahxqkjJs3c-ltitQIUMw", + "creator": "python开发工程师", + "pubDate": "Tue, 01 Jul 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzTvd1vr2rzDSOOIRMB4TLicbInhfjo3GahVbwFdVO8AiaDEGG09Bpiawo4f109Gn26W6vkE2Cb14SpA/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzTvd1vr2rzDSOOIRMB4TLicbInhfjo3GahVbwFdVO8AiaDEGG09Bpiawo4f109Gn26W6vkE2Cb14SpA/0?wx_fmt=jpeg", + "id": "2247511269_1", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "9a3ecdf1a8d48a28b17be98c6a04879f", + "highlights": [] + }, + { + "title": "Python是什么?为什么一定要学Python?", + "description": "一,Python是什么?Python是一种计算机编程语言。", + "content": "
\n

\n \n
\n
\n

\n
\n

\n \n 一,Python是什么?\n \n

\n

\n \n Python是一种计算机编程语言。\n \n

\n

\n \n 对于“编程”,你可能或多或少听说过Java/C语言/C++ /PHP等语言,Python作为近几年特别火的一门编程语言,相较前面几种语言,更注重可读性和效率。\n \n

\n

\n \n 因此,Python对于注重开发效率的程序员来说是大受欢迎的,他们给Python的定位是“优雅”、“明确”、“简单”。\n \n

\n

\n \n 除此之外,Python还具有以下优势,获得人们的青睐:\n \n

\n

\n \n Python 易于学习——Python程序简单易懂,初学者只要识字、会简单的算术、看懂英文单词就能入门学习。因此很多小学生从小就开始通过学习python来培养编程思维。\n \n

\n

\n \n 少量的代码就能构建出很多功能—— 在Python中,几乎每个想法都可以通过20-30行代码快速验证。\n \n

\n

\n \n Python 拥有最成熟的程序包资源库之一——Python有满足不同需求的库,无论实现什么功能,都有现成的类库可以使用。\n \n

\n

\n \n Python 是人工智能/现代数据科学中最常使用的语言——Python应用领域广泛(如图),尤其是人工智能/大数据时代不可或缺的技能。\n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n 二、为什么一定要学Python?\n \n

\n

\n \n 1、时代之驱\n \n

\n

\n \n 这两年,最火的词莫过于“人工智能”。\n \n

\n

\n \n 随着人工智能和机器学习的发展,各行各业职位正在逐渐被智能机器取替,为了应对被取替的风险,越来越多人开始学习编程,学习火热的程度可谓“全民Python编程的时代”。\n \n

\n

\n \n 可以看看几个重要的新闻:\n \n

\n
    \n
  • \n

    \n \n \n Python纳入浙江省高考!浙江省信息技术教材编程语言将会更换为 Python。\n \n \n

    \n
  • \n
\n

\n \n
\n
\n

\n
    \n
  • \n

    \n \n \n Python纳入山东省的小学教材课程,小学生都开始接触 Python 语言了。\n \n \n

    \n
  • \n
\n

\n \n
\n
\n

\n
    \n
  • \n

    \n \n \n Python 已加入全国计算机等级考试!教育部考试中心决定自2018年起,在计算机二级考试加入了“Python语言程序设计”科目。\n \n \n

    \n
  • \n
\n

\n \n
\n
\n

\n

\n \n 现在国外国内很多家长已经给孩子报名学习Python编程课程了。在美国,就连婴幼儿也有专门的编程童书。\n \n

\n

\n \n 所以,如果不想被淘汰,现在就应该抓紧机会学起来!\n \n

\n

\n \n 2、Python最适合0基础学习者\n \n

\n

\n \n 对于编程小白来说,Python是最适合0基础学习的编程语言。\n \n

\n

\n \n Python的语法简单,代码可读性高,容易入门。从Python学起,你很快就能运用Python编程的底层逻辑去学习另外的语言。也就是说,学习Python是学习编程的最好起点。\n \n

\n

\n \n 3、Python极大提升现有岗位的竞争力\n \n

\n

\n \n 有许多在职程序员本身学了c语言、java等其他编程后,仍坚定多学一门Python开发,他们都被Python代码的优美和开发效率所折服。\n \n

\n

\n \n 比如有一些工程师,以前在做很多SEO优化的时候,苦于不会编程,一些程序上面的问题,得不到解决,只能做做简单的页面优化。\n \n

\n

\n \n 现在学会Python之后,可以编写一些查询收录,排名,自动生成网络地图的程序,解决棘手的SEO问题,这样,在原有专业基础上,他们就多了一项高效的技能。\n \n

\n

\n \n 此外,如果你关注新闻和就业情况,可以明显感觉到,随着 Python 语言的持续火热,对于 Python 技术人才的需求也在不断增加。\n \n

\n

\n \n 通过统计,各大招聘网中,Python岗位的日均需求量甚至达到了 15000+,北上广深等一线城市的需求更是数量庞大,可见这个技能的竞争压力之大。\n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n \n 以下通过职友集Python 工资实际查询截图:\n \n \n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 在北京,Python平均工资20980,并且92.7%的Python从业人员薪资在10K以上。\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 在互联网比较发达的二线城市,比如成都平均工资12260,6K以上占比85% ,10K以上占比也到达了70.4%。\n \n \n

\n

\n \n \n 可以说,Python是近两年投入性价比最高的学习技能之一了!\n \n \n

\n

\n \n \n 现在,相信你已经对Python有了初步的认知和了解。\n \n \n

\n

\n \n 最后\n \n

\n

\n \n 如果对Python感兴趣的话,可以试试我的学习方法以及相关的学习资料\n \n

\n

\n \n 对于0基础小白入门:\n \n

\n

\n \n 如果你是零基础小白,想快速入门Python是可以考虑培训的。\n \n

\n

\n \n 一方面是学习时间相对较短,学习内容更全面更集中。\n \n

\n

\n \n Python所有方向的学习路线\n \n

\n

\n \n Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。\n \n

\n

\n \n Python所有方向的学习路线\n \n

\n

\n \n \n Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n Python必备开发工具\n \n

\n

\n \n \n 工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n Python精品PDF电子书\n \n

\n

\n \n \n 阅读一些书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。\n \n \n

\n
\n \"图片\"\n
\n

\n \n Python学习视频\n \n

\n

\n \n \n 观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n 实战案例\n \n

\n

\n \n \n 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。\n \n \n

\n
\n \"图片\"\n
\n
\n

\n \n
\n
\n

\n

\n \n 获取方式:\n \n

\n

\n \n 1.点赞+再看\n \n

\n

\n \n 2.公众号内回复:“学习”\n \n

\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/il87sB37BUOUiln-4bMyzQ", + "creator": "python开发工程师", + "pubDate": "Mon, 30 Jun 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZy6NhzQnQnn6fj5giafbrz2bCXCNXVa4kriaKonPngaWuYNXLfSuEOtL6Fu3Ga0XM2RExUB46rDL0eg/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZy6NhzQnQnn6fj5giafbrz2bCXCNXVa4kriaKonPngaWuYNXLfSuEOtL6Fu3Ga0XM2RExUB46rDL0eg/0?wx_fmt=jpeg", + "id": "2247511263_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "41aaa40f77c628b164b24e899c10bf40", + "highlights": [] + }, + { + "title": "每天五分钟—Python知识点总结13张思维导图(附全套教程)", + "description": "如果初学者接触的第一门语言是Python,学习曲线则会平滑得多,掌握一些基本语法和Python内置的数据结构,", + "content": "
\n

\n \n
\n
\n

\n
\n

\n \n \n 如果初学者接触的第一门语言是Python,学习曲线则会平滑得多\n \n \n \n ,掌握一些基本语法和Python内置的数据结构,已经可以上手写一些小工具或者小型应用。这对初学者来说,非常重要。因为学习的过程是一个突破舒适区的过程,会面临很多痛苦,如果学习过程得不到激励,很容易半途而废,类似我们开玩笑说的「从入门到放弃」。\n \n \n \n Python还有很多优点:\n \n \n \n 上手快,第三方库丰富,资料丰富,很容易做出“可见可得”的应用。\n \n \n \n Python所需要学习的知识基础知识\n \n \n \n Python最基本的语言特性和语法:•变量•数据类型与数据结构•输入和输出•运算符、表达式、语句•控制流(顺序控制,选择控制和循环控制)•面向过程编程•面向对象编程•异常处理•组织代码•标准库、第三方库\n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n \n 为大家准备了一些python的学习教程和PDF格式的python电子书籍,希望可以帮助到大家。\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n 以上这些教程我已经为大家打包准备好了,希望对正在学习的你有所帮助!\n \n \n

\n
    \n
  1. \n

    \n \n \n \n 获取方式:公众号内回复“学习”即可\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 需要的小伙伴可以多多点赞转发 让更多的人看到\n \n \n \n

    \n
  4. \n
\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/dL5ozU3wGbvtiyoUNI9C2g", + "creator": "python开发工程师", + "pubDate": "Sun, 29 Jun 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZy6NhzQnQnn6fj5giafbrz2bOJkSX76xZDY1ibH9oKrfibTxboy6FZicP5Io4FaByO8nc45ODaX9PY41Q/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZy6NhzQnQnn6fj5giafbrz2bOJkSX76xZDY1ibH9oKrfibTxboy6FZicP5Io4FaByO8nc45ODaX9PY41Q/0?wx_fmt=jpeg", + "id": "2247511257_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "6945f979532d2b5989ef04164d801403", + "highlights": [] + }, + { + "title": "自学python必看的书籍《Python编程:从入门到实践》PDF版拿走不谢", + "description": "内容简介本书是一本针对所有层次的Python 读者而作的Python 入门书。", + "content": "
\n

\n \n
\n
\n

\n

\n \n \"图片\"\n \n

\n

\n \n \n 内容简介\n \n \n

\n

\n \n 本书是一本针对所有层次的Python 读者而作的Python 入门书。全书分两部分:\n \n

\n

\n \n 第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy 和Pygal 等强大的Python 库和工具介绍,以及列表、字典、if 语句、类、文件与异常、代码测试等内容;\n \n

\n

\n \n 第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的Python 2D 游戏开发如何利用数据生成交互式的信息图,以及创建和定制简单的Web 应用,并帮读者解决常见编程问题和困惑。\n \n

\n

\n \n
\n
\n

\n

\n \n \n 目录\n \n \n

\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n
\n
\n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n

\n \n \n 书籍的分享格式为PDF电子版,小伙伴们手机也可以阅读学习哦!\n \n \n

\n

\n \n \n 书籍终归只是辅助,想要真的深入学习python,当然还要有系统的学习方法和学习教程才可以让你在学习的路上一帆风顺哦!\n \n \n

\n

\n \n \n 本套视频一共400集,本套视频共分3季:\n \n \n

\n

\n \n 第一季 【基础篇】Python基础 (115集)\n \n

\n

\n \n 第二季 【提高篇】Python深入和扩展(100集)\n \n

\n

\n \n 第三季 【扩展篇】网络编程、多线程、扩展库(85集)\n \n

\n

\n \n 第四季 【高手篇】算法、Python源码、函数式编程、手工实现神经网络(100集)\n \n

\n
\n \n \"图片\"\n \n
\n

\n \n \n 以上这些教程我已经为大家打包准备好了,希望对正在学习的你有所帮助!\n \n \n

\n
    \n
  1. \n

    \n \n \n \n 获取方式:公众号私信回复“学习”即可\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 需要的小伙伴可以多多点赞转发 让更多的人看到\n \n \n \n

    \n
  4. \n
\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/OBYA9CqtM2SJz3V0OsMNMw", + "creator": "python开发工程师", + "pubDate": "Fri, 27 Jun 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZy6NhzQnQnn6fj5giafbrz2bENYGODukDQ8iaKoSXOKkIEz9iaAdM2HiaTL77jqDuHqbple8NGD0NlMFQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZy6NhzQnQnn6fj5giafbrz2bENYGODukDQ8iaKoSXOKkIEz9iaAdM2HiaTL77jqDuHqbple8NGD0NlMFQ/0?wx_fmt=jpeg", + "id": "2247511245_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "761a8deb7a6670d138fbe73449a68ef1", + "highlights": [] + }, + { + "title": "56个java毕设项目!附源码+视频!", + "description": "Java毕设项目可从多个领域和方向进行选择,以下是一些推荐的项目方向,涵盖不同技术栈和应用场景,适合不同难度需", + "content": "None", + "category": "", + "link": "https://mp.weixin.qq.com/s/qI4OJXVOTKqqlrNRYkeFaQ", + "creator": "python开发工程师", + "pubDate": "Wed, 25 Jun 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZykJYNAN6ERqWwaXLkUyZR9pjsye99eFgIia4mpKSs2EagFeEAyyNmYqkJLFGKGiciaM7iatIhDZKqv3w/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZykJYNAN6ERqWwaXLkUyZR9pjsye99eFgIia4mpKSs2EagFeEAyyNmYqkJLFGKGiciaM7iatIhDZKqv3w/0?wx_fmt=jpeg", + "id": "2247511233_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "b3fa55dd5b4feeaa370d84c7511f8eb9", + "highlights": [] + }, + { + "title": "计算机专业18个Java毕设项目(附源码+视频+数据库),拿走即用!期末毕设不用", + "description": "领取方式:点赞+私信留言“111”或主动给我打个招呼,我都会回复的~~~一定要关注我,不然我发不了消息哦~", + "content": "
\n

\n \n \n
\n
\n
\n

\n

\n \n \n \n \n \n

\n

\n \n \n

\n

\n \n \n \n \n \n

\n

\n \n \n

\n

\n \n \n \n \n \n

\n

\n \n \n

\n

\n \n \n \n \n \n

\n

\n \n \n

\n

\n \n \n \n \n \n

\n

\n \n \n 领取方式:点赞+私信留言“111”或主动给我打个招呼,我都会回复的~~~\n \n \n

\n

\n \n \n 一定要关注我,不然我发不了消息哦~\n \n \n

\n

\n \n \n 整理不易,有帮助的话大家一定要 点赞 + 收藏 哦 ❤️!支持作者的同时,便于自己下次更方便地找到叭!\n \n \n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/jJOoSZywzYalMsmElLJDFw", + "creator": "python开发工程师", + "pubDate": "Wed, 25 Jun 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZykJYNAN6ERqWwaXLkUyZR9fvibGb3ZJY6qI6g2LWABXT88R1dhIwRS6icaENdrkXtrtoIuBzJ0Od2w/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZykJYNAN6ERqWwaXLkUyZR9fvibGb3ZJY6qI6g2LWABXT88R1dhIwRS6icaENdrkXtrtoIuBzJ0Od2w/0?wx_fmt=jpeg", + "id": "2247511233_1", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "5f74af3509bb7119b65229e9a44505ee", + "highlights": [] + }, + { + "title": "自学python必看的书籍《Python编程:从入门到实践》PDF版拿走不谢", + "description": "自学python必看的书籍《Python编程:从入门到实践》内容简介本书是一本针对所有层次的Python 读者", + "content": "
\n

\n \n
\n
\n

\n

\n \n 自学python必看的书籍《Python编程:从入门到实践》\n \n

\n

\n \n
\n
\n

\n

\n \n \"图片\"\n \n

\n

\n \n \n 内容简介\n \n \n

\n

\n \n 本书是一本针对所有层次的Python 读者而作的Python 入门书。全书分两部分:\n \n

\n

\n \n 第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy 和Pygal 等强大的Python 库和工具介绍,以及列表、字典、if 语句、类、文件与异常、代码测试等内容;\n \n

\n

\n \n 第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的Python 2D 游戏开发如何利用数据生成交互式的信息图,以及创建和定制简单的Web 应用,并帮读者解决常见编程问题和困惑。\n \n

\n

\n \n
\n
\n

\n

\n \n \n 目录\n \n \n

\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n
\n \n
\n
\n
\n
\n \n \"图片\"\n \n
\n
\n \n \"图片\"\n \n
\n

\n \n
\n
\n

\n

\n \n \n 书籍的分享格式为PDF电子版,小伙伴们手机也可以阅读学习哦!\n \n \n

\n

\n \n \n 书籍终归只是辅助,想要真的深入学习python,当然还要有系统的学习方法和学习教程才可以让你在学习的路上一帆风顺哦!\n \n \n

\n

\n \n \n 本套视频一共400集,本套视频共分3季:\n \n \n

\n

\n \n 第一季 【基础篇】Python基础 (115集)\n \n

\n

\n \n 第二季 【提高篇】Python深入和扩展(100集)\n \n

\n

\n \n 第三季 【扩展篇】网络编程、多线程、扩展库(85集)\n \n

\n

\n \n 第四季 【高手篇】算法、Python源码、函数式编程、手工实现神经网络(100集)\n \n

\n

\n \n
\n
\n

\n
\n \n \"图片\"\n \n
\n

\n \n
\n
\n

\n

\n \n \n 以上这些教程我已经为大家打包准备好了,希望对正在学习的你有所帮助!\n \n \n

\n
    \n
  1. \n

    \n \n \n \n 获取方式:公众号私信回复“学习”即可\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 需要的小伙伴可以多多点赞转发 让更多的人看到\n \n \n \n

    \n
  4. \n
\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/bQOggBBJ0dLp-eoSjOrnTg", + "creator": "python开发工程师", + "pubDate": "Tue, 24 Jun 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZykJYNAN6ERqWwaXLkUyZR9J5SsenheZQaXX6YI26tYXNebNzDqdLr7y1R630Q9ic67PSicibDZZsWicg/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZykJYNAN6ERqWwaXLkUyZR9J5SsenheZQaXX6YI26tYXNebNzDqdLr7y1R630Q9ic67PSicibDZZsWicg/0?wx_fmt=jpeg", + "id": "2247511212_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "9397870631052e80a6854e64e07d7b1d", + "highlights": [] + }, + { + "title": "python入门教程完整版(PDF版)", + "description": "当年3w买的全套python教程用不着了,现在送给有缘人,不要钱,一个月教你从入门到精通本套视频共600集70", + "content": "
\n

\n \n
\n
\n

\n
\n

\n \n \n 当年3w买的全套python教程用不着了,现在送给有缘人,不要钱,一个月教你从入门到精通\n \n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 本套视频共600集\n \n \n

\n

\n \n \n 70个练手项目列表\n \n \n

\n

\n \n \n 300套Python书籍PDF版等等~\n \n \n

\n

\n \n \n (我现在正在发放中,如下图)\n \n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n
\n

\n \n
\n
\n

\n

\n \n \n 获取方式\n \n \n \n
\n
\n

\n

\n \n 1、点赞+在看\n \n

\n

\n \n 2、后台回复:\n \n \n \n 学习\n \n \n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/kZFae2Y-ENwLqQRWOyFvVA", + "creator": "python开发工程师", + "pubDate": "Mon, 23 Jun 2025 09:47:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzmibvbzGeIPHq0Sn1ibibWA4MIibpTZGza7gH3SRSCUFh8dZ8LKI27RBJY6wWn2yK5yqsjBY3axkYqSQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzmibvbzGeIPHq0Sn1ibibWA4MIibpTZGza7gH3SRSCUFh8dZ8LKI27RBJY6wWn2yK5yqsjBY3axkYqSQ/0?wx_fmt=jpeg", + "id": "2247511206_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "11ddd29ebda4153b594d8c3b201af156", + "highlights": [] + }, + { + "title": "史上最详细python学习路线-从入门到精通,只需5个月时间", + "description": "Python是一种功能很强大的语言,对于零基础学习Python还是有难度的,但只要学习方法对,入门还是很快哒。", + "content": "
\n

\n \n
\n
\n

\n

\n \n \n Python是一种功能很强大的语言,对于零基础学习Python还是有难度的,但只要学习方法对,入门还是很快哒。\n \n \n

\n
\n

\n \n \n 针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端、Shell,IDE等各种开发环境进行Python开发,Python中的语法和基本知识、概念和逻辑,以及继续深入学习Python的方法。\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 下面我将详细介绍python学习路线,给那些想学习python的小伙伴们一点帮助!\n \n \n

\n

\n \n \n 你可以按照下面的步骤学习:\n \n \n

\n

\n \n \n 第一阶段:Python基础编程\n \n \n

\n

\n \n \n 1:知识体系:\n \n \n

\n
\n

\n \n \n 掌握基本概念,基本数据类型,高级容器类型,控制语句,函数,文件等等\n \n \n

\n
\n

\n \n \n 1.1:学习目标:\n \n \n

\n
    \n
  • \n

    \n \n 1:可掌握python的基础语法,能够使用python进行编程;\n \n

    \n
  • \n
  • \n

    \n \n 2:具有面向对象编程解决问题的思想;\n \n

    \n
  • \n
  • \n

    \n \n 3:掌握Linux使用技巧和方法;\n \n

    \n
  • \n
  • \n

    \n \n 4:熟悉Linux环境下的开发流程\n \n

    \n
  • \n
\n

\n \n \n 1.2:具备能力:\n \n \n

\n
    \n
  • \n

    \n \n 1:能够熟练使用python解决一般问题,利用python的特性,写出简洁易懂的代码;\n \n

    \n
  • \n
  • \n

    \n \n 2:能够进行基于Linux的环境开发。具备企业中开发中必备的Linux技能。\n \n

    \n
  • \n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 第二阶段:Python核心提升\n \n \n

\n

\n \n \n 1:知识体系:\n \n \n

\n
\n

\n \n 关系型数据库(MySQL),健值型数据库(Redis),文档型数据库(MongoDB),网络编程,并发等等\n \n

\n
\n

\n \n \n 1.1:学习目标:\n \n \n

\n
    \n
  • \n

    \n \n 1:掌握三种类型数据库的使用\n \n

    \n
  • \n
  • \n

    \n \n 2:掌握python网络编程和并发的具体实践技能\n \n

    \n
  • \n
\n

\n \n \n 1.2:具备能力:\n \n \n

\n
    \n
  • \n

    \n \n 1:能够熟练使用三种类型的数据库,以及各自的特点的使用场景有清晰的认识\n \n

    \n
  • \n
  • \n

    \n \n 2:对网络编程和并发有深入的了解,初步具备企业的用人需求。\n \n

    \n
  • \n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 第三阶段:Web基础开发\n \n \n

\n

\n \n \n 1:知识体系:\n \n \n

\n
\n

\n \n HTML与css,JavaScript,jQuery,Ajax\n \n

\n
\n

\n \n \n 第四阶段:Web-Django框架与项目\n \n \n

\n

\n \n \n 1:知识体系:\n \n \n

\n
\n

\n \n Django框架,路由系统,项目:网上商城等等\n \n

\n
\n

\n \n \n 第五阶段:爬虫开发\n \n \n

\n

\n \n \n 1:知识体系:\n \n \n

\n
\n

\n \n 爬虫入门,爬虫库和工具的使用,IP代理池的实现,常见反爬手段,爬虫高级框架等等\n \n

\n
\n

\n \n \n 第六阶段:数据分析\n \n \n

\n

\n \n \n 1:知识体系:\n \n \n

\n
\n

\n \n 数据分析初级,经典模块及其使用,高级算法等等\n \n

\n
\n

\n \n 如果你有心学习Python,为了避免漫无目且零散地学习,小编整理好的学习资料可以分享给大家,即使你\n \n \n \n 非技术出身\n \n \n \n 也能快速入门Python获得\n \n \n \n 求职能力、工作效率、解决问题\n \n \n \n 等硬核能力的提升。\n \n

\n

\n \n Python从基础到进阶的教程\n \n

\n

\n \n \n 1.Python基础语法以及流程控制语句\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 2.Python基础编程\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 3.Python电子书大全(仅展示部分资料)\n \n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n 文章到此结束了,希望对大家有帮助。还有小编把这些学习资料都已整理完毕,\n \n \n \n 需要的小伙伴可以\n \n \n

\n

\n \n \n \n 点赞+再看,\n \n \n \n

\n
\n \n \n \n 公众号内回复“学习”即可获取编程资料\n \n \n \n
\n

\n \n
\n
\n

\n
\n \n \n
\n

\n \n \n 就业方向一 web前后端开发(python开发工程师)\n \n \n

\n

\n \n 熟悉HTML/JavaScript/CSS,掌握React.js等前端框架开发,熟悉页面架构和布局,熟悉MySQL、Redis等,具备数据库应用、设计能力,熟练掌握Django/Flask等Web后端开发框架,熟练掌握网络通讯协议和多线程、多进程并发技术,了解架构设计、实现原理和安全防护加固,掌握高并发web网站、缓存加速技术,有1-2个完整项目经验。已经具备Python web中高级级开发工程师能力,市面薪资可达12K-18K。\n \n

\n

\n \n
\n
\n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 就业方向二 运维自动化开发\n \n \n

\n

\n \n 对持续集成和持续交付(CI/CD)有深入理解,并有实施经验,熟练 DevOps 工具,如:Jenkins, Ansible 等的经验;熟悉容器技术,有Kubernetes使用经验;对运维平台和中间件的设计、开发工作;掌握自动化脚本的设计、开发、测试,可实现运维平台自动化和可视化,具备Python运维开发工程师能力,市面薪资可达12K-25K。\n \n

\n
\n \"图片\"\n
\n

\n \n
\n
\n

\n

\n \n \n 业方向三 数据抓取(Python爬虫工程师)\n \n \n

\n

\n \n 可熟练使用Python语言,熟悉常用爬虫框架如Scrapy等;熟练使用selenium,lxml, bs4 对xml,html的文本进行抓取解析清理;对管理网站的cookie实效性处理有经验;熟悉反爬虫、验证码识别技术,有能力解决复杂的反爬限制;具备丰富的多线程、网络数据处理经验,掌握开源爬虫框架scrapy;掌握分布式爬虫技术。可设计数据采集策略,提升数据采集效率及质量。\n \n

\n

\n \n \n 就业方向四 数据分析&挖掘(数据分析&数据挖掘工程师)\n \n \n

\n

\n \n 熟悉主流的数据挖掘建模算法,如数据分析、分类预测、用户画像等;掌握数据分析模型的固化及部署工作,可进行进行数据分析、数据建模、挖掘、清洗,可实现包括数据交互、特征提取、数据挖掘、分析报告等;熟练使用pandas,numpy,matplotlib等工具分析数据,做数据的可视化,并能解释数据分布。已经具备Python数据分析&挖掘工程师能力,市面薪资可达10K-18K。\n \n

\n

\n \n \n 拓展就业方向五 机器学习&金融量化&人工智能\n \n \n

\n

\n \n 该领域为前沿技术领域,目前世界top100公司都在招募大量人工智能、量化交易、机器学习相关人才,对相关人才要求有较高的学习能力和数学能力,年薪50w+起步,对于刚接触python的人士来说,适合作为未来发展方向研究。\n \n

\n

\n \n
\n
\n

\n
\n

\n \n
\n
\n

\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/VOE8IdoClmVi5Na8LEysnA", + "creator": "python开发工程师", + "pubDate": "Sat, 21 Jun 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzmibvbzGeIPHq0Sn1ibibWA4M8UWibW49xk7f75yJiaJRQ6zEB4sJDjLRcTFvJ8wBNFt44nsdgL6ibwYgg/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzmibvbzGeIPHq0Sn1ibibWA4M8UWibW49xk7f75yJiaJRQ6zEB4sJDjLRcTFvJ8wBNFt44nsdgL6ibwYgg/0?wx_fmt=jpeg", + "id": "2247511199_2", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "563c4620e9d0adfc2c8821adbec2fe03", + "highlights": [] + }, + { + "title": "学习python的必读书籍《利用Python进行数据分析》附PDF版", + "description": "这是非常经典的一本Python数据分析书,每一章之间有递进关系,适合Python入门()如《Python编程,", + "content": "
\n

\n \n 这是非常经典的一本Python数据分析书,每一章之间有递进关系,适合Python入门()如《Python编程,从入门到实践》)之后阅读,本书专门针对数据分析领域的。我细致地读了一遍,敲了一遍代码,一开始没有头绪,进展缓慢,后来逐渐明朗了。学习编程要多实践,这对没有基础的人来说有困难,因为无从下手。我的体会是,在你基础不牢的时候,就多看,多记,多总结,搭建自己的思路框架。\n \n

\n

\n \n 书籍简介\n \n

\n
\n \"图片\"\n
\n

\n \n 利用Python进行数据分析\n \n

\n

\n \n \n 本书由pandas项目创始人Wes McKinney亲笔撰写,详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。第2版针对Python 3.6进行全面修订和更新,涵盖新版的pandas、NumPy、IPython和Jupyter,并增加大量实际案例,可以帮助你高效解决一系列数据分析问题。\n \n \n

\n

\n \n \n 第2版中的主要更新包括:\n \n \n

\n

\n \n \n • 所有的代码,包括把Python的教程更新到了Python 3.6版本(第1版中使用的是Python 2.7)\n \n \n

\n

\n \n \n • 更新了Python第三方发布版Anaconda和其他所需Python包的安装指引\n \n \n

\n

\n \n \n • 更新pandas库到2017年的新版\n \n \n

\n

\n \n \n • 新增一章,关于更多高级pandas工具和一些使用提示\n \n \n

\n

\n \n \n • 新增statsmodels和scikit-learn的简明使用介绍\n \n \n

\n

\n \n \n \"图片\"\n \n \n

\n

\n \n 目录\n \n

\n

\n \n 第1章 准备工作\n \n
\n \n 第2章 Python语言基础、IPython及Jupyter notebook\n \n
\n \n 第3章 内建数据结构、函数及文件\n \n
\n \n 第4章 NumPy基础:数组与向量化计算\n \n
\n \n 第5章 pandas入门\n \n
\n \n 第6章 数据载入、存储及文件格式\n \n
\n \n 第7章 数据清洗与准备\n \n
\n \n 第8章 数据规整:连接、联合与重塑\n \n
\n \n 第9章 绘图与可视化\n \n
\n \n 第10章 数据聚合与分组操作\n \n
\n \n 第11章 时间序列\n \n
\n \n 第12章 高阶pandas\n \n
\n \n 第13章 Python建模库介绍\n \n
\n \n 第14章 数据分析示例\n \n

\n
\n \"图片\"\n
\n
\n \"图片\"\n
\n

\n \n \n \"图片\"\n \n \n

\n
\n \"图片\"\n
\n

\n \n \n \n 领取方式:\n \n
\n
\n
\n

\n
    \n
  1. \n

    \n \n \n \n 点赞+在看\n \n \n \n

    \n
  2. \n
  3. \n

    \n \n \n \n 私信留下回复:“学习”\n \n \n \n

    \n
  4. \n
\n
\n \n
\n
\n
\n

\n \n \n

\n
\n", + "category": "", + "link": "https://mp.weixin.qq.com/s/QzNsOfAyqx2sgOiavcalzQ", + "creator": "python开发工程师", + "pubDate": "Fri, 20 Jun 2025 09:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzmibvbzGeIPHq0Sn1ibibWA4MtWvsSEdycjHjFSUVspgdgrZ63Tic9M30R85C32DVibmXTlKomqNnDrKw/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/mmbiz_jpg/Nc53lZXDjZzmibvbzGeIPHq0Sn1ibibWA4MtWvsSEdycjHjFSUVspgdgrZ63Tic9M30R85C32DVibmXTlKomqNnDrKw/0?wx_fmt=jpeg", + "id": "2247511178_1", + "language": "", + "folder": "IT技术", + "feed": "python开发工程师", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "1189f681b3a409d6c3f0d7e40085e750", "highlights": [] }, { @@ -3602,28 +4262,6 @@ "hash": "3372e349617e8cdb5732ee4da3cdcdce", "highlights": [] }, - { - "title": "炫酷魔术背后隐藏的科学Spilling the magic beans", - "description": "空中飘物、液体消失、纸张燃烧……这些神奇的魔术背后都隐藏着什么科学原理?", - "content": "空中飘物、液体消失、纸张燃烧……这些神奇的魔术背后都隐藏着什么科学原理?", - "category": "科技", - "link": "http://www.i21st.cn/story/3806.html", - "creator": "www.i21st.cn", - "pubDate": "Wed, 17 Aug 2022 11:09:58", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "双语", - "feed": "21世纪", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "e0627db8d1ede2acddc4a5574cefd5c9", - "highlights": [] - }, { "title": "“大老虎”被拿下!中共中央决定对周永康严重违纪问题立案审查", "description": "", @@ -3646,28 +4284,6 @@ "hash": "9f21f8fa51704a71191c0219c9793433", "highlights": [] }, - { - "title": "廖凡加冕柏林电影节影帝", - "description": "Berlin International Film Festival", - "content": "Berlin International Film Festival", - "category": "", - "link": "http://www.i21st.cn/article/translate/4929_1.html", - "creator": "www.i21st.cn", - "pubDate": "Mon, 17 Feb 2014 11:22:15", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "zh", - "folder": "双语", - "feed": "21世纪", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "f58695c9a7cdaddb9ab71b5698627132", - "highlights": [] - }, { "title": "索契冬奥会李坚柔夺中国首金", "description": "Short track speed skating", @@ -4936,25 +5552,25 @@ "description": "中英文双语热点新闻,配以地道音频及词汇解析, 经典美剧赏析, 热门词汇翻译,分享最地道的英语表达, 国内外新鲜英语趣闻及时事热点- 21英语", "items": [ { - "title": "研究:置身大自然会对你体验时间的方式产生深远影响", - "description": "
\n\n \n\n \n \n\n

研究发现,置身大自然会让你感觉时间过得更慢,有助于将你的注意力从眼前转移到未来的需求上。你将能够延迟即时满足感,转而追求长期回报,而不是永远生活在“只求过得去”的状态中。

\n

 

\n
\n \n
\n Photo/Pexels \n
\n
\n

 

\n

Do you ever get that feeling that there aren't enough hours in the day? That time is somehow racing away from you, and it is impossible to fit everything in. But then, you step outside into the countryside and suddenly everything seems slower, more relaxed, like time has somehow changed.

\n

你是否有过这样的感觉:一天的时间不够用?时间不知不觉地从你身边溜走,不可能把所有事情都安排好。但是,当你走到郊外,突然间一切都变得缓慢、轻松起来,就好像时间发生了某种变化。

\n

 

\n

It's not just you – recent research showed nature can regulate our sense of time.

\n

不仅仅是你,最近的研究表明,大自然可以调节我们的时间感。

\n

 

\n

For many of us, the combined demands of work, home and family mean that we are always feeling like we don't have enough time. Time poverty has also been exacerbated by digital technologies. Permanent connectivity extends working hours and can make it difficult to switch off from the demands of friends and family.

\n

对我们许多人来说,工作、家庭和家人的综合需求意味着我们总是感觉时间不够用。数字技术也加剧了时间贫乏。永久连接延长了工作时间,也使我们难以摆脱朋友和家人的要求。

\n

 

\n

Recent research suggests that the antidote to our lack of time may lie in the natural world. Psychologist Richardo Correia, at the University of Turku in Finland, found that being in nature may change how we experience time and, perhaps, even give us the sense of time abundance.

\n

最新研究表明,解决我们时间匮乏问题的良方可能在于自然世界。芬兰图尔库大学的心理学家理查多·科雷亚发现,身处在大自然中可能会改变我们对时间的体验方式,甚至可能让我们感觉到时间的充裕。

\n

 

\n

Correia examined research which compared people's experiences of time when they performed different types of tasks in urban and natural environments. These studies consistently showed that people report a sense of expanded time when they were in nature compared to when they were in an urban environment.

\n

科雷亚查阅了比较人们在城市和自然环境中执行不同类型任务时对时间体验的研究。这些研究一致表明,与在城市环境中相比,人们在大自然中会有时间更充裕的感觉。

\n

 

\n

For example, people are more likely to perceive a walk in the countryside as longer than a walk of the same length in the city. Similarly, people report perceiving time as passing more slowly while performing tasks in natural green environments than in urban environments. Nature seems to slow and expand our sense of time.

\n

例如,与在城市中散步相比,人们更倾向于认为在郊外散步的时间更长。同样,与城市环境相比,人们在绿色自然环境中执行任务时会觉得时间过得更慢。大自然似乎减缓并扩展了我们的时间感。

\n

 

\n

It's not just our sense of time in the moment which appears to be altered by the natural world, it's also our sense of the past and future. Previous research shows that spending time in nature helps to shift our focus from the immediate moment towards our future needs. So rather than focusing on the stress of the demands on our time, nature helps us to see the bigger picture.

\n

自然世界似乎不仅改变了我们当下的时间感,还改变了我们对过去和未来的时间感。先前的研究表明,在大自然中度过的时间有助于将我们的注意力从眼前转移到未来的需求上。因此,大自然会帮助我们看到更广阔的前景,而不是专注于时间要求带给我们的压力。

\n

 

\n

This can help us to prioritise our actions so that we meet our long-term goals rather than living in a perpetual state of \"just about keeping our head above water\".

\n

这可以帮助我们确定行动的轻重缓急,从而实现我们的长期目标,而不是永远生活在“只求过得去”的状态中。

\n

 

\n

This is in part because spending time in nature appears to make us less impulsive, enabling us to delay instant gratification in favour of long-term rewards.

\n

这在一定程度上是因为在大自然中度过的时间似乎会让我们不那么冲动,使我们能够延迟即时满足感,转而追求长期回报。

\n

 

\n
\n \n
\n Photo/Pexels \n
\n
\n

 

\n

Why does nature affect our sense of time?

\n

为什么大自然会影响我们的时间观念?

\n

 

\n

Spending time in nature is known to have many benefits for health and wellbeing. Having access to natural spaces such as beaches, parks and woodlands is associated with reduced anxiety and depression, improved sleep, reduced levels of obesity and cardiovascular disease, and improved wellbeing.

\n

众所周知,在大自然中度过时光对健康和幸福有很多好处。拥有海滩、公园和林地等自然空间与减少焦虑和抑郁、改善睡眠、降低肥胖和心血管疾病水平以及提高幸福感有关。

\n

 

\n

Some of these benefits may explain why being in nature alters our experience of time.

\n

其中一些好处或许可以解释为什么身处大自然中会改变我们对时间的体验。

\n

 

\n

The way we experience time is shaped by our internal biological state and the events going on in the world around us. As a result, emotions such as stress, anxiety and fear can distort our sense of the passage of time.

\n

我们体验时间的方式是由我们的内在生理状态和周围世界发生的事件决定的。因此,压力、焦虑和恐惧等情绪会扭曲我们对时间流逝的感知。

\n

 

\n

The relaxing effect of natural environments may counter stress and anxiety, resulting in a more stable experience of time. Indeed, the absence of access to nature during COVID-19 may help to explain why people's sense of time became so distorted during the pandemic lockdowns.

\n

自然环境的放松效果可以抵消压力和焦虑,使我们对时间的体验更加稳定。事实上,在新冠疫情期间无法接触大自然可能有助于解释为什么在大流行病封锁期间人们的时间感会变得如此扭曲。

\n

 

\n

In the short term, being away from the demands of modern day life may provide the respite needed to re-prioritise life, and reduce time pressure by focusing on what actually needs to be done. In the longer term, time in nature may help to enhance our memory and attention capacity, making us better able to deal with the demands on our time.

\n

从短期来看,远离现代生活的需求可以让我们得到喘息的机会,从而重新确定生活的优先次序,并通过专注于真正需要做的事情来减轻时间压力。从长远来看,在大自然中度过的时间可能有助于增强我们的记忆力和注意力,使我们能够更好地处理对时间的需求。

\n

 

\n

Accessing nature

\n

亲近大自然

\n

 

\n

Getting out into nature may sound like a simple fix, but for many people, particularly those living in urban areas, nature can be hard to access. Green infrastructure such as trees, woodlands, parks and allotments in and around towns and cities are essential to making sure the benefits of time in nature are accessible to everyone.

\n

到大自然中去听起来似乎很简单,但对很多人来说,尤其是生活在城市地区的人,可能很难接触到大自然。要确保每个人都能享受到大自然带来的益处,城镇及周边地区的树木、林地、公园和种植园等绿色基础设施是必不可少的。

\n

 

\n

If spending time in nature isn't possible for you, there are other ways that you can regain control of your time. Start by closely examining how you use time throughout your week. Auditing your time can help you see where time is being wasted and to identify action to help you to free up more time in your life.

\n

如果您无法在大自然中度过美好时光,您还可以通过其他方式重新掌控自己的时间。首先,仔细检查自己一周中如何利用时间。审核时间可以帮助您发现时间浪费在哪里,并确定行动,帮助您在生活中腾出更多时间。

\n

 

\n

Alternatively, try to set yourself some boundaries in how you use time. This could be limiting when you access emails and social media, or it could be booking in time in your calendar to take a break. Taking control of your time and how you use it can help to you overcome the sense that time is running away from you.

\n

或者,在如何使用时间方面为自己设定一些界限。这可以是限制您访问电子邮件和社交媒体的时间,也可以是在您的日历中预定休息时间。控制好自己的时间和使用方式,有助于克服 “时间正在离你远去”的感觉。

\n

 

\n

来源:The Conversation、Science Alert、煎蛋网

\n

编辑:丹妮

\n

审校:董静、齐磊

\n\n
", - "content": "
\n\n \n\n \n \n\n

研究发现,置身大自然会让你感觉时间过得更慢,有助于将你的注意力从眼前转移到未来的需求上。你将能够延迟即时满足感,转而追求长期回报,而不是永远生活在“只求过得去”的状态中。

\n

 

\n
\n \n
\n Photo/Pexels \n
\n
\n

 

\n

Do you ever get that feeling that there aren't enough hours in the day? That time is somehow racing away from you, and it is impossible to fit everything in. But then, you step outside into the countryside and suddenly everything seems slower, more relaxed, like time has somehow changed.

\n

你是否有过这样的感觉:一天的时间不够用?时间不知不觉地从你身边溜走,不可能把所有事情都安排好。但是,当你走到郊外,突然间一切都变得缓慢、轻松起来,就好像时间发生了某种变化。

\n

 

\n

It's not just you – recent research showed nature can regulate our sense of time.

\n

不仅仅是你,最近的研究表明,大自然可以调节我们的时间感。

\n

 

\n

For many of us, the combined demands of work, home and family mean that we are always feeling like we don't have enough time. Time poverty has also been exacerbated by digital technologies. Permanent connectivity extends working hours and can make it difficult to switch off from the demands of friends and family.

\n

对我们许多人来说,工作、家庭和家人的综合需求意味着我们总是感觉时间不够用。数字技术也加剧了时间贫乏。永久连接延长了工作时间,也使我们难以摆脱朋友和家人的要求。

\n

 

\n

Recent research suggests that the antidote to our lack of time may lie in the natural world. Psychologist Richardo Correia, at the University of Turku in Finland, found that being in nature may change how we experience time and, perhaps, even give us the sense of time abundance.

\n

最新研究表明,解决我们时间匮乏问题的良方可能在于自然世界。芬兰图尔库大学的心理学家理查多·科雷亚发现,身处在大自然中可能会改变我们对时间的体验方式,甚至可能让我们感觉到时间的充裕。

\n

 

\n

Correia examined research which compared people's experiences of time when they performed different types of tasks in urban and natural environments. These studies consistently showed that people report a sense of expanded time when they were in nature compared to when they were in an urban environment.

\n

科雷亚查阅了比较人们在城市和自然环境中执行不同类型任务时对时间体验的研究。这些研究一致表明,与在城市环境中相比,人们在大自然中会有时间更充裕的感觉。

\n

 

\n

For example, people are more likely to perceive a walk in the countryside as longer than a walk of the same length in the city. Similarly, people report perceiving time as passing more slowly while performing tasks in natural green environments than in urban environments. Nature seems to slow and expand our sense of time.

\n

例如,与在城市中散步相比,人们更倾向于认为在郊外散步的时间更长。同样,与城市环境相比,人们在绿色自然环境中执行任务时会觉得时间过得更慢。大自然似乎减缓并扩展了我们的时间感。

\n

 

\n

It's not just our sense of time in the moment which appears to be altered by the natural world, it's also our sense of the past and future. Previous research shows that spending time in nature helps to shift our focus from the immediate moment towards our future needs. So rather than focusing on the stress of the demands on our time, nature helps us to see the bigger picture.

\n

自然世界似乎不仅改变了我们当下的时间感,还改变了我们对过去和未来的时间感。先前的研究表明,在大自然中度过的时间有助于将我们的注意力从眼前转移到未来的需求上。因此,大自然会帮助我们看到更广阔的前景,而不是专注于时间要求带给我们的压力。

\n

 

\n

This can help us to prioritise our actions so that we meet our long-term goals rather than living in a perpetual state of \"just about keeping our head above water\".

\n

这可以帮助我们确定行动的轻重缓急,从而实现我们的长期目标,而不是永远生活在“只求过得去”的状态中。

\n

 

\n

This is in part because spending time in nature appears to make us less impulsive, enabling us to delay instant gratification in favour of long-term rewards.

\n

这在一定程度上是因为在大自然中度过的时间似乎会让我们不那么冲动,使我们能够延迟即时满足感,转而追求长期回报。

\n

 

\n
\n \n
\n Photo/Pexels \n
\n
\n

 

\n

Why does nature affect our sense of time?

\n

为什么大自然会影响我们的时间观念?

\n

 

\n

Spending time in nature is known to have many benefits for health and wellbeing. Having access to natural spaces such as beaches, parks and woodlands is associated with reduced anxiety and depression, improved sleep, reduced levels of obesity and cardiovascular disease, and improved wellbeing.

\n

众所周知,在大自然中度过时光对健康和幸福有很多好处。拥有海滩、公园和林地等自然空间与减少焦虑和抑郁、改善睡眠、降低肥胖和心血管疾病水平以及提高幸福感有关。

\n

 

\n

Some of these benefits may explain why being in nature alters our experience of time.

\n

其中一些好处或许可以解释为什么身处大自然中会改变我们对时间的体验。

\n

 

\n

The way we experience time is shaped by our internal biological state and the events going on in the world around us. As a result, emotions such as stress, anxiety and fear can distort our sense of the passage of time.

\n

我们体验时间的方式是由我们的内在生理状态和周围世界发生的事件决定的。因此,压力、焦虑和恐惧等情绪会扭曲我们对时间流逝的感知。

\n

 

\n

The relaxing effect of natural environments may counter stress and anxiety, resulting in a more stable experience of time. Indeed, the absence of access to nature during COVID-19 may help to explain why people's sense of time became so distorted during the pandemic lockdowns.

\n

自然环境的放松效果可以抵消压力和焦虑,使我们对时间的体验更加稳定。事实上,在新冠疫情期间无法接触大自然可能有助于解释为什么在大流行病封锁期间人们的时间感会变得如此扭曲。

\n

 

\n

In the short term, being away from the demands of modern day life may provide the respite needed to re-prioritise life, and reduce time pressure by focusing on what actually needs to be done. In the longer term, time in nature may help to enhance our memory and attention capacity, making us better able to deal with the demands on our time.

\n

从短期来看,远离现代生活的需求可以让我们得到喘息的机会,从而重新确定生活的优先次序,并通过专注于真正需要做的事情来减轻时间压力。从长远来看,在大自然中度过的时间可能有助于增强我们的记忆力和注意力,使我们能够更好地处理对时间的需求。

\n

 

\n

Accessing nature

\n

亲近大自然

\n

 

\n

Getting out into nature may sound like a simple fix, but for many people, particularly those living in urban areas, nature can be hard to access. Green infrastructure such as trees, woodlands, parks and allotments in and around towns and cities are essential to making sure the benefits of time in nature are accessible to everyone.

\n

到大自然中去听起来似乎很简单,但对很多人来说,尤其是生活在城市地区的人,可能很难接触到大自然。要确保每个人都能享受到大自然带来的益处,城镇及周边地区的树木、林地、公园和种植园等绿色基础设施是必不可少的。

\n

 

\n

If spending time in nature isn't possible for you, there are other ways that you can regain control of your time. Start by closely examining how you use time throughout your week. Auditing your time can help you see where time is being wasted and to identify action to help you to free up more time in your life.

\n

如果您无法在大自然中度过美好时光,您还可以通过其他方式重新掌控自己的时间。首先,仔细检查自己一周中如何利用时间。审核时间可以帮助您发现时间浪费在哪里,并确定行动,帮助您在生活中腾出更多时间。

\n

 

\n

Alternatively, try to set yourself some boundaries in how you use time. This could be limiting when you access emails and social media, or it could be booking in time in your calendar to take a break. Taking control of your time and how you use it can help to you overcome the sense that time is running away from you.

\n

或者,在如何使用时间方面为自己设定一些界限。这可以是限制您访问电子邮件和社交媒体的时间,也可以是在您的日历中预定休息时间。控制好自己的时间和使用方式,有助于克服 “时间正在离你远去”的感觉。

\n

 

\n

来源:The Conversation、Science Alert、煎蛋网

\n

编辑:丹妮

\n

审校:董静、齐磊

\n\n
", + "title": "简单的Web云存储解决方案bewCloud", + "description": "bewCloud 是一个简化版的自托管云存储解决方案,可作为 Nextcloud 和 ownCloud 的更简单替代方案。", + "content": "None", "category": "", - "link": "https://language.chinadaily.com.cn/a/202409/05/WS66d95738a3108f29c1fca5a6.html", - "creator": "", - "pubDate": "", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", + "link": "https://mp.weixin.qq.com/s/fuqL7r4ch20IJeyZ60IvDg", + "creator": "各种折腾", + "pubDate": "Sat, 14 Jun 2025 19:00:00 ", + "enclosure": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/Cibq2rFYLAaGTIGUkoPBlj8nznbeib15F9ElMNJuQeTicAjILG80dpvKQFpqfjAPvEpsK8OasR6I4wo2SRpoCy8iaQ/0?wx_fmt=jpeg", + "enclosureType": "image/jpeg", + "image": "https://mmbiz.qpic.cn/sz_mmbiz_jpg/Cibq2rFYLAaGTIGUkoPBlj8nznbeib15F9ElMNJuQeTicAjILG80dpvKQFpqfjAPvEpsK8OasR6I4wo2SRpoCy8iaQ/0?wx_fmt=jpeg", + "id": "2247509021_1", "language": "", - "folder": "双语", - "feed": "ChinaDaily", + "folder": "IT技术", + "feed": "各种折腾", "read": false, "favorite": false, "created": false, "tags": [], - "hash": "0ce69d63efd46364201bea63d1a192ab", + "hash": "2418ebb6657179d60b73596fead978e4", "highlights": [] }, { @@ -4979,28 +5595,6 @@ "hash": "ce6345bc9ae331d44d7f2c1699c0a3c6", "highlights": [] }, - { - "title": "【双语财讯】“中国造”体育用品出口火热 中国已成为全球最大体育用品出口国", - "description": "
\n\n \n\n \n \n\n

海关总署近日发布的数据显示,今年上半年,中国体育用品及设备出口同比增长16.7%,高出同期出口整体增速9.8个百分点。世界贸易组织发布的数据报告显示,全球范围内的体育用品贸易在过去近30年里增长了近3倍,而在这30年间,中国已成为全球最大的体育用品出口国。

\n
\n \n
\n A foreign businessman (right) picks ball products at the Yiwu International Trade City in Yiwu, Zhejiang province, on April 15, 2024. [Photo/VCG] \n
\n
\n

The exports of China's sporting goods and equipment surged 16.7 percent year-on-year in the first half of 2024, outpacing the overall export growth during the same period by a whopping 9.8 percentage points, according to data recently released by the General Administration of Customs (GAC).
海关总署近日发布的数据显示,今年上半年,中国体育用品及设备出口同比增长16.7%,高出同期出口整体增速9.8个百分点。

\n

Data from the World Trade Organization showed that global trade in sporting goods has nearly tripled in almost 30 years, and China has become the world's top exporter of sporting goods.
世界贸易组织发布的数据显示,全球范围内的体育用品贸易在过去近30年里增长了近3倍,而在这30年间,中国已成为全球最大的体育用品出口国。

\n

In Jinping county of southwest China's Guizhou Province, a global production hub for badminton shuttlecocks, more than 100,000 shuttlecocks are sold worldwide a day.
在全球重要的羽毛球生产基地——贵州省锦屏县,每天超过10万只羽毛球从这里“飞”向全球。

\n

\"We've calculated that about one in every 10 shuttlecocks in the world comes from Jinping,\" said Hu Bing, production manager of Guizhou RSL Sports Culture Development Co., Ltd.
贵州亚狮龙体育文化产业发展有限公司生产经理胡兵说:“我们统计过,全球大约每10只羽毛球,就有1只产自锦屏。”

\n

Last year, the company produced over 4 million dozen shuttlecocks, generating a staggering output value of 340 million yuan ($47.73 million) and exporting nearly $9 million worth of shuttlecocks to over 60 countries and regions, Hu noted.
胡兵说,公司去年产值3.4亿元,生产羽毛球超400多万打,出口总额近900万美元,产品销往60多个国家和地区。

\n

The first half of 2024 saw the company achieve even more remarkable growth, with the output value of shuttlecocks reaching 185 million yuan and exports skyrocketing by around 40 percent compared to the same period last year.
今年上半年,该公司营业额进一步增长,产值达1.85亿元,出口比去年同期增长了40%左右。

\n

In the first quarter of 2024, China's exports of footballs, basketballs, and volleyballs saw a year-on-year increase of 33.57 percent in volume and 17.99 percent in value, while that of table tennis, badminton, and tennis equipment increased 0.93 percent from the same period last year to $204 million, according to GAC data.
根据海关总署数据,2024年第一季度,中国足球、篮球、排球出口量同比增长33.57%,出口额同比增长17.99%;乒乓球、羽毛球、网球及相关用品累计出口额2.04亿美元,同比增长0.93%。

\n

In the first three months of this year, the country's exports of roller skates and skateboards surged 30.85 percent and 50.21 percent year-on-year, respectively. The inclusion of skateboarding as an Olympic sport has further fueled demand, particularly in countries like Russia and Japan.
今年一季度,中国旱冰鞋和滑板出口量同比分别大幅增长30.85%和50.21%。随着滑板成为奥运项目,带动俄罗斯、日本等国消费,滑板出口额增长显著。

\n

In addition, treadmill exports jumped by 44.94 percent year-on-year in the first quarter, while artificial turf exports grew by 15.64 percent from the same period last year.
此外,一季度跑步机和人造草同比也分别增长44.94%和15.64%。

\n

To boost the pace of \"going global,\" Chinese sporting goods companies need to rely on greener sporting goods with higher technological content, said Bao Mingxiao, director of the China Sports Policy Research Institute at Beijing Sport University.
北京体育大学中国体育政策研究院院长鲍明晓表示,企业出海的步伐要更加坚实有力,靠的是更具科技含量、更加绿色环保的“硬实力”。

\n

Dingqi Sports Goods (Huai'an) Co., Ltd. in Huai'an city, east China's Jiangsu Province specializes in the production of ball bladders, including those used in the production of footballs, volleyballs, basketballs and rugby balls. 70 percent of its products are exported overseas. For the Paris Olympics, the company exported products made from 70 percent bio-based materials.
江苏淮安的顶碁运动用品(淮安)有限公司专门生产运动用足球、排球、篮球、橄榄球等球类产品内胆,产品70%出口海外。巴黎奥运会就使用了这家企业研发的含有70%生物基的产品。

\n

\"This type of football is equipped with a chip capable of making 500 identifications per second to assist in determining a handball or offside instances,\" said Zhou Hongda, general manager of the company, adding that it produces ball bladders made from recycled and bio-based materials.
顶碁运动用品(淮安)有限公司总经理周宏达表示:“这款足球植入了芯片,1秒内能做500次识别动作,通过实时数据辅助判断是否手球、越位等。” 他介绍,该公司的足球内胆用回收材料、生物基材料制成。

\n

Since the start of this year, the company has exported 4.07 million balls for training and games, including those used in the UEFA European Championship, Copa America, and the Paris Olympics.
今年以来,这家公司已出口欧洲杯、美洲杯、奥运会等赛事用球及训练用球407万个。

\n

Zhou believes that the key to the popularity of \"Made-in-China\" sporting goods overseas lies in continuous innovation, higher technological content, and adapting to new market demand.
周宏达认为,“中国制造”体育用品赢得海外市场的关键就在于不断创新,增加产品的科技含量,适应市场新需求。

\n

Wen Jia, deputy general secretary of the China Sporting Goods Federation, said fierce competition in the domestic market makes enterprises and merchants provide customized and personalized products and services by meeting customer demand and leveraging technologies.
中国体育用品业联合会副秘书长温嘉表示,国内市场竞争激烈,倒逼企业和商家从客户需求出发,利用科技手段提供定制化、个性化的产品和服务。

\n

The booming sports event economy has attracted buyers across the world to purchase all kinds of sporting goods in Yiwu, known as the \"World's Supermarket\" in east China's Zhejiang Province. In the city, the improved efficiency of customs supervision provides a strong boost for Chinese companies to go global.
赛事经济的带动下,世界各地的采购商抓住商机,来到“世界超市”浙江义乌采购各式各样的体育产品。在这里,海关监管效率的提升也为中国企业走出去提供了强大助力。

\n

Chinese enterprises are not just exporting sporting goods, but also technology, services, and brands.
中国企业不仅出口体育产品,同时也出口技术、服务和品牌。

\n

\"Many foreign clients recognize our manufacturing capabilities and hope to introduce Chinese production technology to their own countries. Our future may not solely involve product exports, but also technology, service, and brand exports,\" said Yang Lei, general manager of the foreign trade department at Hebei Jadeqi Sports Goods Co Ltd.
河北杰帝奇体育用品有限公司外贸部总经理杨磊表示:“国外很多客商对我们的制造业水平很认可,他们也希望把中国的生产技术引进过去。我们以后可能不单纯地进行产品出口,也要进行技术、服务、品牌的出口。”

\n

\"Our overseas strategy aligns with the Belt and Road Initiative. We not only produce products but also offer services and comprehensive solutions, facilitating integration with other industries and making our operations more convenient. Recently, we've been considering building a production base in Serbia, having just visited there, and found the environment and market conditions favorable,\" Yang added.
杨磊说:“我们的出海思路其实就是跟着‘一带一路’走。因为我们不仅做产品,也做服务、做一体化的解决方式,这样可以更好地和其他行业进行整合,对我们来说也更便利。最近,我们正在研究去塞尔维亚建生产基地,刚去那里考察过,环境和市场都不错,很适合做市场。”

\n

英文来源:人民网
编译:丹妮
审校:万月英、齐磊

\n\n
", - "content": "
\n\n \n\n \n \n\n

海关总署近日发布的数据显示,今年上半年,中国体育用品及设备出口同比增长16.7%,高出同期出口整体增速9.8个百分点。世界贸易组织发布的数据报告显示,全球范围内的体育用品贸易在过去近30年里增长了近3倍,而在这30年间,中国已成为全球最大的体育用品出口国。

\n
\n \n
\n A foreign businessman (right) picks ball products at the Yiwu International Trade City in Yiwu, Zhejiang province, on April 15, 2024. [Photo/VCG] \n
\n
\n

The exports of China's sporting goods and equipment surged 16.7 percent year-on-year in the first half of 2024, outpacing the overall export growth during the same period by a whopping 9.8 percentage points, according to data recently released by the General Administration of Customs (GAC).
海关总署近日发布的数据显示,今年上半年,中国体育用品及设备出口同比增长16.7%,高出同期出口整体增速9.8个百分点。

\n

Data from the World Trade Organization showed that global trade in sporting goods has nearly tripled in almost 30 years, and China has become the world's top exporter of sporting goods.
世界贸易组织发布的数据显示,全球范围内的体育用品贸易在过去近30年里增长了近3倍,而在这30年间,中国已成为全球最大的体育用品出口国。

\n

In Jinping county of southwest China's Guizhou Province, a global production hub for badminton shuttlecocks, more than 100,000 shuttlecocks are sold worldwide a day.
在全球重要的羽毛球生产基地——贵州省锦屏县,每天超过10万只羽毛球从这里“飞”向全球。

\n

\"We've calculated that about one in every 10 shuttlecocks in the world comes from Jinping,\" said Hu Bing, production manager of Guizhou RSL Sports Culture Development Co., Ltd.
贵州亚狮龙体育文化产业发展有限公司生产经理胡兵说:“我们统计过,全球大约每10只羽毛球,就有1只产自锦屏。”

\n

Last year, the company produced over 4 million dozen shuttlecocks, generating a staggering output value of 340 million yuan ($47.73 million) and exporting nearly $9 million worth of shuttlecocks to over 60 countries and regions, Hu noted.
胡兵说,公司去年产值3.4亿元,生产羽毛球超400多万打,出口总额近900万美元,产品销往60多个国家和地区。

\n

The first half of 2024 saw the company achieve even more remarkable growth, with the output value of shuttlecocks reaching 185 million yuan and exports skyrocketing by around 40 percent compared to the same period last year.
今年上半年,该公司营业额进一步增长,产值达1.85亿元,出口比去年同期增长了40%左右。

\n

In the first quarter of 2024, China's exports of footballs, basketballs, and volleyballs saw a year-on-year increase of 33.57 percent in volume and 17.99 percent in value, while that of table tennis, badminton, and tennis equipment increased 0.93 percent from the same period last year to $204 million, according to GAC data.
根据海关总署数据,2024年第一季度,中国足球、篮球、排球出口量同比增长33.57%,出口额同比增长17.99%;乒乓球、羽毛球、网球及相关用品累计出口额2.04亿美元,同比增长0.93%。

\n

In the first three months of this year, the country's exports of roller skates and skateboards surged 30.85 percent and 50.21 percent year-on-year, respectively. The inclusion of skateboarding as an Olympic sport has further fueled demand, particularly in countries like Russia and Japan.
今年一季度,中国旱冰鞋和滑板出口量同比分别大幅增长30.85%和50.21%。随着滑板成为奥运项目,带动俄罗斯、日本等国消费,滑板出口额增长显著。

\n

In addition, treadmill exports jumped by 44.94 percent year-on-year in the first quarter, while artificial turf exports grew by 15.64 percent from the same period last year.
此外,一季度跑步机和人造草同比也分别增长44.94%和15.64%。

\n

To boost the pace of \"going global,\" Chinese sporting goods companies need to rely on greener sporting goods with higher technological content, said Bao Mingxiao, director of the China Sports Policy Research Institute at Beijing Sport University.
北京体育大学中国体育政策研究院院长鲍明晓表示,企业出海的步伐要更加坚实有力,靠的是更具科技含量、更加绿色环保的“硬实力”。

\n

Dingqi Sports Goods (Huai'an) Co., Ltd. in Huai'an city, east China's Jiangsu Province specializes in the production of ball bladders, including those used in the production of footballs, volleyballs, basketballs and rugby balls. 70 percent of its products are exported overseas. For the Paris Olympics, the company exported products made from 70 percent bio-based materials.
江苏淮安的顶碁运动用品(淮安)有限公司专门生产运动用足球、排球、篮球、橄榄球等球类产品内胆,产品70%出口海外。巴黎奥运会就使用了这家企业研发的含有70%生物基的产品。

\n

\"This type of football is equipped with a chip capable of making 500 identifications per second to assist in determining a handball or offside instances,\" said Zhou Hongda, general manager of the company, adding that it produces ball bladders made from recycled and bio-based materials.
顶碁运动用品(淮安)有限公司总经理周宏达表示:“这款足球植入了芯片,1秒内能做500次识别动作,通过实时数据辅助判断是否手球、越位等。” 他介绍,该公司的足球内胆用回收材料、生物基材料制成。

\n

Since the start of this year, the company has exported 4.07 million balls for training and games, including those used in the UEFA European Championship, Copa America, and the Paris Olympics.
今年以来,这家公司已出口欧洲杯、美洲杯、奥运会等赛事用球及训练用球407万个。

\n

Zhou believes that the key to the popularity of \"Made-in-China\" sporting goods overseas lies in continuous innovation, higher technological content, and adapting to new market demand.
周宏达认为,“中国制造”体育用品赢得海外市场的关键就在于不断创新,增加产品的科技含量,适应市场新需求。

\n

Wen Jia, deputy general secretary of the China Sporting Goods Federation, said fierce competition in the domestic market makes enterprises and merchants provide customized and personalized products and services by meeting customer demand and leveraging technologies.
中国体育用品业联合会副秘书长温嘉表示,国内市场竞争激烈,倒逼企业和商家从客户需求出发,利用科技手段提供定制化、个性化的产品和服务。

\n

The booming sports event economy has attracted buyers across the world to purchase all kinds of sporting goods in Yiwu, known as the \"World's Supermarket\" in east China's Zhejiang Province. In the city, the improved efficiency of customs supervision provides a strong boost for Chinese companies to go global.
赛事经济的带动下,世界各地的采购商抓住商机,来到“世界超市”浙江义乌采购各式各样的体育产品。在这里,海关监管效率的提升也为中国企业走出去提供了强大助力。

\n

Chinese enterprises are not just exporting sporting goods, but also technology, services, and brands.
中国企业不仅出口体育产品,同时也出口技术、服务和品牌。

\n

\"Many foreign clients recognize our manufacturing capabilities and hope to introduce Chinese production technology to their own countries. Our future may not solely involve product exports, but also technology, service, and brand exports,\" said Yang Lei, general manager of the foreign trade department at Hebei Jadeqi Sports Goods Co Ltd.
河北杰帝奇体育用品有限公司外贸部总经理杨磊表示:“国外很多客商对我们的制造业水平很认可,他们也希望把中国的生产技术引进过去。我们以后可能不单纯地进行产品出口,也要进行技术、服务、品牌的出口。”

\n

\"Our overseas strategy aligns with the Belt and Road Initiative. We not only produce products but also offer services and comprehensive solutions, facilitating integration with other industries and making our operations more convenient. Recently, we've been considering building a production base in Serbia, having just visited there, and found the environment and market conditions favorable,\" Yang added.
杨磊说:“我们的出海思路其实就是跟着‘一带一路’走。因为我们不仅做产品,也做服务、做一体化的解决方式,这样可以更好地和其他行业进行整合,对我们来说也更便利。最近,我们正在研究去塞尔维亚建生产基地,刚去那里考察过,环境和市场都不错,很适合做市场。”

\n

英文来源:人民网
编译:丹妮
审校:万月英、齐磊

\n\n
", - "category": "", - "link": "https://language.chinadaily.com.cn/a/202409/03/WS66d6b777a3108f29c1fc9e35.html", - "creator": "", - "pubDate": "", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "9305b1b5e2881a059053edec7adb453b", - "highlights": [] - }, { "title": "开学啦!来看看新学期的正确打开方式", "description": "
\n\n \n\n \n \n\n

A new semester means a fresh start. Get your semester started right by practicing these strategies, and your productivity will soar.
新学期意味着新的开始。掌握了新学期的正确打开方式,你的学习效率将会直线上升。

\n

 

\n
\n \n
\n Photo/Pexels \n
\n
\n

 

\n

1. Get organized
让一切井井有条

\n

Organization helps you reduce chaos and stress, thus making you more productive. Develop a system at the start of your semester. This may include:
条理性可以帮助你减少混乱和压力,从而让你做事更有效率。在开学时把一切都整理得井井有条,包括:

\n

--Color coded notebooks and/or folders for each class
——给每门课程准备一个彩页笔记本和文件夹;

\n

-- A planner with important dates and deadlines filled out
——准备一个日程表,标注出重要的日子和各项任务的截止日期;

\n

--Cleaning out your backpack, desk, and dorm room to reduce clutter from previous semesters
——清理背包、书桌和宿舍,把前几个学期积攒下来的无用之物处理掉;

\n

--Organizing your computer files (e.g., by school year, semester, course, and assignment type or project)
——整理电脑文件,可以按照学年、学期、课程、作业或项目分门别类;

\n

If you keep track of deadlines, know where to find everything, and maintain a well-organized space, you free up your mind to focus on learning and achieving.
如果你对截止日期了如指掌,知道每样东西放在哪儿,把空间整理得井井有条,你就可以把脑子腾出来专心学习,做出成绩。

\n

 

\n

2. Get into a routine
做事有规律

\n

Like being organized, establishing a routine helps your life run smoothly.
和条理性一样,做事有规律可以让你的生活更顺利。

\n

It’s easier said than done, but try waking up and going to sleep around the same time each day (or at least on weekdays). Schedule time for the gym, any clubs or activities you participate in, and studying. Instead of waiting until the last minute to work on assignments or cram in information, set aside studying/homework blocks each day. Choose a time of day when you feel especially productive.
尽管说起来容易做起来难,但是你可以试着每天都在同一时间起床和睡觉(至少在工作日如此)。规划好去健身、去参加社团或其他活动以及学习的时间。每天都要留出一整块时间用于学习和做作业,不要等到最后一刻才赶作业或背书。选择一天中你自认为效率最高的时间来学习。

\n

Start each day on a positive note by preparing the night before. For instance, set out the outfit you’ll wear to class and pack your backpack with the supplies you’ll need that day. Instead of frantically scrambling around in the morning, you’ll begin the day feeling confident and prepared. Ultimately, these small habits make a big difference in your overall mood and performance.
通过在前一天晚上做好准备,以积极的态度开始每一天。举例而言,准备好你明天上课要穿的衣服,在书包里放好明天需要的东西。这样,你就可以在准备充分的情况下自信地开始新的一天,而不是一大早紧张忙乱地到处找东西。最终,这些小习惯将会让你的整体情绪状态和表现大为改观。

\n

 

\n

3. Surround yourself with motivated peers
结交好学的同伴

\n

Maybe you’ve heard the saying, “Show me your friends and I’ll show you your future.” It may sound dramatic, but it’s true that the people you spend the most time with have a major influence on you. If your friends are partying every night, skipping class, and seemingly unconcerned about their grades, staying motivated will be an uphill battle for you.
也许你听过这句话:“你身边的朋友决定你的未来。”这也许听起来有些夸张,但是你与之交往时间最长的人对你会产生重大影响,这是事实。如果你的朋友夜夜狂欢,逃课,对成绩毫不在意,那么保持斗志对你来说会非常困难。

\n

Try to make at least one positive friend in every class. Meet ambitious people with clearly defined goals, good study habits, and healthy lifestyles. These friends can help you stay accountable, and they make great study buddies too.
你应该试着每门课程都结交至少一位好学的朋友。结交那些有明确目标、良好学习习惯和健康生活方式的有志向的人。这些朋友可以帮助你保持责任心,也可以成为很好的学伴。

\n

 

\n

4. Take good care of yourself
照顾好自己

\n

Finally, remember to practice self-care and healthy habits. When you eat poorly and don’t get enough sleep, it impacts your mood and your mind. You may feel fuzzy and forgetful, and you’ll have a tough time learning new concepts. Obviously, this is not helpful for a successful semester.
最后,记得要照顾好自己,养成健康的生活习惯。如果你吃不好,睡眠不足,就会影响你的情绪和头脑。你可能会觉得脑子迷迷糊糊,变得健忘,在学习新概念时也会感到费劲。显然,这对于成功开展新学期有害无益。

\n

Eat nutritious meals (as often as you can), exercise, and get plenty of rest. Studying in small chunks instead of relying on cram sessions is one way to ensure you sleep enough.
平常多吃有营养的饭菜,坚持锻炼,充分休息。每天学一点,而不是临时抱佛脚,也是确保你睡眠充足的一个方式。

\n

Creating new habits is tough at first. Stick with it, and you’ll find that you’re far more productive and successful—and probably happier, too.
养成新习惯一开始很难。坚持下来,你会发现你远比以前效率更高、更成功,应该也会更快乐。

\n

 

\n

英文来源:Niche

\n

编译:丹妮

\n

审校:董静、齐磊

\n\n
", @@ -5023,28 +5617,6 @@ "hash": "c93cd7fea5ef9801a585814b525d20a3", "highlights": [] }, - { - "title": "【双语财讯】美经济学家警告:美国多个经济衰退“红灯”亮起", - "description": "
\n\n \n\n \n \n\n
\n \n
\n
\n

美国商业内幕网8月30日报道称,美国知名经济学家、罗森伯格研究公司总裁大卫·罗森伯格表示,近期一系列信号提示,美国经济陷入衰退的可能性正在上升。文章摘编如下:

\n

The probability of a recession hitting the US economy is rising after a flurry of signals have flashed in recent weeks and months.
在近期(最近几周和数月内)一系列信号亮起后,美国经济陷入衰退的可能性正在上升。

\n

That's according to economist David Rosenberg of Rosenberg Research, who compiled a list of recessionary indicators in a note on Friday.
美国罗森伯格研究公司总裁大卫·罗森伯格在8月30日发布的一份报告中汇编了一份衰退指标清单。

\n

\"What is the best recession indicator? That's a hard question to answer — why not dodge it completely and just look at all of them?\" Rosenberg asked.
他提出:“最准确的衰退指标是什么?这是一个很难回答的问题——为什么不避开这个问题,看看所有这些指标呢?”

\n

According to Rosenberg, some worrying signals have historically only flashed on the precipice of an economic downturn.
罗森伯格表示,在历史上,一些令人担忧的信号只有在经济即将陷入衰退时才会出现。

\n

\"The 'indicator of indicators' indicates recession,\" Rosenberg said.
罗森伯格称:“‘指标的指标’预示着经济衰退。”

\n

Of the 20 recession indicators compiled by Rosenberg, nine have been triggered.
罗森伯格编制的20个衰退指标中,有9个已经触发。

\n

Some of the recession signals that have flashed include the Sahm Rule, the Leading Economic Indicator Index, and the inverted yield curve, among others.
被触发的衰退指标包括萨姆规则、先行指数和倒挂的收益率曲线等。

\n

\"Currently, 45% of the recession indicators we tracked have been triggered. Going back to 1999, that's never happened without a recession occurring,\" Rosenberg said.
罗森伯格说:“目前,我们追踪的经济衰退指标中有45%已经触发。自1999年以来,从来没有出现这种情况而不发生衰退的。”

\n

The list of signals flashing has steadily risen since 2022, when only 10% were triggered. That rose to about 25% in 2023 and the first half of 2024.
自2022年以来,预示美国经济陷入衰退的信号数量一直都在稳步上升,当时只有10%被触发。2023年和2024年上半年,这一比例上升到了25%左右。

\n

But since then, the recession warnings have been growing.
而自那以后,关于美国经济衰退的警告越来越多。

\n

\"Sometimes more is more, and this is a case in point. Looking at recession thresholds across different sectors of the economy makes it clear that something has been changing since mid-2024 — the long-anticipated slowdown may finally be arriving,\" Rosenberg said.
罗森伯格说:“有时更多就是更多,这就是一个很好的例证。观察不同经济部门的衰退阈值可以清楚地看出,自2024年中期以来,一些事情一直在发生变化——经济衰退可能真的要来了。”

\n

编辑:董静
审校:陈丹妮 万月英

\n

 

\n\n
", - "content": "
\n\n \n\n \n \n\n
\n \n
\n
\n

美国商业内幕网8月30日报道称,美国知名经济学家、罗森伯格研究公司总裁大卫·罗森伯格表示,近期一系列信号提示,美国经济陷入衰退的可能性正在上升。文章摘编如下:

\n

The probability of a recession hitting the US economy is rising after a flurry of signals have flashed in recent weeks and months.
在近期(最近几周和数月内)一系列信号亮起后,美国经济陷入衰退的可能性正在上升。

\n

That's according to economist David Rosenberg of Rosenberg Research, who compiled a list of recessionary indicators in a note on Friday.
美国罗森伯格研究公司总裁大卫·罗森伯格在8月30日发布的一份报告中汇编了一份衰退指标清单。

\n

\"What is the best recession indicator? That's a hard question to answer — why not dodge it completely and just look at all of them?\" Rosenberg asked.
他提出:“最准确的衰退指标是什么?这是一个很难回答的问题——为什么不避开这个问题,看看所有这些指标呢?”

\n

According to Rosenberg, some worrying signals have historically only flashed on the precipice of an economic downturn.
罗森伯格表示,在历史上,一些令人担忧的信号只有在经济即将陷入衰退时才会出现。

\n

\"The 'indicator of indicators' indicates recession,\" Rosenberg said.
罗森伯格称:“‘指标的指标’预示着经济衰退。”

\n

Of the 20 recession indicators compiled by Rosenberg, nine have been triggered.
罗森伯格编制的20个衰退指标中,有9个已经触发。

\n

Some of the recession signals that have flashed include the Sahm Rule, the Leading Economic Indicator Index, and the inverted yield curve, among others.
被触发的衰退指标包括萨姆规则、先行指数和倒挂的收益率曲线等。

\n

\"Currently, 45% of the recession indicators we tracked have been triggered. Going back to 1999, that's never happened without a recession occurring,\" Rosenberg said.
罗森伯格说:“目前,我们追踪的经济衰退指标中有45%已经触发。自1999年以来,从来没有出现这种情况而不发生衰退的。”

\n

The list of signals flashing has steadily risen since 2022, when only 10% were triggered. That rose to about 25% in 2023 and the first half of 2024.
自2022年以来,预示美国经济陷入衰退的信号数量一直都在稳步上升,当时只有10%被触发。2023年和2024年上半年,这一比例上升到了25%左右。

\n

But since then, the recession warnings have been growing.
而自那以后,关于美国经济衰退的警告越来越多。

\n

\"Sometimes more is more, and this is a case in point. Looking at recession thresholds across different sectors of the economy makes it clear that something has been changing since mid-2024 — the long-anticipated slowdown may finally be arriving,\" Rosenberg said.
罗森伯格说:“有时更多就是更多,这就是一个很好的例证。观察不同经济部门的衰退阈值可以清楚地看出,自2024年中期以来,一些事情一直在发生变化——经济衰退可能真的要来了。”

\n

编辑:董静
审校:陈丹妮 万月英

\n

 

\n\n
", - "category": "", - "link": "https://language.chinadaily.com.cn/a/202409/02/WS66d582b8a3108f29c1fc9a70.html", - "creator": "", - "pubDate": "", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "", - "folder": "双语", - "feed": "ChinaDaily", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "99b651d543cad1d20b6bf4c9c9210913", - "highlights": [] - }, { "title": "独腿博士研发智能假肢,让更多残疾人穿得起Wear robotic knees", "description": "幼时截肢的他,最终发明、制造出一种独特而“有思想”的智能假肢!", diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index c301bc68..f9a3fb41 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -35,7 +35,8 @@ "title": "2025-07-18" } } - ] + ], + "currentTab": 1 } ], "direction": "vertical" @@ -192,13 +193,13 @@ "state": { "type": "outline", "state": { - "file": "50-Memos/2025/weekly/第29周总结.md", + "file": "01-工作日记/2025-07-18.md", "followCursor": true, "showSearch": false, "searchQuery": "" }, "icon": "lucide-list", - "title": "第29周总结 的大纲" + "title": "2025-07-18 的大纲" } }, { @@ -319,11 +320,15 @@ "periodic-notes:Open today": false, "diary-ics:日记日历订阅": false, "cubox-sync:Cubox": false, - "file-tree-alternative:File Tree Alternative Plugin": false + "file-tree-alternative:File Tree Alternative Plugin": false, + "hidden-folder-obsidian:隐藏文件夹": false } }, - "active": "c912668428f56caf", + "active": "caf821448645d8ad", "lastOpenFiles": [ + "50-Memos/2025/weekly/第29周总结.md", + "60-Imports/62-DevonThink", + "60-Imports/61-CubeX", "50-Memos/2025/weekly/第28周总结.md", "04-博客发布/043-Bridge/技惊四座的Deep Finesse打法.md", "01-工作日记/2025-07-18.md", @@ -353,7 +358,6 @@ "03-学习笔记/Calibre电子书平台.md", "50-Memos/2025/07/resources/kyhNGvh5iFc9eYXy2YuYWx_FDF8C04E-22D3-4D4C-9ED0-F52A326B9801.jpg", "50-Memos/2025/07/resources/6cb2VU3rkihszQLFDerqA2_2_20250712120414.png", - "50-Memos/2025/weekly/第29周总结.md", "10-WebClipper/健康休闲", "10-WebClipper/桥牌", "10-WebClipper/人文历史", @@ -365,8 +369,6 @@ "10-WebClipper/电子书", "10-WebClipper/Docker", "10-WebClipper/知识体系", - "未命名", - "80-笔记归档/82-待办计划/2025", "04-博客发布/0743-Bridge/assets/640.jpeg", "04-博客发布/0743-Bridge/assets/640 2.jpeg", "04-博客发布/0743-Bridge/assets/642 1.jpeg", diff --git a/01-工作日记/2025-07-18.md b/01-工作日记/2025-07-18.md index 7c8532f1..3403c6be 100644 --- a/01-工作日记/2025-07-18.md +++ b/01-工作日记/2025-07-18.md @@ -13,6 +13,11 @@ excerpt: ## 2 Tracking +```apple-reminders +list: List Name +``` + + ## 3 Tips ## 4 Questions diff --git a/60-DevonThink/一个测试.md b/60-Imports/一个测试.md similarity index 100% rename from 60-DevonThink/一个测试.md rename to 60-Imports/一个测试.md