[{"data":1,"prerenderedAt":1906},["ShallowReactive",2],{"content-en-api":3},{"doc":4,"debug":1903},{"id":5,"title":6,"body":7,"description":1896,"extension":1897,"meta":1898,"navigation":84,"path":1899,"seo":1900,"stem":1901,"__hash__":1902},"content\u002Fen\u002Fapi.md","API Reference",{"type":8,"value":9,"toc":1857},"minimark",[10,14,43,46,55,62,92,97,107,189,217,222,247,251,295,303,312,342,348,356,365,379,387,396,403,405,413,420,447,451,460,471,502,506,513,665,675,783,793,953,957,969,1016,1020,1028,1071,1073,1080,1133,1150,1152,1160,1170,1203,1207,1296,1467,1469,1476,1484,1516,1520,1526,1543,1547,1629,1659,1661,1665,1695,1703,1705,1712,1732,1790,1796,1798,1802,1853],[11,12,6],"h1",{"id":13},"api-reference",[15,16,17,36],"blockquote",{},[18,19,20,21,31,32,35],"p",{},"Source of truth: ",[22,23,27],"a",{"href":24,"rel":25},"https:\u002F\u002Fgithub.com\u002Fozakboy\u002FOzaLog\u002Fblob\u002Fmain\u002FOzaLog\u002FOzaLog\u002FLOG.cs",[26],"nofollow",[28,29,30],"code",{},"OzaLog\u002FOzaLog\u002FLOG.cs",", generated XML doc shipped in the NuGet package as ",[28,33,34],{},"file.xml",".",[18,37,38,39,42],{},"All public types live in the ",[28,40,41],{},"OzaLog"," namespace.",[44,45],"hr",{},[47,48,50,51,54],"h2",{"id":49},"_1-log-static-class","1. ",[28,52,53],{},"LOG"," static class",[18,56,57,58,61],{},"The single entry point for all logging. No instantiation, no ",[28,59,60],{},"LoggerFactory",", no dependency injection.",[63,64,69],"pre",{"className":65,"code":66,"language":67,"meta":68,"style":68},"language-csharp shiki shiki-themes github-light","using OzaLog;\n\nLOG.Info_Log(\"Hello, OzaLog!\");\n","csharp","",[28,70,71,79,86],{"__ignoreMap":68},[72,73,76],"span",{"class":74,"line":75},"line",1,[72,77,78],{},"using OzaLog;\n",[72,80,82],{"class":74,"line":81},2,[72,83,85],{"emptyLinePlaceholder":84},true,"\n",[72,87,89],{"class":74,"line":88},3,[72,90,91],{},"LOG.Info_Log(\"Hello, OzaLog!\");\n",[93,94,96],"h3",{"id":95},"_11-loglevel-methods","1.1 LogLevel methods",[18,98,99,100,103,104,35],{},"For each ",[28,101,102],{},"LogLevel"," value (Trace \u002F Debug \u002F Info \u002F Warn \u002F Error \u002F Fatal), five overloads are provided. Naming convention: ",[28,105,106],{},"\u003CLevel>_Log",[63,108,110],{"className":65,"code":109,"language":67,"meta":68,"style":68},"\u002F\u002F String message\nLOG.Info_Log(string message);\n\n\u002F\u002F Toggle file write (true=write, false=console-only when EnableConsoleOutput=true)\nLOG.Info_Log(string message, bool writeTxt);\n\n\u002F\u002F Formatted message with {0}\u002F{1}\u002F... placeholders\nLOG.Info_Log(string message, string[] args, bool writeTxt = true, bool immediateFlush = false);\n\n\u002F\u002F Object — automatically serialized to JSON\nLOG.Info_Log\u003CT>(T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n\n\u002F\u002F Object with header message\nLOG.Info_Log\u003CT>(string message, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[28,111,112,117,122,126,132,138,143,149,155,160,166,172,177,183],{"__ignoreMap":68},[72,113,114],{"class":74,"line":75},[72,115,116],{},"\u002F\u002F String message\n",[72,118,119],{"class":74,"line":81},[72,120,121],{},"LOG.Info_Log(string message);\n",[72,123,124],{"class":74,"line":88},[72,125,85],{"emptyLinePlaceholder":84},[72,127,129],{"class":74,"line":128},4,[72,130,131],{},"\u002F\u002F Toggle file write (true=write, false=console-only when EnableConsoleOutput=true)\n",[72,133,135],{"class":74,"line":134},5,[72,136,137],{},"LOG.Info_Log(string message, bool writeTxt);\n",[72,139,141],{"class":74,"line":140},6,[72,142,85],{"emptyLinePlaceholder":84},[72,144,146],{"class":74,"line":145},7,[72,147,148],{},"\u002F\u002F Formatted message with {0}\u002F{1}\u002F... placeholders\n",[72,150,152],{"class":74,"line":151},8,[72,153,154],{},"LOG.Info_Log(string message, string[] args, bool writeTxt = true, bool immediateFlush = false);\n",[72,156,158],{"class":74,"line":157},9,[72,159,85],{"emptyLinePlaceholder":84},[72,161,163],{"class":74,"line":162},10,[72,164,165],{},"\u002F\u002F Object — automatically serialized to JSON\n",[72,167,169],{"class":74,"line":168},11,[72,170,171],{},"LOG.Info_Log\u003CT>(T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[72,173,175],{"class":74,"line":174},12,[72,176,85],{"emptyLinePlaceholder":84},[72,178,180],{"class":74,"line":179},13,[72,181,182],{},"\u002F\u002F Object with header message\n",[72,184,186],{"class":74,"line":185},14,[72,187,188],{},"LOG.Info_Log\u003CT>(string message, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[18,190,191],{},[192,193,194,195,198,199,202,203,202,206,202,209,212,213,216],"strong",{},"Replace ",[28,196,197],{},"Info"," with ",[28,200,201],{},"Trace",", ",[28,204,205],{},"Debug",[28,207,208],{},"Warn",[28,210,211],{},"Error",", or ",[28,214,215],{},"Fatal"," for the corresponding level.",[218,219,221],"h4",{"id":220},"automatic-immediate-flush","Automatic immediate flush",[18,223,224,227,228,231,232,235,236,239,240,242,243,246],{},[28,225,226],{},"Error_Log"," and ",[28,229,230],{},"Fatal_Log"," ",[192,233,234],{},"always"," trigger synchronous immediate flush regardless of the ",[28,237,238],{},"immediateFlush"," argument. This ensures crash logs reach disk before the process dies. Other levels respect the ",[28,241,238],{}," argument (default ",[28,244,245],{},"false",").",[218,248,250],{"id":249},"object-overload-behavior","Object overload behavior",[252,253,254,280],"ul",{},[255,256,257,258,227,261,264,265,268,269,202,272,275,276,279],"li",{},"When ",[28,259,260],{},"obj is Exception",[28,262,263],{},"level >= Warn",", the object is serialized via ",[28,266,267],{},"ExceptionHandler.CreateSerializableException(...)",", which recursively expands ",[28,270,271],{},"InnerException",[28,273,274],{},"Data"," dictionary, ",[28,277,278],{},"StackTrace",", and reflected non-standard properties.",[255,281,282,283,198,286,202,289,202,292,35],{},"Otherwise serialization goes through ",[28,284,285],{},"System.Text.Json",[28,287,288],{},"WriteIndented=false",[28,290,291],{},"DefaultIgnoreCondition=WhenWritingNull",[28,293,294],{},"Encoder=UnsafeRelaxedJsonEscaping",[93,296,298,299,302],{"id":297},"_12-customname_log-per-bucket-file","1.2 ",[28,300,301],{},"CustomName_Log"," — per-bucket file",[18,304,305,306,202,309,246],{},"Routes the log line to a custom filename instead of the level-based default. Useful for per-symbol files in trading (",[28,307,308],{},"BTC_Log.txt",[28,310,311],{},"ETH_Log.txt",[63,313,315],{"className":65,"code":314,"language":67,"meta":68,"style":68},"LOG.CustomName_Log(string name, string message);\nLOG.CustomName_Log(string name, string message, bool writeTxt);\nLOG.CustomName_Log(string name, string message, string[] args, bool writeTxt = true, bool immediateFlush = false);\nLOG.CustomName_Log\u003CT>(string name, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\nLOG.CustomName_Log\u003CT>(string name, string message, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[28,316,317,322,327,332,337],{"__ignoreMap":68},[72,318,319],{"class":74,"line":75},[72,320,321],{},"LOG.CustomName_Log(string name, string message);\n",[72,323,324],{"class":74,"line":81},[72,325,326],{},"LOG.CustomName_Log(string name, string message, bool writeTxt);\n",[72,328,329],{"class":74,"line":88},[72,330,331],{},"LOG.CustomName_Log(string name, string message, string[] args, bool writeTxt = true, bool immediateFlush = false);\n",[72,333,334],{"class":74,"line":128},[72,335,336],{},"LOG.CustomName_Log\u003CT>(string name, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[72,338,339],{"class":74,"line":134},[72,340,341],{},"LOG.CustomName_Log\u003CT>(string name, string message, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[18,343,344,345],{},"→ File path: ",[28,346,347],{},"{baseDir}\u002F{LogPath}\u002F{yyyyMMdd}\u002F{CustomPath}\u002F{name}_Log.{ext}",[93,349,351,352,355],{"id":350},"_13-logconfigure-one-time-configuration","1.3 ",[28,353,354],{},"LOG.Configure(...)"," — one-time configuration",[63,357,359],{"className":65,"code":358,"language":67,"meta":68,"style":68},"public static void Configure(Action\u003CLogConfiguration.LogOptions> configure);\n",[28,360,361],{"__ignoreMap":68},[72,362,363],{"class":74,"line":75},[72,364,358],{},[18,366,367,370,371,374,375,378],{},[192,368,369],{},"Not re-entrant."," Second call throws ",[28,372,373],{},"InvalidOperationException(\"OzaLog 已初始化（Configure 不可重入）\")",". If ",[28,376,377],{},"Configure"," is never called, the first log write auto-initializes with default settings.",[93,380,382,383,386],{"id":381},"_14-loggetcurrentoptions-read-only-config-view","1.4 ",[28,384,385],{},"LOG.GetCurrentOptions()"," — read-only config view",[63,388,390],{"className":65,"code":389,"language":67,"meta":68,"style":68},"public static LogConfiguration.ILogOptions GetCurrentOptions();\n",[28,391,392],{"__ignoreMap":68},[72,393,394],{"class":74,"line":75},[72,395,389],{},[18,397,398,399,402],{},"Returns a read-only wrapper around the live ",[28,400,401],{},"LogOptions",". Useful for diagnostics and verifying the active configuration.",[44,404],{},[47,406,408,409,412],{"id":407},"_2-logquote-quote-pipeline-v31","2. ",[28,410,411],{},"LOG.Quote(...)"," — Quote pipeline (v3.1+)",[18,414,415,416,419],{},"The Quote pipeline is an ",[192,417,418],{},"independent"," async pipeline for high-frequency tick\u002Fquote data, separate from the main logger. Field names align with the Binance REST API 24hr Ticker schema.",[15,421,422,428,437],{},[18,423,424,427],{},[192,425,426],{},"Prerequisite",": enable the pipeline at configuration time:",[63,429,431],{"className":65,"code":430,"language":67,"meta":68,"style":68},"LOG.Configure(o => o.ConfigureQuote(q => q.Enable = true));\n",[28,432,433],{"__ignoreMap":68},[72,434,435],{"class":74,"line":75},[72,436,430],{},[18,438,439,440,443,444,446],{},"Without ",[28,441,442],{},"Enable = true",", all ",[28,445,411],{}," calls are silent no-ops (no background thread is started).",[93,448,450],{"id":449},"_21-a2-core-api-struct-overload","2.1 A2 core API — struct overload",[63,452,454],{"className":65,"code":453,"language":67,"meta":68,"style":68},"public static void Quote(in QuoteRecord record);\n",[28,455,456],{"__ignoreMap":68},[72,457,458],{"class":74,"line":75},[72,459,453],{},[18,461,462,463,466,467,470],{},"Zero-allocation enqueue. Validates ",[28,464,465],{},"record"," synchronously on the calling thread and throws ",[28,468,469],{},"ArgumentException"," for:",[252,472,473,483,492],{},[255,474,475,478,479,482],{},[28,476,477],{},"Symbol"," or ",[28,480,481],{},"Bucket"," is null or empty",[255,484,485,227,488,491],{},[28,486,487],{},"Extras",[28,489,490],{},"ExtrasJson"," both set",[255,493,494,496,497,501],{},[28,495,487],{}," contains a key matching a reserved field (see ",[22,498,500],{"href":499},"#24-reserved-extras-keys","§2.4",")",[93,503,505],{"id":504},"_22-a1-convenience-overloads","2.2 A1 convenience overloads",[18,507,508,509,512],{},"Internally construct a ",[28,510,511],{},"QuoteRecord"," and delegate to the struct overload.",[63,514,516],{"className":65,"code":515,"language":67,"meta":68,"style":68},"\u002F\u002F Minimal tick — last price only\nLOG.Quote(string symbol, string bucket, long ticks, decimal last);\n\n\u002F\u002F With bid\u002Fask\nLOG.Quote(string symbol, string bucket, long ticks,\n          decimal last, decimal bid, decimal ask);\n\n\u002F\u002F With bid\u002Fask + sizes\nLOG.Quote(string symbol, string bucket, long ticks,\n          decimal last,\n          decimal bid, decimal bidQty,\n          decimal ask, decimal askQty);\n\n\u002F\u002F Full ticker — aligned with Binance REST API \u002Fapi\u002Fv3\u002Fticker\u002F24hr\nLOG.QuoteTicker(string symbol, string bucket, long ticks,\n                decimal last,\n                decimal? lastQty = null,\n                decimal? bid = null, decimal? bidQty = null,\n                decimal? ask = null, decimal? askQty = null,\n                decimal? open = null, decimal? prevClose = null,\n                decimal? high = null, decimal? low = null,\n                decimal? volume = null, decimal? quoteVolume = null);\n\n\u002F\u002F Full ticker with custom Extras dictionary\nLOG.QuoteTicker(string symbol, string bucket, long ticks,\n                decimal last,\n                IReadOnlyDictionary\u003Cstring, object> extras,\n                \u002F* same optional fields as above *\u002F);\n",[28,517,518,523,528,532,537,542,547,551,556,560,565,570,575,579,584,590,596,602,608,614,620,626,632,637,643,648,653,659],{"__ignoreMap":68},[72,519,520],{"class":74,"line":75},[72,521,522],{},"\u002F\u002F Minimal tick — last price only\n",[72,524,525],{"class":74,"line":81},[72,526,527],{},"LOG.Quote(string symbol, string bucket, long ticks, decimal last);\n",[72,529,530],{"class":74,"line":88},[72,531,85],{"emptyLinePlaceholder":84},[72,533,534],{"class":74,"line":128},[72,535,536],{},"\u002F\u002F With bid\u002Fask\n",[72,538,539],{"class":74,"line":134},[72,540,541],{},"LOG.Quote(string symbol, string bucket, long ticks,\n",[72,543,544],{"class":74,"line":140},[72,545,546],{},"          decimal last, decimal bid, decimal ask);\n",[72,548,549],{"class":74,"line":145},[72,550,85],{"emptyLinePlaceholder":84},[72,552,553],{"class":74,"line":151},[72,554,555],{},"\u002F\u002F With bid\u002Fask + sizes\n",[72,557,558],{"class":74,"line":157},[72,559,541],{},[72,561,562],{"class":74,"line":162},[72,563,564],{},"          decimal last,\n",[72,566,567],{"class":74,"line":168},[72,568,569],{},"          decimal bid, decimal bidQty,\n",[72,571,572],{"class":74,"line":174},[72,573,574],{},"          decimal ask, decimal askQty);\n",[72,576,577],{"class":74,"line":179},[72,578,85],{"emptyLinePlaceholder":84},[72,580,581],{"class":74,"line":185},[72,582,583],{},"\u002F\u002F Full ticker — aligned with Binance REST API \u002Fapi\u002Fv3\u002Fticker\u002F24hr\n",[72,585,587],{"class":74,"line":586},15,[72,588,589],{},"LOG.QuoteTicker(string symbol, string bucket, long ticks,\n",[72,591,593],{"class":74,"line":592},16,[72,594,595],{},"                decimal last,\n",[72,597,599],{"class":74,"line":598},17,[72,600,601],{},"                decimal? lastQty = null,\n",[72,603,605],{"class":74,"line":604},18,[72,606,607],{},"                decimal? bid = null, decimal? bidQty = null,\n",[72,609,611],{"class":74,"line":610},19,[72,612,613],{},"                decimal? ask = null, decimal? askQty = null,\n",[72,615,617],{"class":74,"line":616},20,[72,618,619],{},"                decimal? open = null, decimal? prevClose = null,\n",[72,621,623],{"class":74,"line":622},21,[72,624,625],{},"                decimal? high = null, decimal? low = null,\n",[72,627,629],{"class":74,"line":628},22,[72,630,631],{},"                decimal? volume = null, decimal? quoteVolume = null);\n",[72,633,635],{"class":74,"line":634},23,[72,636,85],{"emptyLinePlaceholder":84},[72,638,640],{"class":74,"line":639},24,[72,641,642],{},"\u002F\u002F Full ticker with custom Extras dictionary\n",[72,644,646],{"class":74,"line":645},25,[72,647,589],{},[72,649,651],{"class":74,"line":650},26,[72,652,595],{},[72,654,656],{"class":74,"line":655},27,[72,657,658],{},"                IReadOnlyDictionary\u003Cstring, object> extras,\n",[72,660,662],{"class":74,"line":661},28,[72,663,664],{},"                \u002F* same optional fields as above *\u002F);\n",[93,666,668,669,671,672,501],{"id":667},"_23-quoterecord-public-readonly-struct","2.3 ",[28,670,511],{}," (public ",[28,673,674],{},"readonly struct",[63,676,678],{"className":65,"code":677,"language":67,"meta":68,"style":68},"public readonly struct QuoteRecord\n{\n    \u002F\u002F Required\n    public readonly string Symbol;     \u002F\u002F e.g. \"BTCUSDT\"\n    public readonly string Bucket;     \u002F\u002F e.g. \"binance_spot\"\n    public readonly long   Ticks;      \u002F\u002F event time, caller-supplied\n    public readonly decimal Last;      \u002F\u002F last trade price\n\n    \u002F\u002F Optional (all decimal?)\n    public readonly decimal? LastQty;       \u002F\u002F qty of last trade\n    public readonly decimal? Bid, BidQty;   \u002F\u002F best bid + qty\n    public readonly decimal? Ask, AskQty;   \u002F\u002F best ask + qty\n    public readonly decimal? Open, PrevClose;\n    public readonly decimal? High, Low;\n    public readonly decimal? Volume;        \u002F\u002F cumulative base asset volume\n    public readonly decimal? QuoteVolume;   \u002F\u002F cumulative quote asset volume\n\n    \u002F\u002F Custom fields — mutually exclusive\n    public readonly IReadOnlyDictionary\u003Cstring, object>? Extras;\n    public readonly string? ExtrasJson;     \u002F\u002F pre-serialized JSON object string\n}\n",[28,679,680,685,690,695,700,705,710,715,719,724,729,734,739,744,749,754,759,763,768,773,778],{"__ignoreMap":68},[72,681,682],{"class":74,"line":75},[72,683,684],{},"public readonly struct QuoteRecord\n",[72,686,687],{"class":74,"line":81},[72,688,689],{},"{\n",[72,691,692],{"class":74,"line":88},[72,693,694],{},"    \u002F\u002F Required\n",[72,696,697],{"class":74,"line":128},[72,698,699],{},"    public readonly string Symbol;     \u002F\u002F e.g. \"BTCUSDT\"\n",[72,701,702],{"class":74,"line":134},[72,703,704],{},"    public readonly string Bucket;     \u002F\u002F e.g. \"binance_spot\"\n",[72,706,707],{"class":74,"line":140},[72,708,709],{},"    public readonly long   Ticks;      \u002F\u002F event time, caller-supplied\n",[72,711,712],{"class":74,"line":145},[72,713,714],{},"    public readonly decimal Last;      \u002F\u002F last trade price\n",[72,716,717],{"class":74,"line":151},[72,718,85],{"emptyLinePlaceholder":84},[72,720,721],{"class":74,"line":157},[72,722,723],{},"    \u002F\u002F Optional (all decimal?)\n",[72,725,726],{"class":74,"line":162},[72,727,728],{},"    public readonly decimal? LastQty;       \u002F\u002F qty of last trade\n",[72,730,731],{"class":74,"line":168},[72,732,733],{},"    public readonly decimal? Bid, BidQty;   \u002F\u002F best bid + qty\n",[72,735,736],{"class":74,"line":174},[72,737,738],{},"    public readonly decimal? Ask, AskQty;   \u002F\u002F best ask + qty\n",[72,740,741],{"class":74,"line":179},[72,742,743],{},"    public readonly decimal? Open, PrevClose;\n",[72,745,746],{"class":74,"line":185},[72,747,748],{},"    public readonly decimal? High, Low;\n",[72,750,751],{"class":74,"line":586},[72,752,753],{},"    public readonly decimal? Volume;        \u002F\u002F cumulative base asset volume\n",[72,755,756],{"class":74,"line":592},[72,757,758],{},"    public readonly decimal? QuoteVolume;   \u002F\u002F cumulative quote asset volume\n",[72,760,761],{"class":74,"line":598},[72,762,85],{"emptyLinePlaceholder":84},[72,764,765],{"class":74,"line":604},[72,766,767],{},"    \u002F\u002F Custom fields — mutually exclusive\n",[72,769,770],{"class":74,"line":610},[72,771,772],{},"    public readonly IReadOnlyDictionary\u003Cstring, object>? Extras;\n",[72,774,775],{"class":74,"line":616},[72,776,777],{},"    public readonly string? ExtrasJson;     \u002F\u002F pre-serialized JSON object string\n",[72,779,780],{"class":74,"line":622},[72,781,782],{},"}\n",[18,784,785,792],{},[192,786,787,788,791],{},"Field-name mapping to Binance ",[28,789,790],{},"\u002Fapi\u002Fv3\u002Fticker\u002F24hr"," response",":",[794,795,796,813],"table",{},[797,798,799],"thead",{},[800,801,802,807,810],"tr",{},[803,804,805],"th",{},[28,806,511],{},[803,808,809],{},"Binance JSON",[803,811,812],{},"Note",[814,815,816,832,847,869,890,923,938],"tbody",{},[800,817,818,824,829],{},[819,820,821],"td",{},[28,822,823],{},"Last",[819,825,826],{},[28,827,828],{},"lastPrice",[819,830,831],{},"required",[800,833,834,839,844],{},[819,835,836],{},[28,837,838],{},"LastQty",[819,840,841],{},[28,842,843],{},"lastQty",[819,845,846],{},"quantity of the most recent trade",[800,848,849,858,866],{},[819,850,851,854,855],{},[28,852,853],{},"Bid"," \u002F ",[28,856,857],{},"BidQty",[819,859,860,854,863],{},[28,861,862],{},"bidPrice",[28,864,865],{},"bidQty",[819,867,868],{},"best bid quote",[800,870,871,879,887],{},[819,872,873,854,876],{},[28,874,875],{},"Ask",[28,877,878],{},"AskQty",[819,880,881,854,884],{},[28,882,883],{},"askPrice",[28,885,886],{},"askQty",[819,888,889],{},"best ask quote",[800,891,892,906,920],{},[819,893,894,854,897,854,900,854,903],{},[28,895,896],{},"Open",[28,898,899],{},"PrevClose",[28,901,902],{},"High",[28,904,905],{},"Low",[819,907,908,854,911,854,914,854,917],{},[28,909,910],{},"openPrice",[28,912,913],{},"prevClosePrice",[28,915,916],{},"highPrice",[28,918,919],{},"lowPrice",[819,921,922],{},"session stats",[800,924,925,930,935],{},[819,926,927],{},[28,928,929],{},"Volume",[819,931,932],{},[28,933,934],{},"volume",[819,936,937],{},"24h base asset volume",[800,939,940,945,950],{},[819,941,942],{},[28,943,944],{},"QuoteVolume",[819,946,947],{},[28,948,949],{},"quoteVolume",[819,951,952],{},"24h quote asset volume",[93,954,956],{"id":955},"_24-reserved-extras-keys","2.4 Reserved Extras keys",[18,958,959,960,962,963,965,966,968],{},"The following keys are reserved by the built-in schema. Putting them in ",[28,961,487],{}," (Dictionary) throws ",[28,964,469],{}," synchronously. Putting them in ",[28,967,490],{}," (string) throws asynchronously inside the dispatcher (logged to console; record is dropped).",[15,970,971],{},[18,972,973,202,976,202,979,202,982,202,985,202,987,202,990,202,992,202,995,202,997,202,1000,202,1003,202,1006,202,1009,202,1011,202,1013],{},[28,974,975],{},"ts",[28,977,978],{},"symbol",[28,980,981],{},"bucket",[28,983,984],{},"last",[28,986,843],{},[28,988,989],{},"bid",[28,991,865],{},[28,993,994],{},"ask",[28,996,886],{},[28,998,999],{},"open",[28,1001,1002],{},"prevClose",[28,1004,1005],{},"high",[28,1007,1008],{},"low",[28,1010,934],{},[28,1012,949],{},[28,1014,1015],{},"extras",[93,1017,1019],{"id":1018},"_25-filename-rules","2.5 Filename rules",[63,1021,1026],{"className":1022,"code":1024,"language":1025},[1023],"language-text","{baseDir}\u002F{LogPath}\u002F{yyyyMMdd}\u002F{QuotePath}\u002F{Bucket}_{Symbol}_Quote.{ext}\n","text",[28,1027,1024],{"__ignoreMap":68},[252,1029,1030,1039,1061],{},[255,1031,1032,1035,1036,1038],{},[192,1033,1034],{},"No nested subdirectories",": ",[28,1037,481],{}," becomes a filename prefix, not a folder.",[255,1040,1041,1044,1045,1048,1049,854,1051,1053,1054,231,1057,1060],{},[192,1042,1043],{},"Auto-sanitization",": file-system-invalid characters (",[28,1046,1047],{},"\u002F \\ : * ? \" \u003C > |",") in ",[28,1050,477],{},[28,1052,481],{}," are replaced with ",[28,1055,1056],{},"-",[192,1058,1059],{},"in the filename only",". The original strings are preserved in the file content.",[255,1062,1063,1064,1067,1068,35],{},"Day rollover, LRU eviction, and size-based splitting (",[28,1065,1066],{},"_part2_Quote.{ext}"," etc.) all work the same as the main logger but with their own independent ",[28,1069,1070],{},"QuoteFileStreamPool",[44,1072],{},[47,1074,1076,1077,1079],{"id":1075},"_3-loglevel-enum","3. ",[28,1078,102],{}," enum",[63,1081,1083],{"className":65,"code":1082,"language":67,"meta":68,"style":68},"public enum LogLevel\n{\n    Trace      = 0,\n    Debug      = 1,\n    Info       = 2,\n    Warn       = 3,\n    Error      = 4,\n    Fatal      = 5,\n    CustomName = 99,   \u002F\u002F used internally by LOG.CustomName_Log(...)\n}\n",[28,1084,1085,1090,1094,1099,1104,1109,1114,1119,1124,1129],{"__ignoreMap":68},[72,1086,1087],{"class":74,"line":75},[72,1088,1089],{},"public enum LogLevel\n",[72,1091,1092],{"class":74,"line":81},[72,1093,689],{},[72,1095,1096],{"class":74,"line":88},[72,1097,1098],{},"    Trace      = 0,\n",[72,1100,1101],{"class":74,"line":128},[72,1102,1103],{},"    Debug      = 1,\n",[72,1105,1106],{"class":74,"line":134},[72,1107,1108],{},"    Info       = 2,\n",[72,1110,1111],{"class":74,"line":140},[72,1112,1113],{},"    Warn       = 3,\n",[72,1115,1116],{"class":74,"line":145},[72,1117,1118],{},"    Error      = 4,\n",[72,1120,1121],{"class":74,"line":151},[72,1122,1123],{},"    Fatal      = 5,\n",[72,1125,1126],{"class":74,"line":157},[72,1127,1128],{},"    CustomName = 99,   \u002F\u002F used internally by LOG.CustomName_Log(...)\n",[72,1130,1131],{"class":74,"line":162},[72,1132,782],{},[15,1134,1135],{},[18,1136,1137,1138,1141,1142,1145,1146,1149],{},"v3.0 renamed ",[28,1139,1140],{},"CostomName"," → ",[28,1143,1144],{},"CustomName"," (typo fix, breaking change). ",[28,1147,1148],{},"LOG.CustomName_Log(...)"," method was always spelled correctly.",[44,1151],{},[47,1153,1155,1156,1159],{"id":1154},"_4-logoutputformat-enum-v31","4. ",[28,1157,1158],{},"LogOutputFormat"," enum (v3.1+)",[18,1161,1162,1163,1166,1167,35],{},"Selects the ",[192,1164,1165],{},"main logger"," output format. Set via ",[28,1168,1169],{},"LogOptions.OutputFormat",[63,1171,1173],{"className":65,"code":1172,"language":67,"meta":68,"style":68},"public enum LogOutputFormat\n{\n    Txt  = 0,   \u002F\u002F human-readable text, .txt extension (default)\n    Log  = 1,   \u002F\u002F same content as Txt, .log extension\n    Json = 2,   \u002F\u002F NDJSON (one JSON object per line), .json extension\n}\n",[28,1174,1175,1180,1184,1189,1194,1199],{"__ignoreMap":68},[72,1176,1177],{"class":74,"line":75},[72,1178,1179],{},"public enum LogOutputFormat\n",[72,1181,1182],{"class":74,"line":81},[72,1183,689],{},[72,1185,1186],{"class":74,"line":88},[72,1187,1188],{},"    Txt  = 0,   \u002F\u002F human-readable text, .txt extension (default)\n",[72,1190,1191],{"class":74,"line":128},[72,1192,1193],{},"    Log  = 1,   \u002F\u002F same content as Txt, .log extension\n",[72,1195,1196],{"class":74,"line":134},[72,1197,1198],{},"    Json = 2,   \u002F\u002F NDJSON (one JSON object per line), .json extension\n",[72,1200,1201],{"class":74,"line":140},[72,1202,782],{},[93,1204,1206],{"id":1205},"_41-json-format-schema-ndjson","4.1 Json format schema (NDJSON)",[63,1208,1212],{"className":1209,"code":1210,"language":1211,"meta":68,"style":68},"language-json shiki shiki-themes github-light","{\"ts\":1715587425123,\"lv\":\"Info\",\"nm\":\"\",\"tid\":12,\"tn\":\"MainThread\",\"msg\":\"hello\",\"data\":{...}}\n","json",[28,1213,1214],{"__ignoreMap":68},[72,1215,1216,1220,1224,1226,1229,1232,1235,1237,1241,1243,1246,1248,1251,1253,1256,1258,1261,1263,1266,1268,1271,1273,1276,1278,1281,1283,1286,1289,1293],{"class":74,"line":75},[72,1217,1219],{"class":1218},"sgsFI","{",[72,1221,1223],{"class":1222},"sYu0t","\"ts\"",[72,1225,792],{"class":1218},[72,1227,1228],{"class":1222},"1715587425123",[72,1230,1231],{"class":1218},",",[72,1233,1234],{"class":1222},"\"lv\"",[72,1236,792],{"class":1218},[72,1238,1240],{"class":1239},"sYBdl","\"Info\"",[72,1242,1231],{"class":1218},[72,1244,1245],{"class":1222},"\"nm\"",[72,1247,792],{"class":1218},[72,1249,1250],{"class":1239},"\"\"",[72,1252,1231],{"class":1218},[72,1254,1255],{"class":1222},"\"tid\"",[72,1257,792],{"class":1218},[72,1259,1260],{"class":1222},"12",[72,1262,1231],{"class":1218},[72,1264,1265],{"class":1222},"\"tn\"",[72,1267,792],{"class":1218},[72,1269,1270],{"class":1239},"\"MainThread\"",[72,1272,1231],{"class":1218},[72,1274,1275],{"class":1222},"\"msg\"",[72,1277,792],{"class":1218},[72,1279,1280],{"class":1239},"\"hello\"",[72,1282,1231],{"class":1218},[72,1284,1285],{"class":1222},"\"data\"",[72,1287,1288],{"class":1218},":{",[72,1290,1292],{"class":1291},"sB1qb","...",[72,1294,1295],{"class":1218},"}}\n",[794,1297,1298,1314],{},[797,1299,1300],{},[800,1301,1302,1305,1308,1311],{},[803,1303,1304],{},"Field",[803,1306,1307],{},"Type",[803,1309,1310],{},"Always present?",[803,1312,1313],{},"Meaning",[814,1315,1316,1334,1370,1386,1410,1435,1451],{},[800,1317,1318,1322,1328,1331],{},[819,1319,1320],{},[28,1321,975],{},[819,1323,1324,1327],{},[28,1325,1326],{},"long"," (epoch_ms)",[819,1329,1330],{},"yes",[819,1332,1333],{},"event timestamp in milliseconds since Unix epoch",[800,1335,1336,1341,1346,1348],{},[819,1337,1338],{},[28,1339,1340],{},"lv",[819,1342,1343],{},[28,1344,1345],{},"string",[819,1347,1330],{},[819,1349,1350,854,1353,854,1356,854,1358,854,1361,854,1364,854,1367],{},[28,1351,1352],{},"\"Trace\"",[28,1354,1355],{},"\"Debug\"",[28,1357,1240],{},[28,1359,1360],{},"\"Warn\"",[28,1362,1363],{},"\"Error\"",[28,1365,1366],{},"\"Fatal\"",[28,1368,1369],{},"\"CustomName\"",[800,1371,1372,1377,1381,1383],{},[819,1373,1374],{},[28,1375,1376],{},"nm",[819,1378,1379],{},[28,1380,1345],{},[819,1382,1330],{},[819,1384,1385],{},"log name (CustomName value, or empty for level-based logs)",[800,1387,1388,1393,1398,1404],{},[819,1389,1390],{},[28,1391,1392],{},"tid",[819,1394,1395],{},[28,1396,1397],{},"int",[819,1399,1400,1401],{},"iff ",[28,1402,1403],{},"ShowThreadId=true",[819,1405,1406,1407],{},"calling thread's ",[28,1408,1409],{},"ManagedThreadId",[800,1411,1412,1417,1421,1430],{},[819,1413,1414],{},[28,1415,1416],{},"tn",[819,1418,1419],{},[28,1420,1345],{},[819,1422,1400,1423,1426,1427],{},[28,1424,1425],{},"ShowThreadName=true"," AND ",[28,1428,1429],{},"Thread.Name != null",[819,1431,1406,1432],{},[28,1433,1434],{},"Thread.Name",[800,1436,1437,1442,1446,1448],{},[819,1438,1439],{},[28,1440,1441],{},"msg",[819,1443,1444],{},[28,1445,1345],{},[819,1447,1330],{},[819,1449,1450],{},"message text (always emitted even if empty)",[800,1452,1453,1458,1461,1464],{},[819,1454,1455],{},[28,1456,1457],{},"data",[819,1459,1460],{},"object",[819,1462,1463],{},"iff present",[819,1465,1466],{},"parsed JSON of the object-overload payload (Exception or arbitrary object)",[44,1468],{},[47,1470,1472,1473,1159],{"id":1471},"_5-quoteoutputformat-enum-v31","5. ",[28,1474,1475],{},"QuoteOutputFormat",[18,1477,1162,1478,1166,1481,35],{},[192,1479,1480],{},"Quote pipeline",[28,1482,1483],{},"LogOptions.QuoteOptions.OutputFormat",[63,1485,1487],{"className":65,"code":1486,"language":67,"meta":68,"style":68},"public enum QuoteOutputFormat\n{\n    Txt  = 0,   \u002F\u002F human-readable key=value, .txt extension (default)\n    Log  = 1,   \u002F\u002F same content as Txt, .log extension\n    Json = 2,   \u002F\u002F NDJSON, .json extension\n}\n",[28,1488,1489,1494,1498,1503,1507,1512],{"__ignoreMap":68},[72,1490,1491],{"class":74,"line":75},[72,1492,1493],{},"public enum QuoteOutputFormat\n",[72,1495,1496],{"class":74,"line":81},[72,1497,689],{},[72,1499,1500],{"class":74,"line":88},[72,1501,1502],{},"    Txt  = 0,   \u002F\u002F human-readable key=value, .txt extension (default)\n",[72,1504,1505],{"class":74,"line":128},[72,1506,1193],{},[72,1508,1509],{"class":74,"line":134},[72,1510,1511],{},"    Json = 2,   \u002F\u002F NDJSON, .json extension\n",[72,1513,1514],{"class":74,"line":140},[72,1515,782],{},[93,1517,1519],{"id":1518},"_51-txt-log-format","5.1 Txt \u002F Log format",[63,1521,1524],{"className":1522,"code":1523,"language":1025},[1023],"[2026-05-13 10:23:45.123] binance_spot BTCUSDT last=60123.5 bid=60123.0 ask=60124.0 bidQty=0.5 askQty=1.2\n",[28,1525,1523],{"__ignoreMap":68},[252,1527,1528,1531,1534],{},[255,1529,1530],{},"ISO 8601 timestamp prefix (human-readable)",[255,1532,1533],{},"Null optional fields are skipped (variable line length)",[255,1535,1536,1538,1539,1542],{},[28,1537,487],{}," dictionary entries are appended as more ",[28,1540,1541],{},"k=v"," pairs",[93,1544,1546],{"id":1545},"_52-json-format-ndjson","5.2 Json format (NDJSON)",[63,1548,1550],{"className":1209,"code":1549,"language":1211,"meta":68,"style":68},"{\"ts\":1715587425123,\"symbol\":\"BTCUSDT\",\"bucket\":\"binance_spot\",\"last\":60123.5,\"bid\":60123.0,\"ask\":60124.0,\"extras\":{\"funding\":0.0001}}\n",[28,1551,1552],{"__ignoreMap":68},[72,1553,1554,1556,1558,1560,1562,1564,1567,1569,1572,1574,1577,1579,1582,1584,1587,1589,1592,1594,1597,1599,1602,1604,1607,1609,1612,1614,1617,1619,1622,1624,1627],{"class":74,"line":75},[72,1555,1219],{"class":1218},[72,1557,1223],{"class":1222},[72,1559,792],{"class":1218},[72,1561,1228],{"class":1222},[72,1563,1231],{"class":1218},[72,1565,1566],{"class":1222},"\"symbol\"",[72,1568,792],{"class":1218},[72,1570,1571],{"class":1239},"\"BTCUSDT\"",[72,1573,1231],{"class":1218},[72,1575,1576],{"class":1222},"\"bucket\"",[72,1578,792],{"class":1218},[72,1580,1581],{"class":1239},"\"binance_spot\"",[72,1583,1231],{"class":1218},[72,1585,1586],{"class":1222},"\"last\"",[72,1588,792],{"class":1218},[72,1590,1591],{"class":1222},"60123.5",[72,1593,1231],{"class":1218},[72,1595,1596],{"class":1222},"\"bid\"",[72,1598,792],{"class":1218},[72,1600,1601],{"class":1222},"60123.0",[72,1603,1231],{"class":1218},[72,1605,1606],{"class":1222},"\"ask\"",[72,1608,792],{"class":1218},[72,1610,1611],{"class":1222},"60124.0",[72,1613,1231],{"class":1218},[72,1615,1616],{"class":1222},"\"extras\"",[72,1618,1288],{"class":1218},[72,1620,1621],{"class":1222},"\"funding\"",[72,1623,792],{"class":1218},[72,1625,1626],{"class":1222},"0.0001",[72,1628,1295],{"class":1218},[252,1630,1631,1636,1639,1647],{},[255,1632,1633,1635],{},[28,1634,975],{}," = epoch_ms (consistent with main logger)",[255,1637,1638],{},"Only non-null fields are emitted",[255,1640,1641,1643,1644,1646],{},[28,1642,487],{}," is nested under ",[28,1645,1616],{}," (not flattened into top level) — keeps a clean schema boundary",[255,1648,1649,1650,1653,1654,854,1656,1658],{},"Quote NDJSON ",[192,1651,1652],{},"never"," includes ",[28,1655,1392],{},[28,1657,1416],{}," (Quote represents market events, not program-internal events)",[44,1660],{},[47,1662,1664],{"id":1663},"_6-read-only-configuration-view","6. Read-only configuration view",[63,1666,1668],{"className":65,"code":1667,"language":67,"meta":68,"style":68},"LogConfiguration.ILogOptions current = LOG.GetCurrentOptions();\nConsole.WriteLine(current.OutputFormat);             \u002F\u002F LogOutputFormat\nConsole.WriteLine(current.TimeFormat);               \u002F\u002F \"HH:mm:ss.fff\" etc.\nConsole.WriteLine(current.HighPrecisionTimestamp);   \u002F\u002F bool\nConsole.WriteLine(current.QuoteOptions.Enable);      \u002F\u002F bool\n",[28,1669,1670,1675,1680,1685,1690],{"__ignoreMap":68},[72,1671,1672],{"class":74,"line":75},[72,1673,1674],{},"LogConfiguration.ILogOptions current = LOG.GetCurrentOptions();\n",[72,1676,1677],{"class":74,"line":81},[72,1678,1679],{},"Console.WriteLine(current.OutputFormat);             \u002F\u002F LogOutputFormat\n",[72,1681,1682],{"class":74,"line":88},[72,1683,1684],{},"Console.WriteLine(current.TimeFormat);               \u002F\u002F \"HH:mm:ss.fff\" etc.\n",[72,1686,1687],{"class":74,"line":128},[72,1688,1689],{},"Console.WriteLine(current.HighPrecisionTimestamp);   \u002F\u002F bool\n",[72,1691,1692],{"class":74,"line":134},[72,1693,1694],{},"Console.WriteLine(current.QuoteOptions.Enable);      \u002F\u002F bool\n",[18,1696,1697,1698,1702],{},"See ",[22,1699,1701],{"href":1700},".\u002Fconfiguration","Configuration"," for the full list of properties.",[44,1704],{},[47,1706,1708,1709,501],{"id":1707},"_7-exception-serialization-serializableexceptioninfo","7. Exception serialization (",[28,1710,1711],{},"SerializableExceptionInfo",[18,1713,1714,1715,1718,1719,1721,1722,854,1725,854,1728,1731],{},"When you log an ",[28,1716,1717],{},"Exception"," at ",[28,1720,208],{}," level or higher via ",[28,1723,1724],{},"Warn_Log\u003CT>(ex)",[28,1726,1727],{},"Error_Log\u003CT>(ex)",[28,1729,1730],{},"Fatal_Log\u003CT>(ex)",", the runtime expands it into:",[63,1733,1735],{"className":65,"code":1734,"language":67,"meta":68,"style":68},"class SerializableExceptionInfo\n{\n    string Type;          \u002F\u002F ex.GetType().FullName\n    string Message;\n    string Source;\n    string HelpLink;\n    string StackTrace;\n    Dictionary\u003Cstring, string> Data;             \u002F\u002F expanded from ex.Data\n    SerializableExceptionInfo InnerException;    \u002F\u002F recursive\n    Dictionary\u003Cstring, string> AdditionalProperties;  \u002F\u002F reflected non-standard props\n}\n",[28,1736,1737,1742,1746,1751,1756,1761,1766,1771,1776,1781,1786],{"__ignoreMap":68},[72,1738,1739],{"class":74,"line":75},[72,1740,1741],{},"class SerializableExceptionInfo\n",[72,1743,1744],{"class":74,"line":81},[72,1745,689],{},[72,1747,1748],{"class":74,"line":88},[72,1749,1750],{},"    string Type;          \u002F\u002F ex.GetType().FullName\n",[72,1752,1753],{"class":74,"line":128},[72,1754,1755],{},"    string Message;\n",[72,1757,1758],{"class":74,"line":134},[72,1759,1760],{},"    string Source;\n",[72,1762,1763],{"class":74,"line":140},[72,1764,1765],{},"    string HelpLink;\n",[72,1767,1768],{"class":74,"line":145},[72,1769,1770],{},"    string StackTrace;\n",[72,1772,1773],{"class":74,"line":151},[72,1774,1775],{},"    Dictionary\u003Cstring, string> Data;             \u002F\u002F expanded from ex.Data\n",[72,1777,1778],{"class":74,"line":157},[72,1779,1780],{},"    SerializableExceptionInfo InnerException;    \u002F\u002F recursive\n",[72,1782,1783],{"class":74,"line":162},[72,1784,1785],{},"    Dictionary\u003Cstring, string> AdditionalProperties;  \u002F\u002F reflected non-standard props\n",[72,1787,1788],{"class":74,"line":168},[72,1789,782],{},[18,1791,1792,1793,1795],{},"The result is JSON-serialized into the log line (or the ",[28,1794,1457],{}," field in Json output mode).",[44,1797],{},[47,1799,1801],{"id":1800},"_8-versioning-notes","8. Versioning notes",[252,1803,1804,1811,1821],{},[255,1805,1806,1807,1810],{},"v3.1 additions are ",[192,1808,1809],{},"strictly additive"," — no public API was removed or renamed.",[255,1812,1813,1814,1816,1817,1820],{},"All new options on ",[28,1815,401],{}," and the new ",[28,1818,1819],{},"QuoteOptions"," default to v3.0 behavior — existing code continues to work unchanged.",[255,1822,1823,1824,1827,1828,202,1831,202,1834,202,1837,202,1840,202,1843,1845,1846,1849,1850,1852],{},"The new ",[28,1825,1826],{},"ILogOptions"," interface members (",[28,1829,1830],{},"OutputFormat",[28,1832,1833],{},"TimeFormat",[28,1835,1836],{},"ShowThreadId",[28,1838,1839],{},"ShowThreadName",[28,1841,1842],{},"HighPrecisionTimestamp",[28,1844,1819],{},") are ",[192,1847,1848],{},"read-only","; library consumers normally only read ",[28,1851,385],{},", so this is not a breaking change for typical use.",[1854,1855,1856],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sB1qb, html code.shiki .sB1qb{--shiki-default:#B31D28;--shiki-default-font-style:italic}",{"title":68,"searchDepth":81,"depth":88,"links":1858},[1859,1872,1881,1883,1887,1892,1893,1895],{"id":49,"depth":81,"text":1860,"children":1861},"1. LOG static class",[1862,1866,1868,1870],{"id":95,"depth":88,"text":96,"children":1863},[1864,1865],{"id":220,"depth":128,"text":221},{"id":249,"depth":128,"text":250},{"id":297,"depth":88,"text":1867},"1.2 CustomName_Log — per-bucket file",{"id":350,"depth":88,"text":1869},"1.3 LOG.Configure(...) — one-time configuration",{"id":381,"depth":88,"text":1871},"1.4 LOG.GetCurrentOptions() — read-only config view",{"id":407,"depth":81,"text":1873,"children":1874},"2. LOG.Quote(...) — Quote pipeline (v3.1+)",[1875,1876,1877,1879,1880],{"id":449,"depth":88,"text":450},{"id":504,"depth":88,"text":505},{"id":667,"depth":88,"text":1878},"2.3 QuoteRecord (public readonly struct)",{"id":955,"depth":88,"text":956},{"id":1018,"depth":88,"text":1019},{"id":1075,"depth":81,"text":1882},"3. LogLevel enum",{"id":1154,"depth":81,"text":1884,"children":1885},"4. LogOutputFormat enum (v3.1+)",[1886],{"id":1205,"depth":88,"text":1206},{"id":1471,"depth":81,"text":1888,"children":1889},"5. QuoteOutputFormat enum (v3.1+)",[1890,1891],{"id":1518,"depth":88,"text":1519},{"id":1545,"depth":88,"text":1546},{"id":1663,"depth":81,"text":1664},{"id":1707,"depth":81,"text":1894},"7. Exception serialization (SerializableExceptionInfo)",{"id":1800,"depth":81,"text":1801},"Complete public API of OzaLog v3.1 — LOG static class, LogOptions, QuoteRecord, enums.","md",{},"\u002Fen\u002Fapi",{"title":6,"description":1896},"en\u002Fapi","bgEZPEmsD3nhGxys5pGzX99N_rLSY8jSrTeJzvmGG3A",{"matched":1904,"target":1899,"all":1905},"path()",null,1778734455471]