From 2498b1ba0c1933d58da136b34ad8faccd87076c8 Mon Sep 17 00:00:00 2001 From: huochenghai Date: Tue, 5 Mar 2024 12:01:46 +0800 Subject: [PATCH 1/6] add Razor.Templating.Core (#1169) * add extract constrains * refactor buffer schedule * add Razor.Templating.Core * reorder SwapBinaryArgs * Apply code-format changes * Update NuGet.Config --------- Co-authored-by: zhengqihang <597323109@qq.com> Co-authored-by: xhuohai Co-authored-by: sunnycase --- NuGet.Config | 2 - .../Nncase.Modules.StackVM/packages.lock.json | 9 +- src/Nncase.Cli/Program.cs | 2 +- src/Nncase.Cli/packages.lock.json | 9 +- src/Nncase.CodeGen/Nncase.CodeGen.csproj | 1 + src/Nncase.CodeGen/packages.lock.json | 6 + src/Nncase.Compiler/Compiler.cs | 2 +- src/Nncase.Compiler/packages.lock.json | 9 +- src/Nncase.Core/TIR/TIRUtilities.cs | 17 ++ src/Nncase.Core/Utilities/ShapeExprUtility.cs | 1 - .../CostModel/EGraphCostPrinter.cs | 47 +++- src/Nncase.EGraph/Passes/EGraphExtensions.cs | 50 +++++ .../Passes/EGraphExtractExtensions.cs | 95 --------- .../SatExtractor.cs => EGraphExtractor.cs} | 17 +- .../Passes/EGraphExtractors/Extractor.cs | 200 ------------------ src/Nncase.EGraph/Passes/RewriteProvider.cs | 2 +- .../BufferSchedule/BufferScheduleTypes.cs | 46 ++-- .../BufferSchedule/BufferScheduler.cs | 118 +++++------ .../BufferSchedule/LifeTimeCollector.cs | 73 ++++--- src/Nncase.Passes/DDrBufferSchdeulePass.cs | 3 +- src/Nncase.Passes/EGraphExtractPass.cs | 2 +- src/Nncase.Studio/packages.lock.json | 9 +- src/Nncase.Targets/packages.lock.json | 9 +- .../packages.lock.json | 9 +- .../CostModel/UnitTestEGraphCostModel.cs | 4 +- src/Nncase.Tests/packages.lock.json | 9 +- 26 files changed, 297 insertions(+), 454 deletions(-) create mode 100644 src/Nncase.EGraph/Passes/EGraphExtensions.cs delete mode 100644 src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs rename src/Nncase.EGraph/Passes/{EGraphExtractors/SatExtractor.cs => EGraphExtractor.cs} (94%) delete mode 100644 src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs diff --git a/NuGet.Config b/NuGet.Config index 5e7849eab..fd11e2a06 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -2,13 +2,11 @@ - - diff --git a/modules/Nncase.Modules.StackVM/packages.lock.json b/modules/Nncase.Modules.StackVM/packages.lock.json index 4830d0bbf..8820c0523 100644 --- a/modules/Nncase.Modules.StackVM/packages.lock.json +++ b/modules/Nncase.Modules.StackVM/packages.lock.json @@ -121,7 +121,8 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )" + "Nncase.IO": "[1.0.0, )", + "Razor.Templating.Core": "[1.9.0, )" } }, "nncase.core": { @@ -266,6 +267,12 @@ "libortki": "0.0.2" } }, + "Razor.Templating.Core": { + "type": "CentralTransitive", + "requested": "[1.9.0, )", + "resolved": "1.9.0", + "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" + }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.Cli/Program.cs b/src/Nncase.Cli/Program.cs index 0ef25c056..4938227c7 100644 --- a/src/Nncase.Cli/Program.cs +++ b/src/Nncase.Cli/Program.cs @@ -179,7 +179,7 @@ private static void ConfigureHost(IHostBuilder hostBuilder) private static void ConfigureAppConfiguration(HostBuilderContext context, IConfigurationBuilder builder) { var baseDirectory = Path.GetDirectoryName(typeof(Program).Assembly.Location); - builder.SetBasePath(baseDirectory) + builder.SetBasePath(baseDirectory!) .AddJsonFile("config.json", true, false); } } diff --git a/src/Nncase.Cli/packages.lock.json b/src/Nncase.Cli/packages.lock.json index 56eaafb11..69a847ef0 100644 --- a/src/Nncase.Cli/packages.lock.json +++ b/src/Nncase.Cli/packages.lock.json @@ -664,7 +664,8 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )" + "Nncase.IO": "[1.0.0, )", + "Razor.Templating.Core": "[1.9.0, )" } }, "nncase.compiler": { @@ -932,6 +933,12 @@ "libortki": "0.0.2" } }, + "Razor.Templating.Core": { + "type": "CentralTransitive", + "requested": "[1.9.0, )", + "resolved": "1.9.0", + "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" + }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.CodeGen/Nncase.CodeGen.csproj b/src/Nncase.CodeGen/Nncase.CodeGen.csproj index a4e6d0ecd..a22aa4760 100644 --- a/src/Nncase.CodeGen/Nncase.CodeGen.csproj +++ b/src/Nncase.CodeGen/Nncase.CodeGen.csproj @@ -8,6 +8,7 @@ + diff --git a/src/Nncase.CodeGen/packages.lock.json b/src/Nncase.CodeGen/packages.lock.json index fd39ebd2f..b42e1ecfa 100644 --- a/src/Nncase.CodeGen/packages.lock.json +++ b/src/Nncase.CodeGen/packages.lock.json @@ -8,6 +8,12 @@ "resolved": "1.2.12", "contentHash": "D4mn5Cab4ztPLJ0V8uMErDrO/Y61098nwrvyIOLZymVAYOQcwP1vomVWKbTagf1aPU3cX5Q7adZtQEQwOy6XEg==" }, + "Razor.Templating.Core": { + "type": "Direct", + "requested": "[1.9.0, )", + "resolved": "1.9.0", + "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" + }, "StyleCop.Analyzers": { "type": "Direct", "requested": "[1.2.0-beta.435, )", diff --git a/src/Nncase.Compiler/Compiler.cs b/src/Nncase.Compiler/Compiler.cs index 3d83a6b0b..c21b7247d 100644 --- a/src/Nncase.Compiler/Compiler.cs +++ b/src/Nncase.Compiler/Compiler.cs @@ -100,7 +100,6 @@ public void TargetIndependentPass(IPassManager passManager) p.Add(); p.Add(); p.Add(); - p.Add(); p.Add(); p.Add(); p.Add(); @@ -141,6 +140,7 @@ public void TargetIndependentPass(IPassManager passManager) p.Add(); p.Add(); p.Add(); + p.Add(); p.Add(); }); diff --git a/src/Nncase.Compiler/packages.lock.json b/src/Nncase.Compiler/packages.lock.json index f22a60614..214f5c927 100644 --- a/src/Nncase.Compiler/packages.lock.json +++ b/src/Nncase.Compiler/packages.lock.json @@ -661,7 +661,8 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )" + "Nncase.IO": "[1.0.0, )", + "Razor.Templating.Core": "[1.9.0, )" } }, "nncase.core": { @@ -880,6 +881,12 @@ "libortki": "0.0.2" } }, + "Razor.Templating.Core": { + "type": "CentralTransitive", + "requested": "[1.9.0, )", + "resolved": "1.9.0", + "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" + }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.Core/TIR/TIRUtilities.cs b/src/Nncase.Core/TIR/TIRUtilities.cs index 6a1142e71..6dcad9ad1 100644 --- a/src/Nncase.Core/TIR/TIRUtilities.cs +++ b/src/Nncase.Core/TIR/TIRUtilities.cs @@ -71,4 +71,21 @@ public static class TIRUtilities IR.F.Math.Max(0, t.First.Start), IR.F.Math.Min(t.Second.FixedValue, t.First.Stop), t.First.Step)).ToArray(); + + public static bool TryGetFixedRegions(TIR.BufferRegion region, out (int Start, int Stop, int Step)[] slice) + { + slice = new (int Start, int Stop, int Step)[region.Region.Length]; + for (int i = 0; i < region.Region.Length; i++) + { + var rg = region.Region[i]; + if (rg is not Range { Start: IR.TensorConst start, Stop: IR.TensorConst stop, Step: IR.TensorConst step }) + { + return false; + } + + slice[i] = (start.Value.ToScalar(), stop.Value.ToScalar(), step.Value.ToScalar()); + } + + return true; + } } diff --git a/src/Nncase.Core/Utilities/ShapeExprUtility.cs b/src/Nncase.Core/Utilities/ShapeExprUtility.cs index c1da04dca..9c73513cf 100644 --- a/src/Nncase.Core/Utilities/ShapeExprUtility.cs +++ b/src/Nncase.Core/Utilities/ShapeExprUtility.cs @@ -1,7 +1,6 @@ // Copyright (c) Canaan Inc. All rights reserved. // Licensed under the Apache license. See LICENSE file in the project root for full license information. -using GiGraph.Dot.Output.Writers.Edges; using Nncase.Diagnostics; using Nncase.IR; using Nncase.IR.Tensors; diff --git a/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs b/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs index c8f3bd5c3..ac2d1c1ca 100644 --- a/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs +++ b/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs @@ -32,6 +32,25 @@ internal static DotGraph DumpEgraphAsDot(IEGraph eGraph, CostModel.EGraphCostMod return printer.SaveToStream(file); } + /// + /// find the minCostEnode in eclass. + /// + /// the marker first. + /// + /// + internal static ENode MinByWithMarker(EClass eClass, CostModel.EGraphCostModel costModel) + { + return eClass.Nodes.OrderBy(e => e.Expr, ENodeTypeComparer.Instance).MinBy(x => x.Expr is Marker ? CostModel.Cost.Zero : costModel[x])!; + } + + /// + /// find the minCostEnode in eclass skip marker. + /// + internal static ENode MinByWithOutMarker(EClass eClass, CostModel.EGraphCostModel costModel) + { + return eClass.Nodes.Where(e => e.Expr is not Marker).MinBy(x => costModel[x])!; + } + private DotGraph AttachEGraphCost(CostModel.EGraphCostModel costModel, EClass entry) { // 1. display each enode costs. @@ -72,12 +91,12 @@ void Dfs(EClass curclass) continue; } - var minCostEnode = parent.MinByWithMarker(costModel); + var minCostEnode = MinByWithMarker(parent, costModel); // when this marker ecalss has been visited, skip it. if (markerEclassMemo.Contains(parent)) { - minCostEnode = parent.MinByWithOutMarker(costModel); + minCostEnode = MinByWithOutMarker(parent, costModel); } var (minCostDotnode, table) = NodesMap[minCostEnode]; @@ -93,7 +112,7 @@ void Dfs(EClass curclass) if (minCostEnode.Expr is Marker && child == parent) { markerEclassMemo.Add(child); - var otherminCostENode = child.MinByWithOutMarker(costModel); + var otherminCostENode = MinByWithOutMarker(child, costModel); var (childDotNode, _) = NodesMap[otherminCostENode]; _dotGraph.Edges.Add(childDotNode, minCostDotnode, edge => { @@ -103,7 +122,7 @@ void Dfs(EClass curclass) } else { - var childEnode = child.Find().MinByWithMarker(costModel); + var childEnode = MinByWithMarker(child.Find(), costModel); var (childDotNode, _) = NodesMap[childEnode]; _dotGraph.Edges.Add(childDotNode, minCostDotnode, edge => { @@ -126,3 +145,23 @@ void Dfs(EClass curclass) return _dotGraph; } } + +internal sealed class ENodeTypeComparer : IComparer +{ + public static readonly ENodeTypeComparer Instance = new(); + + public int Compare(Expr? x, Expr? y) => (x, y) switch + { + (null, null) => 0, + (Expr, null) => 1, + (null, Expr) => -1, + (Expr, Expr) => GetPriority(x).CompareTo(GetPriority(y)), + }; + + private int GetPriority(Expr x) => x switch + { + Marker => 0, + Const => 1, + _ => 2, + }; +} diff --git a/src/Nncase.EGraph/Passes/EGraphExtensions.cs b/src/Nncase.EGraph/Passes/EGraphExtensions.cs new file mode 100644 index 000000000..5a349cec4 --- /dev/null +++ b/src/Nncase.EGraph/Passes/EGraphExtensions.cs @@ -0,0 +1,50 @@ +// Copyright (c) Canaan Inc. All rights reserved. +// Licensed under the Apache license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Google.OrTools.Sat; +using Nncase.CostModel; +using Nncase.Diagnostics; +using Nncase.IR; +using Nncase.PatternMatch; +using static Nncase.PatternMatch.F.Math; +using static Nncase.PatternMatch.Utility; + +namespace Nncase.Passes; + +/// +/// EGraph extract extensions. +/// +public static class EGraphExtensions +{ + /// + /// Extract egraph. + /// + /// egraph. + /// Root eclass. + /// base func cost evaluator. + /// the cp model constrains. + public static Expr Extract(this IEGraph eGraph, EClass root, Evaluator.IBaseFuncCostEvaluator? basefunc_cost_evaluator, EGraphExtractConstrains[] constrains) + { + // 1. set enode expr with more accuracy type. + foreach (var eclass in eGraph.Classes) + { + foreach (var nodes in eclass.Nodes) + { + if (eclass.CheckedType.CompareTo(nodes.Expr.CheckedType) > 0) + { + nodes.Expr.CheckedType = eclass.CheckedType; + } + } + } + + // 2. start the cost evaluator + var costModel = new CostModel.EGraphCostEvaluator(root.Find(), basefunc_cost_evaluator, false).Evaluate(); + + return new EGraphExtractor(costModel).Extract(root.Find(), eGraph, constrains); + } +} diff --git a/src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs b/src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs deleted file mode 100644 index 7c0cfbdc2..000000000 --- a/src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) Canaan Inc. All rights reserved. -// Licensed under the Apache license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Nncase.CostModel; -using Nncase.Diagnostics; -using Nncase.IR; -using Nncase.PatternMatch; -using static Nncase.PatternMatch.F.Math; -using static Nncase.PatternMatch.Utility; - -namespace Nncase.Passes; - -/// -/// EGraph extract extensions. -/// -public static class EGraphExtractExtensions -{ - /// - /// Extract egraph. - /// - /// eGraph. - /// Root eclass. - /// base func cost evaluator. - /// the picks. - /// Extracted root expression. - public static Expr Extract(this IEGraph eGraph, EClass root, Evaluator.IBaseFuncCostEvaluator? basefunc_cost_evaluator, out IReadOnlyDictionary picks) - { - // 1. set enode expr with more accuracy type. - foreach (var eclass in eGraph.Classes) - { - foreach (var nodes in eclass.Nodes) - { - if (eclass.CheckedType.CompareTo(nodes.Expr.CheckedType) > 0) - { - nodes.Expr.CheckedType = eclass.CheckedType; - } - } - } - - // 2. start the cost evaluator - var costModel = new EGraphCostEvaluator(root.Find(), basefunc_cost_evaluator, false).Evaluate(); - - // if (DumpScope.Current.IsEnabled(DumpFlags.EGraphCost)) - // { - // using var fs = DumpScope.Current.OpenFile(Path.Combine("Costs", $"V{eGraph.Version}.dot")); - // EGraphPrinter.DumpEgraphAsDot(eGraph, costModel, root.Find(), fs); - // } - // return new EGraphExtractor(costModel).Extract(root.Find(), eGraph); - return new EGraphExtractors.SatExtractor(costModel).Extract(root.Find(), eGraph, out picks); - } - - /// - /// find the minCostEnode in eclass. - /// - /// the marker first. - /// - /// - internal static ENode MinByWithMarker(this EClass eClass, CostModel.EGraphCostModel costModel) - { - return eClass.Nodes.OrderBy(e => e.Expr, ENodeTypeComparer.Instance).MinBy(x => x.Expr is Marker ? Cost.Zero : costModel[x])!; - } - - /// - /// find the minCostEnode in eclass skip marker. - /// - internal static ENode MinByWithOutMarker(this EClass eClass, CostModel.EGraphCostModel costModel) - { - return eClass.Nodes.Where(e => e.Expr is not Marker).MinBy(x => costModel[x])!; - } - - internal sealed class ENodeTypeComparer : IComparer - { - public static readonly ENodeTypeComparer Instance = new(); - - public int Compare(Expr? x, Expr? y) => (x, y) switch - { - (null, null) => 0, - (Expr, null) => 1, - (null, Expr) => -1, - (Expr, Expr) => GetPriority(x).CompareTo(GetPriority(y)), - }; - - private int GetPriority(Expr x) => x switch - { - Marker => 0, - Const => 1, - _ => 2, - }; - } -} diff --git a/src/Nncase.EGraph/Passes/EGraphExtractors/SatExtractor.cs b/src/Nncase.EGraph/Passes/EGraphExtractor.cs similarity index 94% rename from src/Nncase.EGraph/Passes/EGraphExtractors/SatExtractor.cs rename to src/Nncase.EGraph/Passes/EGraphExtractor.cs index fab2fc05e..c7eba4570 100644 --- a/src/Nncase.EGraph/Passes/EGraphExtractors/SatExtractor.cs +++ b/src/Nncase.EGraph/Passes/EGraphExtractor.cs @@ -11,18 +11,20 @@ using Nncase.Diagnostics; using Nncase.IR; -namespace Nncase.Passes.EGraphExtractors; +namespace Nncase.Passes; -internal class SatExtractor : IExtractor +public delegate void EGraphExtractConstrains(CpModel model, IReadOnlyDictionary vars); + +internal class EGraphExtractor { private readonly EGraphCostModel _costModel; - public SatExtractor(EGraphCostModel costModel) + public EGraphExtractor(EGraphCostModel costModel) { _costModel = costModel; } - public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary picks) + public Expr Extract(EClass root, IEGraph eGraph, EGraphExtractConstrains[] constrains) { var cpmodel = new CpModel(); @@ -68,6 +70,11 @@ public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary vars[n]), eGraph.Nodes.Select(n => checked((long)_costModel[n].Score)))); @@ -121,7 +128,7 @@ public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary e, e => solver.BooleanValue(vars[e])); + var picks = eGraph.Nodes.ToDictionary(e => e, e => solver.BooleanValue(vars[e])); using (var dumpStream = enableDump ? DumpScope.Current.OpenFile("Costs/Pick.dot") : Stream.Null) { EGraphPrinter.DumpEgraphAsDot(eGraph, _costModel, picks, root.Find(), dumpStream); diff --git a/src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs b/src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs deleted file mode 100644 index fcf2abd72..000000000 --- a/src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright (c) Canaan Inc. All rights reserved. -// Licensed under the Apache license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Nncase.CostModel; -using Nncase.Diagnostics; -using Nncase.IR; -using Nncase.PatternMatch; -using static Nncase.PatternMatch.F.Math; -using static Nncase.PatternMatch.Utility; - -namespace Nncase.Passes.EGraphExtractors; - -internal interface IExtractor -{ - Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary picks); -} - -internal class Extractor : IExtractor -{ - private readonly EGraphCostModel _costModel; - private readonly Dictionary _eclassMemo = new(); - private readonly Dictionary _markerEclassMemo = new(); - private readonly Dictionary _picks = new(); - private StreamWriter? _dumpWriter; - - public Extractor(EGraphCostModel costModel) - { - _costModel = costModel; - } - - public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary picks) - { - _dumpWriter = DumpScope.Current.IsEnabled(DumpFlags.EGraphCost) - ? new StreamWriter(DumpScope.Current.OpenFile($"{nameof(Extractor)}_Class_{root.Id}.txt")) - : null; - try - { - Visit(root); - } - finally - { - _dumpWriter?.Dispose(); - } - - foreach (var enode in eGraph.Nodes) - { - if (!_picks.ContainsKey(enode)) - { - _picks[enode] = false; - } - } - - picks = _picks; - return _eclassMemo[root]; - } - - private void Visit(EClass eclass) - { - var stack = new Stack<(EClass, ENode)>(); - stack.Push((eclass, eclass.MinByWithMarker(_costModel))); - var markerEclassSet = new HashSet(); - while (stack.Any()) - { - (eclass, var minCostEnode) = stack.Peek(); - if (_eclassMemo.ContainsKey(eclass)) - { - stack.Pop(); - continue; - } - - Expr? expr = null; - switch (minCostEnode.Expr) - { - case Var or TensorConst or TupleConst or Op or Fusion or None: - expr = minCostEnode.Expr; - break; - case Function or Call or IR.Tuple or Marker or IR.If: - var childrenExprs = new List(); - foreach (var child in minCostEnode.Children) - { - if (!_eclassMemo.TryGetValue(child, out var childExpr)) - { - if (minCostEnode.Expr is Marker && child == eclass) - { - if (!_markerEclassMemo.TryGetValue(eclass, out var markerInputExpr)) - { - markerEclassSet.Add(eclass); - stack.Push((eclass, eclass.MinByWithOutMarker(_costModel))); - } - else - { - childrenExprs.Add(markerInputExpr); - } - } - else - { - stack.Push((child, child.MinByWithMarker(_costModel))); - } - } - else - { - childrenExprs.Add(childExpr); - } - } - - if (childrenExprs.Count != minCostEnode.Children.Count) - { - break; - } - - expr = minCostEnode.Expr switch - { - Function function => Visit(minCostEnode, function, new(childrenExprs)), - Call call => Visit(minCostEnode, call, new(childrenExprs)), - IR.Tuple tuple => Visit(minCostEnode, tuple, new(childrenExprs)), - Marker marker => Visit(minCostEnode, marker, new(childrenExprs)), - IR.If @if => Visit(minCostEnode, @if, new(childrenExprs)), - _ => throw new ArgumentException("Unsupported expression type."), - }; - - break; - default: - throw new ArgumentException("Unsupported expression type."); - } - - if (expr is null) - { - continue; - } - - if (markerEclassSet.Contains(eclass) && minCostEnode.Expr is not Marker) - { - _markerEclassMemo.Add(eclass, expr); - } - else - { - _eclassMemo.Add(eclass, expr); - } - - _picks[minCostEnode] = true; - stack.Pop(); - } - } - - private Marker Visit(ENode enode, Marker marker, IRArray children) - { - var target = children[0]; - var attr = children[1]; - return marker.With(target: target, attribute: attr); - } - - private Function Visit(ENode enode, Function func, IRArray children) - { - if (children.Count == 0) - { - return func; - } - - var body = children[0]; - return func.With(body: body); - } - - private IR.Tuple Visit(ENode enode, IR.Tuple tuple, IRArray children) - { - return tuple.With(fields: children.ToArray()); - } - - private IR.If Visit(ENode enode, IR.If @if, IRArray children) - { - return @if.With(condition: children[^3], then: children[^2], @else: children[^1], paramList: children[..^3].ToArray()); - } - - private Call Visit(ENode enode, Call call, IRArray children) - { - var target = children[0]; - var arguments = children.Skip(1); - - // for mix quant debug. - if (call.EnodeQuantConfigWithCosine != null && _dumpWriter != null) - { - _dumpWriter.WriteLine(call + " " + call.CheckedType); - for (int i = 0; i < call.EnodeQuantConfigWithCosine.Count; i++) - { - for (int j = 0; j < call.EnodeQuantConfigWithCosine[i].Item1.Count; j++) - { - _dumpWriter.Write(call.EnodeQuantConfigWithCosine[i].Item1[j] + " "); - } - - _dumpWriter.WriteLine(call.EnodeQuantConfigWithCosine[i].Item3); - } - } - - return call.With(target: target, arguments: arguments.ToArray(), call.Metadata); - } -} diff --git a/src/Nncase.EGraph/Passes/RewriteProvider.cs b/src/Nncase.EGraph/Passes/RewriteProvider.cs index 07d3416ed..ad64c2207 100644 --- a/src/Nncase.EGraph/Passes/RewriteProvider.cs +++ b/src/Nncase.EGraph/Passes/RewriteProvider.cs @@ -36,7 +36,7 @@ public Expr ERewrite(Expr expr, IEnumerable rules, RunPassContext var graph = new EGraph(expr); ERewrite(graph, rules, options); - var post = graph.Extract(graph.Root!, null, out _); + var post = graph.Extract(graph.Root!, null, Array.Empty()); return post; } diff --git a/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs b/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs index 13e8ab86f..3b76f1673 100644 --- a/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs +++ b/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs @@ -3,54 +3,34 @@ namespace Nncase.Passes.BufferSchedule; -internal sealed class TimeInterval +public sealed class Interval { - public TimeInterval(int start, int end) - { - Brith = start; - Death = end; - } - - public int Brith { get; set; } - - public int Death { get; set; } - - public int Size => Death - Brith; - - public override string ToString() - { - return $"TimeInterval({Brith}, {Death})"; - } -} - -internal sealed class MemSpan -{ - public MemSpan(int start, int end) + public Interval(int start, int end) { Start = start; - End = end; + Stop = end; } public int Start { get; set; } - public int End { get; set; } + public int Stop { get; set; } - public int Size => End - Start; + public int Size => Stop - Start; public override string ToString() { - return $"MemSpan({Start}, {End})"; + return $"Interval({Start}, {Stop})"; } } -internal class ScheduleBuffer +public class ScheduleBuffer { - public ScheduleBuffer(string name, int number, TimeInterval interval, MemSpan span, int[] shape, int[] strides, bool inplace) + public ScheduleBuffer(string name, int number, Interval timeInterval, Interval memInterval, int[] shape, int[] strides, bool inplace) { Name = name; Number = number; - Interval = interval; - Span = span; + TimeInterval = timeInterval; + MemInterval = memInterval; Shape = shape; Strides = strides; Inplace = inplace; @@ -60,9 +40,9 @@ public ScheduleBuffer(string name, int number, TimeInterval interval, MemSpan sp public int Number { get; } - public TimeInterval Interval { get; } + public Interval TimeInterval { get; } - public MemSpan Span { get; } + public Interval MemInterval { get; } public int[] Shape { get; } @@ -72,6 +52,6 @@ public ScheduleBuffer(string name, int number, TimeInterval interval, MemSpan sp public override string ToString() { - return $"ScheduledBuffer('{Name}', {Number}, {Interval}, {Span}, ConstraintsMode.No, [{string.Join(",", Shape)}], [{string.Join(",", Strides)}], {Inplace})"; + return $"ScheduledBuffer('{Name}', {Number}, {TimeInterval}, {MemInterval}, ConstraintsMode.No, [{string.Join(",", Shape)}], [{string.Join(",", Strides)}], {Inplace})"; } } diff --git a/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs b/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs index 25f7d6f5b..8d02aff4e 100644 --- a/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs +++ b/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs @@ -13,12 +13,42 @@ namespace Nncase.Passes.BufferSchedule; -internal sealed class BufferScheduler +public class BufferScheduler { - public IReadOnlyDictionary CollectLifeTime(Function func) + public virtual void ExternalConstrains(CpModel model, IReadOnlyDictionary bufferMap, IReadOnlyDictionary boxs) { - var c = new LifeTimeCollector(); - return c.Collect(func); + foreach (var (expr, item) in bufferMap) + { + if (expr is Call { Target: IR.Tensors.Concat } concatCall && concatCall.Arguments[0] is IR.Tuple tuple) + { + // the concat inputs must contiguous + int offset = 0; + for (int i = 0; i < tuple.Fields.Length; i++) + { + model.Add((boxs[concatCall].Y.StartExpr() + offset) == boxs[tuple.Fields[i]].Y.StartExpr()); + offset += bufferMap[tuple.Fields[i]].MemInterval.Size; + } + } + else if (expr is Call { Target: IR.Tensors.Split } splitCall) + { + // the split must equal with input. + model.Add(boxs[splitCall].Y.StartExpr() == boxs[splitCall.Arguments[0]].Y.StartExpr()); + + // the split outputs must contiguous + var users = splitCall.GetUsers(); + int offset = 0; + foreach (var user in users.OrderBy(e => ((Call)e).Arguments[1].Evaluate().AsTensor().ToScalar())) + { + model.Add((boxs[splitCall].Y.StartExpr() + offset) == boxs[user].Y.StartExpr()); + offset += bufferMap[user].MemInterval.Size; + } + } + else if (expr is Call { Target: IR.Tensors.Reshape } reshapCall) + { + // the reshape must equal with it's input. + model.Add(boxs[reshapCall].Y.StartExpr() == boxs[reshapCall.Arguments[0]].Y.StartExpr()); + } + } } public void Schedule(IReadOnlyDictionary bufferMap) @@ -30,21 +60,21 @@ public void Schedule(IReadOnlyDictionary bufferMap) var yStarts = new List(); foreach (var (expr, item) in bufferMap) { - var xInterval = model.NewIntervalVar(model.NewConstant(item.Interval.Brith), model.NewConstant(item.Interval.Size), model.NewConstant(item.Interval.Death), item.Name + $"{item.Number}_x"); + var xInterval = model.NewIntervalVar(model.NewConstant(item.TimeInterval.Start), model.NewConstant(item.TimeInterval.Size), model.NewConstant(item.TimeInterval.Stop), item.Name + $"{item.Number}_x"); - var upbound = 2147483648 - item.Span.End; + var upbound = 2147483648 - item.MemInterval.Stop; if (upbound <= 0) { throw new System.NotSupportedException(); } var memStartVar = model.NewIntVar(0, upbound, $"{item.Name}_{item.Number}_y_start"); - var yInterval = model.NewFixedSizeIntervalVar(memStartVar, item.Span.End, $"{item.Name}_{item.Number}_y"); + var yInterval = model.NewFixedSizeIntervalVar(memStartVar, item.MemInterval.Stop, $"{item.Name}_{item.Number}_y"); noOverlap.AddRectangle(xInterval, yInterval); yStarts.Add(memStartVar); boxs.Add(expr, (xInterval, yInterval)); - for (int time = item.Interval.Brith; time < item.Interval.Death; time++) + for (int time = item.TimeInterval.Start; time < item.TimeInterval.Stop; time++) { if (!timeMap.TryGetValue(time, out var timelist)) { @@ -56,38 +86,7 @@ public void Schedule(IReadOnlyDictionary bufferMap) } } - foreach (var (expr, item) in bufferMap) - { - if (expr is Call { Target: IR.Tensors.Concat } concatCall && concatCall.Arguments[0] is IR.Tuple tuple) - { - // the concat inputs must contiguous - int offset = 0; - for (int i = 0; i < tuple.Fields.Length; i++) - { - model.Add((boxs[concatCall].Y.StartExpr() + offset) == boxs[tuple.Fields[i]].Y.StartExpr()); - offset += bufferMap[tuple.Fields[i]].Span.Size; - } - } - else if (expr is Call { Target: IR.Tensors.Split } splitCall) - { - // the split must equal with input. - model.Add(boxs[splitCall].Y.StartExpr() == boxs[splitCall.Arguments[0]].Y.StartExpr()); - - // the split outputs must contiguous - var users = splitCall.GetUsers(); - int offset = 0; - foreach (var user in users.OrderBy(e => ((Call)e).Arguments[1].Evaluate().AsTensor().ToScalar())) - { - model.Add((boxs[splitCall].Y.StartExpr() + offset) == boxs[user].Y.StartExpr()); - offset += bufferMap[user].Span.Size; - } - } - else if (expr is Call { Target: IR.Tensors.Reshape } reshapCall) - { - // the reshape must equal with it's input. - model.Add(boxs[reshapCall].Y.StartExpr() == boxs[reshapCall.Arguments[0]].Y.StartExpr()); - } - } + ExternalConstrains(model, bufferMap, boxs); model.Minimize(LinearExpr.Sum(yStarts)); @@ -99,10 +98,10 @@ public void Schedule(IReadOnlyDictionary bufferMap) throw new System.NotSupportedException(); } - foreach (var (k, v) in bufferMap) + foreach (var (k, _) in bufferMap) { - bufferMap[k].Span.Start = checked((int)solver.Value(boxs[k].Y.StartExpr())); - bufferMap[k].Span.End = checked((int)solver.Value(boxs[k].Y.EndExpr())); + bufferMap[k].MemInterval.Start = checked((int)solver.Value(boxs[k].Y.StartExpr())); + bufferMap[k].MemInterval.Stop = checked((int)solver.Value(boxs[k].Y.EndExpr())); } } @@ -119,18 +118,11 @@ from enum import Enum from typing import List @dataclass -class TimeInterval(): +class Interval(): start: int end: int def __str__(self) -> str: - return f'(start: {self.start}, end {self.end})' - -@dataclass -class MemSpan(): - depth_start: int - depth_end: int - def __str__(self) -> str: - return f'(start: {self.depth_start}, size {self.depth_end - self.depth_start})' + return f'(start: {self.start}, end {self.end}, size {self.end - self.start})' class ConstraintsMode(Enum): No = 0 @@ -140,8 +132,8 @@ class ConstraintsMode(Enum): class ScheduledBuffer(): name: str number: int - interval: TimeInterval - location: MemSpan + time_interval: Interval + mem_interval: Interval constraints: ConstraintsMode shape: List[int] stride: List[int] @@ -166,8 +158,8 @@ class ScheduledBuffer(): 'height': [], 'alpha': [], 'color': [], - 'location': [], - 'interval': [], + 'mem_interval': [], + 'time_interval': [], 'shape': [], 'stride': [], } @@ -177,10 +169,10 @@ class ScheduledBuffer(): color_dict = {} for buffer in buffers: source['name'].append(buffer.name) - width = buffer.interval.end - buffer.interval.start - x = buffer.interval.start + (width / 2) - height = buffer.location.depth_end - buffer.location.depth_start - y = buffer.location.depth_start + (height / 2) + width = buffer.time_interval.end - buffer.time_interval.start + x = buffer.time_interval.start + (width / 2) + height = buffer.mem_interval.end - buffer.mem_interval.start + y = buffer.mem_interval.start + (height / 2) y_range_max = max(y_range_max, y) x_range_max = max(x_range_max, buffer.interval.end) source['x'].append(x) @@ -193,13 +185,13 @@ class ScheduledBuffer(): color_dict[buffer.name] = color source['color'].append(color) source['alpha'].append(0.2 if buffer.inplace else 1.0) - source['interval'].append(str(buffer.interval)) - source['location'].append(str(buffer.location)) + source['time_interval'].append(str(buffer.time_interval)) + source['mem_interval'].append(str(buffer.mem_interval)) source['shape'].append(','.join([str(s) for s in buffer.shape])) source['stride'].append(','.join([str(s) for s in buffer.stride])) source = ColumnDataSource(source) -hover = HoverTool(tooltips=[('name', '@name'), ('interval', '@interval'), ('location', '@location'), +hover = HoverTool(tooltips=[('name', '@name'), ('time_interval', '@time_interval'), ('mem_interval', '@mem_interval'), ('shape', '@shape'), ('stride', '@stride')]) p = figure(tools=[hover, WheelPanTool(), SaveTool(), WheelZoomTool(), ResetTool()], width=1280, height=720, diff --git a/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs b/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs index 1edcc263d..938317762 100644 --- a/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs +++ b/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs @@ -10,16 +10,16 @@ namespace Nncase.Passes.BufferSchedule; -internal sealed class LifeTimeCollector : ExprVisitor +public class LifeTimeCollector : ExprVisitor { public int TimeStamp { get; private set; } - public Dictionary LifenessMap { get; } = new(ReferenceEqualityComparer.Instance); + public Dictionary LifenessMap { get; } = new(ReferenceEqualityComparer.Instance); - public IReadOnlyDictionary Collect(Function entry) + public IReadOnlyDictionary Collect(Expr expr) { - Visit(entry.Body); - Update(entry.Body); // avoid final call time interval size == 1. + Visit(expr); + Update(expr); // avoid final call time interval size == 1. Alias(); var d = new Dictionary(ReferenceEqualityComparer.Instance); @@ -32,8 +32,7 @@ public IReadOnlyDictionary Collect(Function entry) Var va => va.Name, _ => k.GetType().Name, }; - var size = GetSize(k.CheckedType, out var shape, out var stride); - + var size = ComputeBufferSize(k.CheckedType, out var shape, out var stride); d.Add(k, new(name, count++, v, new(0, size), shape, stride, false)); } @@ -62,6 +61,29 @@ protected override Unit VisitLeafCall(Call expr) return Unit.Default; } + protected virtual int ComputeBufferSize(IRType type, out int[] shape, out int[] stride) + { + shape = Array.Empty(); + stride = Array.Empty(); + var size = 0; + if (type is TensorType tensorType) + { + shape = tensorType.Shape.ToValueArray(); + stride = TensorUtilities.GetStrides(shape); + size = TensorUtilities.GetSize(shape, stride, tensorType.DType.SizeInBytes); + } + else if (type is TupleType tupleType) + { + size = 0; + foreach (var item in tupleType) + { + size += ComputeBufferSize(item, out _, out _); + } + } + + return size; + } + private void Update(Expr expr) { if (expr is Const or None) @@ -85,7 +107,7 @@ private void Update(Expr expr) } else { - interval.Death = TimeStamp + 1; + interval.Stop = TimeStamp + 1; } LifenessMap[expr] = interval; @@ -123,12 +145,12 @@ private void Alias() } while (changed); } - private bool AliasTime(Call call, TimeInterval interval) + private bool AliasTime(Call call, Interval interval) { - var brith = call.GetArguments().Select(arg => LifenessMap[arg].Death).Concat(new[] { interval.Brith }).Max(); - var death = call.GetUsers().Select(usr => LifenessMap[usr].Brith).Concat(new[] { interval.Death }).Min(); + var brith = call.GetArguments().Select(arg => LifenessMap[arg].Stop).Concat(new[] { interval.Start }).Max(); + var death = call.GetUsers().Select(usr => LifenessMap[usr].Start).Concat(new[] { interval.Stop }).Min(); - if (brith == interval.Brith && death == interval.Death) + if (brith == interval.Start && death == interval.Stop) { return false; } @@ -138,31 +160,8 @@ private bool AliasTime(Call call, TimeInterval interval) throw new InvalidOperationException(); } - interval.Brith = brith; - interval.Death = death; + interval.Start = brith; + interval.Stop = death; return true; } - - private int GetSize(IRType type, out int[] shape, out int[] stride) - { - shape = Array.Empty(); - stride = Array.Empty(); - var size = 0; - if (type is TensorType tensorType) - { - shape = tensorType.Shape.ToValueArray(); - stride = TensorUtilities.GetStrides(shape); - size = TensorUtilities.GetSize(shape, stride, tensorType.DType.SizeInBytes); - } - else if (type is TupleType tupleType) - { - size = 0; - foreach (var item in tupleType) - { - size += GetSize(item, out _, out _); - } - } - - return size; - } } diff --git a/src/Nncase.Passes/DDrBufferSchdeulePass.cs b/src/Nncase.Passes/DDrBufferSchdeulePass.cs index 15a650568..2103b7b04 100644 --- a/src/Nncase.Passes/DDrBufferSchdeulePass.cs +++ b/src/Nncase.Passes/DDrBufferSchdeulePass.cs @@ -46,7 +46,8 @@ protected override async Task RunCoreAsync(IRModule module, RunPassCon if (module.Entry is Function { ModuleKind: Callable.StackVMModuleKind, Body: Expr body } func && IsFixedType(body.CheckedType)) { var sch = new BufferSchedule.BufferScheduler(); - var buffers = sch.CollectLifeTime(func); + var c = new BufferSchedule.LifeTimeCollector(); + var buffers = c.Collect(func.Body); sch.Schedule(buffers); using (var fs = Diagnostics.DumpScope.Current.OpenFile("draw_buffers.py")) { diff --git a/src/Nncase.Passes/EGraphExtractPass.cs b/src/Nncase.Passes/EGraphExtractPass.cs index 2c2baa12b..ba028ea76 100644 --- a/src/Nncase.Passes/EGraphExtractPass.cs +++ b/src/Nncase.Passes/EGraphExtractPass.cs @@ -24,7 +24,7 @@ public EGraphExtractPass(IBaseFuncCostEvaluator? costEvaluator = null) protected override Task RunCoreAsync(IEGraph input, RunPassContext context) { - var post = (BaseFunction)input.Extract(input.Root!, _costEvaluator, out _); + var post = (BaseFunction)input.Extract(input.Root!, _costEvaluator, Array.Empty()); IRHelpers.DCE(post); return Task.FromResult(post); } diff --git a/src/Nncase.Studio/packages.lock.json b/src/Nncase.Studio/packages.lock.json index ee5a22e37..51b9c3532 100644 --- a/src/Nncase.Studio/packages.lock.json +++ b/src/Nncase.Studio/packages.lock.json @@ -916,7 +916,8 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )" + "Nncase.IO": "[1.0.0, )", + "Razor.Templating.Core": "[1.9.0, )" } }, "nncase.compiler": { @@ -1199,6 +1200,12 @@ "libortki": "0.0.2" } }, + "Razor.Templating.Core": { + "type": "CentralTransitive", + "requested": "[1.9.0, )", + "resolved": "1.9.0", + "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" + }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.Targets/packages.lock.json b/src/Nncase.Targets/packages.lock.json index a434ae425..0205fb8c8 100644 --- a/src/Nncase.Targets/packages.lock.json +++ b/src/Nncase.Targets/packages.lock.json @@ -65,7 +65,8 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )" + "Nncase.IO": "[1.0.0, )", + "Razor.Templating.Core": "[1.9.0, )" } }, "nncase.core": { @@ -153,6 +154,12 @@ "System.Runtime.CompilerServices.Unsafe": "5.0.0" } }, + "Razor.Templating.Core": { + "type": "CentralTransitive", + "requested": "[1.9.0, )", + "resolved": "1.9.0", + "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" + }, "System.CommandLine": { "type": "CentralTransitive", "requested": "[2.0.0-beta4.22272.1, )", diff --git a/src/Nncase.Tests.TestFixture/packages.lock.json b/src/Nncase.Tests.TestFixture/packages.lock.json index b70a73730..21c8808ff 100644 --- a/src/Nncase.Tests.TestFixture/packages.lock.json +++ b/src/Nncase.Tests.TestFixture/packages.lock.json @@ -718,7 +718,8 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )" + "Nncase.IO": "[1.0.0, )", + "Razor.Templating.Core": "[1.9.0, )" } }, "nncase.compiler": { @@ -1001,6 +1002,12 @@ "libortki": "0.0.2" } }, + "Razor.Templating.Core": { + "type": "CentralTransitive", + "requested": "[1.9.0, )", + "resolved": "1.9.0", + "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" + }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs b/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs index c14174bde..2fe2ba6d3 100644 --- a/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs +++ b/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs @@ -47,10 +47,10 @@ public void TestEGraphExtractMinBy() }, }; - Assert.IsType(list.OrderBy(e => e, EGraphExtractExtensions.ENodeTypeComparer.Instance).First()); + Assert.IsType(list.OrderBy(e => e, ENodeTypeComparer.Instance).First()); Assert.True(cost[b] < cost[c]); - Assert.IsType(list.OrderBy(e => e, EGraphExtractExtensions.ENodeTypeComparer.Instance).MinBy(e => cost[e])); + Assert.IsType(list.OrderBy(e => e, ENodeTypeComparer.Instance).MinBy(e => cost[e])); } } diff --git a/src/Nncase.Tests/packages.lock.json b/src/Nncase.Tests/packages.lock.json index beff5e02b..3aa4e64e9 100644 --- a/src/Nncase.Tests/packages.lock.json +++ b/src/Nncase.Tests/packages.lock.json @@ -839,7 +839,8 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )" + "Nncase.IO": "[1.0.0, )", + "Razor.Templating.Core": "[1.9.0, )" } }, "nncase.compiler": { @@ -1094,6 +1095,12 @@ "libortki": "0.0.2" } }, + "Razor.Templating.Core": { + "type": "CentralTransitive", + "requested": "[1.9.0, )", + "resolved": "1.9.0", + "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" + }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", From bb47ea5803871a3d9e46d6b1d4889bd4acbbc7da Mon Sep 17 00:00:00 2001 From: sunnycase Date: Fri, 8 Mar 2024 14:40:03 +0800 Subject: [PATCH 2/6] Revert "add Razor.Templating.Core (#1169)" (#1173) This reverts commit 2498b1ba0c1933d58da136b34ad8faccd87076c8. --- NuGet.Config | 2 + .../Nncase.Modules.StackVM/packages.lock.json | 9 +- src/Nncase.Cli/Program.cs | 2 +- src/Nncase.Cli/packages.lock.json | 9 +- src/Nncase.CodeGen/Nncase.CodeGen.csproj | 1 - src/Nncase.CodeGen/packages.lock.json | 6 - src/Nncase.Compiler/Compiler.cs | 2 +- src/Nncase.Compiler/packages.lock.json | 9 +- src/Nncase.Core/TIR/TIRUtilities.cs | 17 -- src/Nncase.Core/Utilities/ShapeExprUtility.cs | 1 + .../CostModel/EGraphCostPrinter.cs | 47 +--- src/Nncase.EGraph/Passes/EGraphExtensions.cs | 50 ----- .../Passes/EGraphExtractExtensions.cs | 95 +++++++++ .../Passes/EGraphExtractors/Extractor.cs | 200 ++++++++++++++++++ .../SatExtractor.cs} | 17 +- src/Nncase.EGraph/Passes/RewriteProvider.cs | 2 +- .../BufferSchedule/BufferScheduleTypes.cs | 46 ++-- .../BufferSchedule/BufferScheduler.cs | 118 ++++++----- .../BufferSchedule/LifeTimeCollector.cs | 73 +++---- src/Nncase.Passes/DDrBufferSchdeulePass.cs | 3 +- src/Nncase.Passes/EGraphExtractPass.cs | 2 +- src/Nncase.Studio/packages.lock.json | 9 +- src/Nncase.Targets/packages.lock.json | 9 +- .../packages.lock.json | 9 +- .../CostModel/UnitTestEGraphCostModel.cs | 4 +- src/Nncase.Tests/packages.lock.json | 9 +- 26 files changed, 454 insertions(+), 297 deletions(-) delete mode 100644 src/Nncase.EGraph/Passes/EGraphExtensions.cs create mode 100644 src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs create mode 100644 src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs rename src/Nncase.EGraph/Passes/{EGraphExtractor.cs => EGraphExtractors/SatExtractor.cs} (94%) diff --git a/NuGet.Config b/NuGet.Config index fd11e2a06..5e7849eab 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -2,11 +2,13 @@ + + diff --git a/modules/Nncase.Modules.StackVM/packages.lock.json b/modules/Nncase.Modules.StackVM/packages.lock.json index 8820c0523..4830d0bbf 100644 --- a/modules/Nncase.Modules.StackVM/packages.lock.json +++ b/modules/Nncase.Modules.StackVM/packages.lock.json @@ -121,8 +121,7 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )", - "Razor.Templating.Core": "[1.9.0, )" + "Nncase.IO": "[1.0.0, )" } }, "nncase.core": { @@ -267,12 +266,6 @@ "libortki": "0.0.2" } }, - "Razor.Templating.Core": { - "type": "CentralTransitive", - "requested": "[1.9.0, )", - "resolved": "1.9.0", - "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" - }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.Cli/Program.cs b/src/Nncase.Cli/Program.cs index 4938227c7..0ef25c056 100644 --- a/src/Nncase.Cli/Program.cs +++ b/src/Nncase.Cli/Program.cs @@ -179,7 +179,7 @@ private static void ConfigureHost(IHostBuilder hostBuilder) private static void ConfigureAppConfiguration(HostBuilderContext context, IConfigurationBuilder builder) { var baseDirectory = Path.GetDirectoryName(typeof(Program).Assembly.Location); - builder.SetBasePath(baseDirectory!) + builder.SetBasePath(baseDirectory) .AddJsonFile("config.json", true, false); } } diff --git a/src/Nncase.Cli/packages.lock.json b/src/Nncase.Cli/packages.lock.json index 69a847ef0..56eaafb11 100644 --- a/src/Nncase.Cli/packages.lock.json +++ b/src/Nncase.Cli/packages.lock.json @@ -664,8 +664,7 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )", - "Razor.Templating.Core": "[1.9.0, )" + "Nncase.IO": "[1.0.0, )" } }, "nncase.compiler": { @@ -933,12 +932,6 @@ "libortki": "0.0.2" } }, - "Razor.Templating.Core": { - "type": "CentralTransitive", - "requested": "[1.9.0, )", - "resolved": "1.9.0", - "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" - }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.CodeGen/Nncase.CodeGen.csproj b/src/Nncase.CodeGen/Nncase.CodeGen.csproj index a22aa4760..a4e6d0ecd 100644 --- a/src/Nncase.CodeGen/Nncase.CodeGen.csproj +++ b/src/Nncase.CodeGen/Nncase.CodeGen.csproj @@ -8,7 +8,6 @@ - diff --git a/src/Nncase.CodeGen/packages.lock.json b/src/Nncase.CodeGen/packages.lock.json index b42e1ecfa..fd39ebd2f 100644 --- a/src/Nncase.CodeGen/packages.lock.json +++ b/src/Nncase.CodeGen/packages.lock.json @@ -8,12 +8,6 @@ "resolved": "1.2.12", "contentHash": "D4mn5Cab4ztPLJ0V8uMErDrO/Y61098nwrvyIOLZymVAYOQcwP1vomVWKbTagf1aPU3cX5Q7adZtQEQwOy6XEg==" }, - "Razor.Templating.Core": { - "type": "Direct", - "requested": "[1.9.0, )", - "resolved": "1.9.0", - "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" - }, "StyleCop.Analyzers": { "type": "Direct", "requested": "[1.2.0-beta.435, )", diff --git a/src/Nncase.Compiler/Compiler.cs b/src/Nncase.Compiler/Compiler.cs index c21b7247d..3d83a6b0b 100644 --- a/src/Nncase.Compiler/Compiler.cs +++ b/src/Nncase.Compiler/Compiler.cs @@ -100,6 +100,7 @@ public void TargetIndependentPass(IPassManager passManager) p.Add(); p.Add(); p.Add(); + p.Add(); p.Add(); p.Add(); p.Add(); @@ -140,7 +141,6 @@ public void TargetIndependentPass(IPassManager passManager) p.Add(); p.Add(); p.Add(); - p.Add(); p.Add(); }); diff --git a/src/Nncase.Compiler/packages.lock.json b/src/Nncase.Compiler/packages.lock.json index 214f5c927..f22a60614 100644 --- a/src/Nncase.Compiler/packages.lock.json +++ b/src/Nncase.Compiler/packages.lock.json @@ -661,8 +661,7 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )", - "Razor.Templating.Core": "[1.9.0, )" + "Nncase.IO": "[1.0.0, )" } }, "nncase.core": { @@ -881,12 +880,6 @@ "libortki": "0.0.2" } }, - "Razor.Templating.Core": { - "type": "CentralTransitive", - "requested": "[1.9.0, )", - "resolved": "1.9.0", - "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" - }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.Core/TIR/TIRUtilities.cs b/src/Nncase.Core/TIR/TIRUtilities.cs index 6dcad9ad1..6a1142e71 100644 --- a/src/Nncase.Core/TIR/TIRUtilities.cs +++ b/src/Nncase.Core/TIR/TIRUtilities.cs @@ -71,21 +71,4 @@ public static class TIRUtilities IR.F.Math.Max(0, t.First.Start), IR.F.Math.Min(t.Second.FixedValue, t.First.Stop), t.First.Step)).ToArray(); - - public static bool TryGetFixedRegions(TIR.BufferRegion region, out (int Start, int Stop, int Step)[] slice) - { - slice = new (int Start, int Stop, int Step)[region.Region.Length]; - for (int i = 0; i < region.Region.Length; i++) - { - var rg = region.Region[i]; - if (rg is not Range { Start: IR.TensorConst start, Stop: IR.TensorConst stop, Step: IR.TensorConst step }) - { - return false; - } - - slice[i] = (start.Value.ToScalar(), stop.Value.ToScalar(), step.Value.ToScalar()); - } - - return true; - } } diff --git a/src/Nncase.Core/Utilities/ShapeExprUtility.cs b/src/Nncase.Core/Utilities/ShapeExprUtility.cs index 9c73513cf..c1da04dca 100644 --- a/src/Nncase.Core/Utilities/ShapeExprUtility.cs +++ b/src/Nncase.Core/Utilities/ShapeExprUtility.cs @@ -1,6 +1,7 @@ // Copyright (c) Canaan Inc. All rights reserved. // Licensed under the Apache license. See LICENSE file in the project root for full license information. +using GiGraph.Dot.Output.Writers.Edges; using Nncase.Diagnostics; using Nncase.IR; using Nncase.IR.Tensors; diff --git a/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs b/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs index ac2d1c1ca..c8f3bd5c3 100644 --- a/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs +++ b/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs @@ -32,25 +32,6 @@ internal static DotGraph DumpEgraphAsDot(IEGraph eGraph, CostModel.EGraphCostMod return printer.SaveToStream(file); } - /// - /// find the minCostEnode in eclass. - /// - /// the marker first. - /// - /// - internal static ENode MinByWithMarker(EClass eClass, CostModel.EGraphCostModel costModel) - { - return eClass.Nodes.OrderBy(e => e.Expr, ENodeTypeComparer.Instance).MinBy(x => x.Expr is Marker ? CostModel.Cost.Zero : costModel[x])!; - } - - /// - /// find the minCostEnode in eclass skip marker. - /// - internal static ENode MinByWithOutMarker(EClass eClass, CostModel.EGraphCostModel costModel) - { - return eClass.Nodes.Where(e => e.Expr is not Marker).MinBy(x => costModel[x])!; - } - private DotGraph AttachEGraphCost(CostModel.EGraphCostModel costModel, EClass entry) { // 1. display each enode costs. @@ -91,12 +72,12 @@ void Dfs(EClass curclass) continue; } - var minCostEnode = MinByWithMarker(parent, costModel); + var minCostEnode = parent.MinByWithMarker(costModel); // when this marker ecalss has been visited, skip it. if (markerEclassMemo.Contains(parent)) { - minCostEnode = MinByWithOutMarker(parent, costModel); + minCostEnode = parent.MinByWithOutMarker(costModel); } var (minCostDotnode, table) = NodesMap[minCostEnode]; @@ -112,7 +93,7 @@ void Dfs(EClass curclass) if (minCostEnode.Expr is Marker && child == parent) { markerEclassMemo.Add(child); - var otherminCostENode = MinByWithOutMarker(child, costModel); + var otherminCostENode = child.MinByWithOutMarker(costModel); var (childDotNode, _) = NodesMap[otherminCostENode]; _dotGraph.Edges.Add(childDotNode, minCostDotnode, edge => { @@ -122,7 +103,7 @@ void Dfs(EClass curclass) } else { - var childEnode = MinByWithMarker(child.Find(), costModel); + var childEnode = child.Find().MinByWithMarker(costModel); var (childDotNode, _) = NodesMap[childEnode]; _dotGraph.Edges.Add(childDotNode, minCostDotnode, edge => { @@ -145,23 +126,3 @@ void Dfs(EClass curclass) return _dotGraph; } } - -internal sealed class ENodeTypeComparer : IComparer -{ - public static readonly ENodeTypeComparer Instance = new(); - - public int Compare(Expr? x, Expr? y) => (x, y) switch - { - (null, null) => 0, - (Expr, null) => 1, - (null, Expr) => -1, - (Expr, Expr) => GetPriority(x).CompareTo(GetPriority(y)), - }; - - private int GetPriority(Expr x) => x switch - { - Marker => 0, - Const => 1, - _ => 2, - }; -} diff --git a/src/Nncase.EGraph/Passes/EGraphExtensions.cs b/src/Nncase.EGraph/Passes/EGraphExtensions.cs deleted file mode 100644 index 5a349cec4..000000000 --- a/src/Nncase.EGraph/Passes/EGraphExtensions.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Canaan Inc. All rights reserved. -// Licensed under the Apache license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Google.OrTools.Sat; -using Nncase.CostModel; -using Nncase.Diagnostics; -using Nncase.IR; -using Nncase.PatternMatch; -using static Nncase.PatternMatch.F.Math; -using static Nncase.PatternMatch.Utility; - -namespace Nncase.Passes; - -/// -/// EGraph extract extensions. -/// -public static class EGraphExtensions -{ - /// - /// Extract egraph. - /// - /// egraph. - /// Root eclass. - /// base func cost evaluator. - /// the cp model constrains. - public static Expr Extract(this IEGraph eGraph, EClass root, Evaluator.IBaseFuncCostEvaluator? basefunc_cost_evaluator, EGraphExtractConstrains[] constrains) - { - // 1. set enode expr with more accuracy type. - foreach (var eclass in eGraph.Classes) - { - foreach (var nodes in eclass.Nodes) - { - if (eclass.CheckedType.CompareTo(nodes.Expr.CheckedType) > 0) - { - nodes.Expr.CheckedType = eclass.CheckedType; - } - } - } - - // 2. start the cost evaluator - var costModel = new CostModel.EGraphCostEvaluator(root.Find(), basefunc_cost_evaluator, false).Evaluate(); - - return new EGraphExtractor(costModel).Extract(root.Find(), eGraph, constrains); - } -} diff --git a/src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs b/src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs new file mode 100644 index 000000000..7c0cfbdc2 --- /dev/null +++ b/src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs @@ -0,0 +1,95 @@ +// Copyright (c) Canaan Inc. All rights reserved. +// Licensed under the Apache license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Nncase.CostModel; +using Nncase.Diagnostics; +using Nncase.IR; +using Nncase.PatternMatch; +using static Nncase.PatternMatch.F.Math; +using static Nncase.PatternMatch.Utility; + +namespace Nncase.Passes; + +/// +/// EGraph extract extensions. +/// +public static class EGraphExtractExtensions +{ + /// + /// Extract egraph. + /// + /// eGraph. + /// Root eclass. + /// base func cost evaluator. + /// the picks. + /// Extracted root expression. + public static Expr Extract(this IEGraph eGraph, EClass root, Evaluator.IBaseFuncCostEvaluator? basefunc_cost_evaluator, out IReadOnlyDictionary picks) + { + // 1. set enode expr with more accuracy type. + foreach (var eclass in eGraph.Classes) + { + foreach (var nodes in eclass.Nodes) + { + if (eclass.CheckedType.CompareTo(nodes.Expr.CheckedType) > 0) + { + nodes.Expr.CheckedType = eclass.CheckedType; + } + } + } + + // 2. start the cost evaluator + var costModel = new EGraphCostEvaluator(root.Find(), basefunc_cost_evaluator, false).Evaluate(); + + // if (DumpScope.Current.IsEnabled(DumpFlags.EGraphCost)) + // { + // using var fs = DumpScope.Current.OpenFile(Path.Combine("Costs", $"V{eGraph.Version}.dot")); + // EGraphPrinter.DumpEgraphAsDot(eGraph, costModel, root.Find(), fs); + // } + // return new EGraphExtractor(costModel).Extract(root.Find(), eGraph); + return new EGraphExtractors.SatExtractor(costModel).Extract(root.Find(), eGraph, out picks); + } + + /// + /// find the minCostEnode in eclass. + /// + /// the marker first. + /// + /// + internal static ENode MinByWithMarker(this EClass eClass, CostModel.EGraphCostModel costModel) + { + return eClass.Nodes.OrderBy(e => e.Expr, ENodeTypeComparer.Instance).MinBy(x => x.Expr is Marker ? Cost.Zero : costModel[x])!; + } + + /// + /// find the minCostEnode in eclass skip marker. + /// + internal static ENode MinByWithOutMarker(this EClass eClass, CostModel.EGraphCostModel costModel) + { + return eClass.Nodes.Where(e => e.Expr is not Marker).MinBy(x => costModel[x])!; + } + + internal sealed class ENodeTypeComparer : IComparer + { + public static readonly ENodeTypeComparer Instance = new(); + + public int Compare(Expr? x, Expr? y) => (x, y) switch + { + (null, null) => 0, + (Expr, null) => 1, + (null, Expr) => -1, + (Expr, Expr) => GetPriority(x).CompareTo(GetPriority(y)), + }; + + private int GetPriority(Expr x) => x switch + { + Marker => 0, + Const => 1, + _ => 2, + }; + } +} diff --git a/src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs b/src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs new file mode 100644 index 000000000..fcf2abd72 --- /dev/null +++ b/src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs @@ -0,0 +1,200 @@ +// Copyright (c) Canaan Inc. All rights reserved. +// Licensed under the Apache license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Nncase.CostModel; +using Nncase.Diagnostics; +using Nncase.IR; +using Nncase.PatternMatch; +using static Nncase.PatternMatch.F.Math; +using static Nncase.PatternMatch.Utility; + +namespace Nncase.Passes.EGraphExtractors; + +internal interface IExtractor +{ + Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary picks); +} + +internal class Extractor : IExtractor +{ + private readonly EGraphCostModel _costModel; + private readonly Dictionary _eclassMemo = new(); + private readonly Dictionary _markerEclassMemo = new(); + private readonly Dictionary _picks = new(); + private StreamWriter? _dumpWriter; + + public Extractor(EGraphCostModel costModel) + { + _costModel = costModel; + } + + public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary picks) + { + _dumpWriter = DumpScope.Current.IsEnabled(DumpFlags.EGraphCost) + ? new StreamWriter(DumpScope.Current.OpenFile($"{nameof(Extractor)}_Class_{root.Id}.txt")) + : null; + try + { + Visit(root); + } + finally + { + _dumpWriter?.Dispose(); + } + + foreach (var enode in eGraph.Nodes) + { + if (!_picks.ContainsKey(enode)) + { + _picks[enode] = false; + } + } + + picks = _picks; + return _eclassMemo[root]; + } + + private void Visit(EClass eclass) + { + var stack = new Stack<(EClass, ENode)>(); + stack.Push((eclass, eclass.MinByWithMarker(_costModel))); + var markerEclassSet = new HashSet(); + while (stack.Any()) + { + (eclass, var minCostEnode) = stack.Peek(); + if (_eclassMemo.ContainsKey(eclass)) + { + stack.Pop(); + continue; + } + + Expr? expr = null; + switch (minCostEnode.Expr) + { + case Var or TensorConst or TupleConst or Op or Fusion or None: + expr = minCostEnode.Expr; + break; + case Function or Call or IR.Tuple or Marker or IR.If: + var childrenExprs = new List(); + foreach (var child in minCostEnode.Children) + { + if (!_eclassMemo.TryGetValue(child, out var childExpr)) + { + if (minCostEnode.Expr is Marker && child == eclass) + { + if (!_markerEclassMemo.TryGetValue(eclass, out var markerInputExpr)) + { + markerEclassSet.Add(eclass); + stack.Push((eclass, eclass.MinByWithOutMarker(_costModel))); + } + else + { + childrenExprs.Add(markerInputExpr); + } + } + else + { + stack.Push((child, child.MinByWithMarker(_costModel))); + } + } + else + { + childrenExprs.Add(childExpr); + } + } + + if (childrenExprs.Count != minCostEnode.Children.Count) + { + break; + } + + expr = minCostEnode.Expr switch + { + Function function => Visit(minCostEnode, function, new(childrenExprs)), + Call call => Visit(minCostEnode, call, new(childrenExprs)), + IR.Tuple tuple => Visit(minCostEnode, tuple, new(childrenExprs)), + Marker marker => Visit(minCostEnode, marker, new(childrenExprs)), + IR.If @if => Visit(minCostEnode, @if, new(childrenExprs)), + _ => throw new ArgumentException("Unsupported expression type."), + }; + + break; + default: + throw new ArgumentException("Unsupported expression type."); + } + + if (expr is null) + { + continue; + } + + if (markerEclassSet.Contains(eclass) && minCostEnode.Expr is not Marker) + { + _markerEclassMemo.Add(eclass, expr); + } + else + { + _eclassMemo.Add(eclass, expr); + } + + _picks[minCostEnode] = true; + stack.Pop(); + } + } + + private Marker Visit(ENode enode, Marker marker, IRArray children) + { + var target = children[0]; + var attr = children[1]; + return marker.With(target: target, attribute: attr); + } + + private Function Visit(ENode enode, Function func, IRArray children) + { + if (children.Count == 0) + { + return func; + } + + var body = children[0]; + return func.With(body: body); + } + + private IR.Tuple Visit(ENode enode, IR.Tuple tuple, IRArray children) + { + return tuple.With(fields: children.ToArray()); + } + + private IR.If Visit(ENode enode, IR.If @if, IRArray children) + { + return @if.With(condition: children[^3], then: children[^2], @else: children[^1], paramList: children[..^3].ToArray()); + } + + private Call Visit(ENode enode, Call call, IRArray children) + { + var target = children[0]; + var arguments = children.Skip(1); + + // for mix quant debug. + if (call.EnodeQuantConfigWithCosine != null && _dumpWriter != null) + { + _dumpWriter.WriteLine(call + " " + call.CheckedType); + for (int i = 0; i < call.EnodeQuantConfigWithCosine.Count; i++) + { + for (int j = 0; j < call.EnodeQuantConfigWithCosine[i].Item1.Count; j++) + { + _dumpWriter.Write(call.EnodeQuantConfigWithCosine[i].Item1[j] + " "); + } + + _dumpWriter.WriteLine(call.EnodeQuantConfigWithCosine[i].Item3); + } + } + + return call.With(target: target, arguments: arguments.ToArray(), call.Metadata); + } +} diff --git a/src/Nncase.EGraph/Passes/EGraphExtractor.cs b/src/Nncase.EGraph/Passes/EGraphExtractors/SatExtractor.cs similarity index 94% rename from src/Nncase.EGraph/Passes/EGraphExtractor.cs rename to src/Nncase.EGraph/Passes/EGraphExtractors/SatExtractor.cs index c7eba4570..fab2fc05e 100644 --- a/src/Nncase.EGraph/Passes/EGraphExtractor.cs +++ b/src/Nncase.EGraph/Passes/EGraphExtractors/SatExtractor.cs @@ -11,20 +11,18 @@ using Nncase.Diagnostics; using Nncase.IR; -namespace Nncase.Passes; +namespace Nncase.Passes.EGraphExtractors; -public delegate void EGraphExtractConstrains(CpModel model, IReadOnlyDictionary vars); - -internal class EGraphExtractor +internal class SatExtractor : IExtractor { private readonly EGraphCostModel _costModel; - public EGraphExtractor(EGraphCostModel costModel) + public SatExtractor(EGraphCostModel costModel) { _costModel = costModel; } - public Expr Extract(EClass root, IEGraph eGraph, EGraphExtractConstrains[] constrains) + public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary picks) { var cpmodel = new CpModel(); @@ -70,11 +68,6 @@ public Expr Extract(EClass root, IEGraph eGraph, EGraphExtractConstrains[] const EliminateAllCycles(root, new(), new(), visited, cpmodel, vars); } - foreach (var constrain in constrains) - { - constrain(cpmodel, vars); - } - // 3. add pick weights for all enode. cpmodel.Minimize(LinearExpr.WeightedSum(eGraph.Nodes.Select(n => vars[n]), eGraph.Nodes.Select(n => checked((long)_costModel[n].Score)))); @@ -128,7 +121,7 @@ public Expr Extract(EClass root, IEGraph eGraph, EGraphExtractConstrains[] const throw new InvalidProgramException("SatExtract Failed!"); } - var picks = eGraph.Nodes.ToDictionary(e => e, e => solver.BooleanValue(vars[e])); + picks = eGraph.Nodes.ToDictionary(e => e, e => solver.BooleanValue(vars[e])); using (var dumpStream = enableDump ? DumpScope.Current.OpenFile("Costs/Pick.dot") : Stream.Null) { EGraphPrinter.DumpEgraphAsDot(eGraph, _costModel, picks, root.Find(), dumpStream); diff --git a/src/Nncase.EGraph/Passes/RewriteProvider.cs b/src/Nncase.EGraph/Passes/RewriteProvider.cs index ad64c2207..07d3416ed 100644 --- a/src/Nncase.EGraph/Passes/RewriteProvider.cs +++ b/src/Nncase.EGraph/Passes/RewriteProvider.cs @@ -36,7 +36,7 @@ public Expr ERewrite(Expr expr, IEnumerable rules, RunPassContext var graph = new EGraph(expr); ERewrite(graph, rules, options); - var post = graph.Extract(graph.Root!, null, Array.Empty()); + var post = graph.Extract(graph.Root!, null, out _); return post; } diff --git a/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs b/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs index 3b76f1673..13e8ab86f 100644 --- a/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs +++ b/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs @@ -3,34 +3,54 @@ namespace Nncase.Passes.BufferSchedule; -public sealed class Interval +internal sealed class TimeInterval { - public Interval(int start, int end) + public TimeInterval(int start, int end) + { + Brith = start; + Death = end; + } + + public int Brith { get; set; } + + public int Death { get; set; } + + public int Size => Death - Brith; + + public override string ToString() + { + return $"TimeInterval({Brith}, {Death})"; + } +} + +internal sealed class MemSpan +{ + public MemSpan(int start, int end) { Start = start; - Stop = end; + End = end; } public int Start { get; set; } - public int Stop { get; set; } + public int End { get; set; } - public int Size => Stop - Start; + public int Size => End - Start; public override string ToString() { - return $"Interval({Start}, {Stop})"; + return $"MemSpan({Start}, {End})"; } } -public class ScheduleBuffer +internal class ScheduleBuffer { - public ScheduleBuffer(string name, int number, Interval timeInterval, Interval memInterval, int[] shape, int[] strides, bool inplace) + public ScheduleBuffer(string name, int number, TimeInterval interval, MemSpan span, int[] shape, int[] strides, bool inplace) { Name = name; Number = number; - TimeInterval = timeInterval; - MemInterval = memInterval; + Interval = interval; + Span = span; Shape = shape; Strides = strides; Inplace = inplace; @@ -40,9 +60,9 @@ public ScheduleBuffer(string name, int number, Interval timeInterval, Interval m public int Number { get; } - public Interval TimeInterval { get; } + public TimeInterval Interval { get; } - public Interval MemInterval { get; } + public MemSpan Span { get; } public int[] Shape { get; } @@ -52,6 +72,6 @@ public ScheduleBuffer(string name, int number, Interval timeInterval, Interval m public override string ToString() { - return $"ScheduledBuffer('{Name}', {Number}, {TimeInterval}, {MemInterval}, ConstraintsMode.No, [{string.Join(",", Shape)}], [{string.Join(",", Strides)}], {Inplace})"; + return $"ScheduledBuffer('{Name}', {Number}, {Interval}, {Span}, ConstraintsMode.No, [{string.Join(",", Shape)}], [{string.Join(",", Strides)}], {Inplace})"; } } diff --git a/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs b/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs index 8d02aff4e..25f7d6f5b 100644 --- a/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs +++ b/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs @@ -13,42 +13,12 @@ namespace Nncase.Passes.BufferSchedule; -public class BufferScheduler +internal sealed class BufferScheduler { - public virtual void ExternalConstrains(CpModel model, IReadOnlyDictionary bufferMap, IReadOnlyDictionary boxs) + public IReadOnlyDictionary CollectLifeTime(Function func) { - foreach (var (expr, item) in bufferMap) - { - if (expr is Call { Target: IR.Tensors.Concat } concatCall && concatCall.Arguments[0] is IR.Tuple tuple) - { - // the concat inputs must contiguous - int offset = 0; - for (int i = 0; i < tuple.Fields.Length; i++) - { - model.Add((boxs[concatCall].Y.StartExpr() + offset) == boxs[tuple.Fields[i]].Y.StartExpr()); - offset += bufferMap[tuple.Fields[i]].MemInterval.Size; - } - } - else if (expr is Call { Target: IR.Tensors.Split } splitCall) - { - // the split must equal with input. - model.Add(boxs[splitCall].Y.StartExpr() == boxs[splitCall.Arguments[0]].Y.StartExpr()); - - // the split outputs must contiguous - var users = splitCall.GetUsers(); - int offset = 0; - foreach (var user in users.OrderBy(e => ((Call)e).Arguments[1].Evaluate().AsTensor().ToScalar())) - { - model.Add((boxs[splitCall].Y.StartExpr() + offset) == boxs[user].Y.StartExpr()); - offset += bufferMap[user].MemInterval.Size; - } - } - else if (expr is Call { Target: IR.Tensors.Reshape } reshapCall) - { - // the reshape must equal with it's input. - model.Add(boxs[reshapCall].Y.StartExpr() == boxs[reshapCall.Arguments[0]].Y.StartExpr()); - } - } + var c = new LifeTimeCollector(); + return c.Collect(func); } public void Schedule(IReadOnlyDictionary bufferMap) @@ -60,21 +30,21 @@ public void Schedule(IReadOnlyDictionary bufferMap) var yStarts = new List(); foreach (var (expr, item) in bufferMap) { - var xInterval = model.NewIntervalVar(model.NewConstant(item.TimeInterval.Start), model.NewConstant(item.TimeInterval.Size), model.NewConstant(item.TimeInterval.Stop), item.Name + $"{item.Number}_x"); + var xInterval = model.NewIntervalVar(model.NewConstant(item.Interval.Brith), model.NewConstant(item.Interval.Size), model.NewConstant(item.Interval.Death), item.Name + $"{item.Number}_x"); - var upbound = 2147483648 - item.MemInterval.Stop; + var upbound = 2147483648 - item.Span.End; if (upbound <= 0) { throw new System.NotSupportedException(); } var memStartVar = model.NewIntVar(0, upbound, $"{item.Name}_{item.Number}_y_start"); - var yInterval = model.NewFixedSizeIntervalVar(memStartVar, item.MemInterval.Stop, $"{item.Name}_{item.Number}_y"); + var yInterval = model.NewFixedSizeIntervalVar(memStartVar, item.Span.End, $"{item.Name}_{item.Number}_y"); noOverlap.AddRectangle(xInterval, yInterval); yStarts.Add(memStartVar); boxs.Add(expr, (xInterval, yInterval)); - for (int time = item.TimeInterval.Start; time < item.TimeInterval.Stop; time++) + for (int time = item.Interval.Brith; time < item.Interval.Death; time++) { if (!timeMap.TryGetValue(time, out var timelist)) { @@ -86,7 +56,38 @@ public void Schedule(IReadOnlyDictionary bufferMap) } } - ExternalConstrains(model, bufferMap, boxs); + foreach (var (expr, item) in bufferMap) + { + if (expr is Call { Target: IR.Tensors.Concat } concatCall && concatCall.Arguments[0] is IR.Tuple tuple) + { + // the concat inputs must contiguous + int offset = 0; + for (int i = 0; i < tuple.Fields.Length; i++) + { + model.Add((boxs[concatCall].Y.StartExpr() + offset) == boxs[tuple.Fields[i]].Y.StartExpr()); + offset += bufferMap[tuple.Fields[i]].Span.Size; + } + } + else if (expr is Call { Target: IR.Tensors.Split } splitCall) + { + // the split must equal with input. + model.Add(boxs[splitCall].Y.StartExpr() == boxs[splitCall.Arguments[0]].Y.StartExpr()); + + // the split outputs must contiguous + var users = splitCall.GetUsers(); + int offset = 0; + foreach (var user in users.OrderBy(e => ((Call)e).Arguments[1].Evaluate().AsTensor().ToScalar())) + { + model.Add((boxs[splitCall].Y.StartExpr() + offset) == boxs[user].Y.StartExpr()); + offset += bufferMap[user].Span.Size; + } + } + else if (expr is Call { Target: IR.Tensors.Reshape } reshapCall) + { + // the reshape must equal with it's input. + model.Add(boxs[reshapCall].Y.StartExpr() == boxs[reshapCall.Arguments[0]].Y.StartExpr()); + } + } model.Minimize(LinearExpr.Sum(yStarts)); @@ -98,10 +99,10 @@ public void Schedule(IReadOnlyDictionary bufferMap) throw new System.NotSupportedException(); } - foreach (var (k, _) in bufferMap) + foreach (var (k, v) in bufferMap) { - bufferMap[k].MemInterval.Start = checked((int)solver.Value(boxs[k].Y.StartExpr())); - bufferMap[k].MemInterval.Stop = checked((int)solver.Value(boxs[k].Y.EndExpr())); + bufferMap[k].Span.Start = checked((int)solver.Value(boxs[k].Y.StartExpr())); + bufferMap[k].Span.End = checked((int)solver.Value(boxs[k].Y.EndExpr())); } } @@ -118,11 +119,18 @@ from enum import Enum from typing import List @dataclass -class Interval(): +class TimeInterval(): start: int end: int def __str__(self) -> str: - return f'(start: {self.start}, end {self.end}, size {self.end - self.start})' + return f'(start: {self.start}, end {self.end})' + +@dataclass +class MemSpan(): + depth_start: int + depth_end: int + def __str__(self) -> str: + return f'(start: {self.depth_start}, size {self.depth_end - self.depth_start})' class ConstraintsMode(Enum): No = 0 @@ -132,8 +140,8 @@ class ConstraintsMode(Enum): class ScheduledBuffer(): name: str number: int - time_interval: Interval - mem_interval: Interval + interval: TimeInterval + location: MemSpan constraints: ConstraintsMode shape: List[int] stride: List[int] @@ -158,8 +166,8 @@ class ScheduledBuffer(): 'height': [], 'alpha': [], 'color': [], - 'mem_interval': [], - 'time_interval': [], + 'location': [], + 'interval': [], 'shape': [], 'stride': [], } @@ -169,10 +177,10 @@ class ScheduledBuffer(): color_dict = {} for buffer in buffers: source['name'].append(buffer.name) - width = buffer.time_interval.end - buffer.time_interval.start - x = buffer.time_interval.start + (width / 2) - height = buffer.mem_interval.end - buffer.mem_interval.start - y = buffer.mem_interval.start + (height / 2) + width = buffer.interval.end - buffer.interval.start + x = buffer.interval.start + (width / 2) + height = buffer.location.depth_end - buffer.location.depth_start + y = buffer.location.depth_start + (height / 2) y_range_max = max(y_range_max, y) x_range_max = max(x_range_max, buffer.interval.end) source['x'].append(x) @@ -185,13 +193,13 @@ class ScheduledBuffer(): color_dict[buffer.name] = color source['color'].append(color) source['alpha'].append(0.2 if buffer.inplace else 1.0) - source['time_interval'].append(str(buffer.time_interval)) - source['mem_interval'].append(str(buffer.mem_interval)) + source['interval'].append(str(buffer.interval)) + source['location'].append(str(buffer.location)) source['shape'].append(','.join([str(s) for s in buffer.shape])) source['stride'].append(','.join([str(s) for s in buffer.stride])) source = ColumnDataSource(source) -hover = HoverTool(tooltips=[('name', '@name'), ('time_interval', '@time_interval'), ('mem_interval', '@mem_interval'), +hover = HoverTool(tooltips=[('name', '@name'), ('interval', '@interval'), ('location', '@location'), ('shape', '@shape'), ('stride', '@stride')]) p = figure(tools=[hover, WheelPanTool(), SaveTool(), WheelZoomTool(), ResetTool()], width=1280, height=720, diff --git a/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs b/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs index 938317762..1edcc263d 100644 --- a/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs +++ b/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs @@ -10,16 +10,16 @@ namespace Nncase.Passes.BufferSchedule; -public class LifeTimeCollector : ExprVisitor +internal sealed class LifeTimeCollector : ExprVisitor { public int TimeStamp { get; private set; } - public Dictionary LifenessMap { get; } = new(ReferenceEqualityComparer.Instance); + public Dictionary LifenessMap { get; } = new(ReferenceEqualityComparer.Instance); - public IReadOnlyDictionary Collect(Expr expr) + public IReadOnlyDictionary Collect(Function entry) { - Visit(expr); - Update(expr); // avoid final call time interval size == 1. + Visit(entry.Body); + Update(entry.Body); // avoid final call time interval size == 1. Alias(); var d = new Dictionary(ReferenceEqualityComparer.Instance); @@ -32,7 +32,8 @@ public IReadOnlyDictionary Collect(Expr expr) Var va => va.Name, _ => k.GetType().Name, }; - var size = ComputeBufferSize(k.CheckedType, out var shape, out var stride); + var size = GetSize(k.CheckedType, out var shape, out var stride); + d.Add(k, new(name, count++, v, new(0, size), shape, stride, false)); } @@ -61,29 +62,6 @@ protected override Unit VisitLeafCall(Call expr) return Unit.Default; } - protected virtual int ComputeBufferSize(IRType type, out int[] shape, out int[] stride) - { - shape = Array.Empty(); - stride = Array.Empty(); - var size = 0; - if (type is TensorType tensorType) - { - shape = tensorType.Shape.ToValueArray(); - stride = TensorUtilities.GetStrides(shape); - size = TensorUtilities.GetSize(shape, stride, tensorType.DType.SizeInBytes); - } - else if (type is TupleType tupleType) - { - size = 0; - foreach (var item in tupleType) - { - size += ComputeBufferSize(item, out _, out _); - } - } - - return size; - } - private void Update(Expr expr) { if (expr is Const or None) @@ -107,7 +85,7 @@ private void Update(Expr expr) } else { - interval.Stop = TimeStamp + 1; + interval.Death = TimeStamp + 1; } LifenessMap[expr] = interval; @@ -145,12 +123,12 @@ private void Alias() } while (changed); } - private bool AliasTime(Call call, Interval interval) + private bool AliasTime(Call call, TimeInterval interval) { - var brith = call.GetArguments().Select(arg => LifenessMap[arg].Stop).Concat(new[] { interval.Start }).Max(); - var death = call.GetUsers().Select(usr => LifenessMap[usr].Start).Concat(new[] { interval.Stop }).Min(); + var brith = call.GetArguments().Select(arg => LifenessMap[arg].Death).Concat(new[] { interval.Brith }).Max(); + var death = call.GetUsers().Select(usr => LifenessMap[usr].Brith).Concat(new[] { interval.Death }).Min(); - if (brith == interval.Start && death == interval.Stop) + if (brith == interval.Brith && death == interval.Death) { return false; } @@ -160,8 +138,31 @@ private bool AliasTime(Call call, Interval interval) throw new InvalidOperationException(); } - interval.Start = brith; - interval.Stop = death; + interval.Brith = brith; + interval.Death = death; return true; } + + private int GetSize(IRType type, out int[] shape, out int[] stride) + { + shape = Array.Empty(); + stride = Array.Empty(); + var size = 0; + if (type is TensorType tensorType) + { + shape = tensorType.Shape.ToValueArray(); + stride = TensorUtilities.GetStrides(shape); + size = TensorUtilities.GetSize(shape, stride, tensorType.DType.SizeInBytes); + } + else if (type is TupleType tupleType) + { + size = 0; + foreach (var item in tupleType) + { + size += GetSize(item, out _, out _); + } + } + + return size; + } } diff --git a/src/Nncase.Passes/DDrBufferSchdeulePass.cs b/src/Nncase.Passes/DDrBufferSchdeulePass.cs index 2103b7b04..15a650568 100644 --- a/src/Nncase.Passes/DDrBufferSchdeulePass.cs +++ b/src/Nncase.Passes/DDrBufferSchdeulePass.cs @@ -46,8 +46,7 @@ protected override async Task RunCoreAsync(IRModule module, RunPassCon if (module.Entry is Function { ModuleKind: Callable.StackVMModuleKind, Body: Expr body } func && IsFixedType(body.CheckedType)) { var sch = new BufferSchedule.BufferScheduler(); - var c = new BufferSchedule.LifeTimeCollector(); - var buffers = c.Collect(func.Body); + var buffers = sch.CollectLifeTime(func); sch.Schedule(buffers); using (var fs = Diagnostics.DumpScope.Current.OpenFile("draw_buffers.py")) { diff --git a/src/Nncase.Passes/EGraphExtractPass.cs b/src/Nncase.Passes/EGraphExtractPass.cs index ba028ea76..2c2baa12b 100644 --- a/src/Nncase.Passes/EGraphExtractPass.cs +++ b/src/Nncase.Passes/EGraphExtractPass.cs @@ -24,7 +24,7 @@ public EGraphExtractPass(IBaseFuncCostEvaluator? costEvaluator = null) protected override Task RunCoreAsync(IEGraph input, RunPassContext context) { - var post = (BaseFunction)input.Extract(input.Root!, _costEvaluator, Array.Empty()); + var post = (BaseFunction)input.Extract(input.Root!, _costEvaluator, out _); IRHelpers.DCE(post); return Task.FromResult(post); } diff --git a/src/Nncase.Studio/packages.lock.json b/src/Nncase.Studio/packages.lock.json index 51b9c3532..ee5a22e37 100644 --- a/src/Nncase.Studio/packages.lock.json +++ b/src/Nncase.Studio/packages.lock.json @@ -916,8 +916,7 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )", - "Razor.Templating.Core": "[1.9.0, )" + "Nncase.IO": "[1.0.0, )" } }, "nncase.compiler": { @@ -1200,12 +1199,6 @@ "libortki": "0.0.2" } }, - "Razor.Templating.Core": { - "type": "CentralTransitive", - "requested": "[1.9.0, )", - "resolved": "1.9.0", - "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" - }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.Targets/packages.lock.json b/src/Nncase.Targets/packages.lock.json index 0205fb8c8..a434ae425 100644 --- a/src/Nncase.Targets/packages.lock.json +++ b/src/Nncase.Targets/packages.lock.json @@ -65,8 +65,7 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )", - "Razor.Templating.Core": "[1.9.0, )" + "Nncase.IO": "[1.0.0, )" } }, "nncase.core": { @@ -154,12 +153,6 @@ "System.Runtime.CompilerServices.Unsafe": "5.0.0" } }, - "Razor.Templating.Core": { - "type": "CentralTransitive", - "requested": "[1.9.0, )", - "resolved": "1.9.0", - "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" - }, "System.CommandLine": { "type": "CentralTransitive", "requested": "[2.0.0-beta4.22272.1, )", diff --git a/src/Nncase.Tests.TestFixture/packages.lock.json b/src/Nncase.Tests.TestFixture/packages.lock.json index 21c8808ff..b70a73730 100644 --- a/src/Nncase.Tests.TestFixture/packages.lock.json +++ b/src/Nncase.Tests.TestFixture/packages.lock.json @@ -718,8 +718,7 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )", - "Razor.Templating.Core": "[1.9.0, )" + "Nncase.IO": "[1.0.0, )" } }, "nncase.compiler": { @@ -1002,12 +1001,6 @@ "libortki": "0.0.2" } }, - "Razor.Templating.Core": { - "type": "CentralTransitive", - "requested": "[1.9.0, )", - "resolved": "1.9.0", - "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" - }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", diff --git a/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs b/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs index 2fe2ba6d3..c14174bde 100644 --- a/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs +++ b/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs @@ -47,10 +47,10 @@ public void TestEGraphExtractMinBy() }, }; - Assert.IsType(list.OrderBy(e => e, ENodeTypeComparer.Instance).First()); + Assert.IsType(list.OrderBy(e => e, EGraphExtractExtensions.ENodeTypeComparer.Instance).First()); Assert.True(cost[b] < cost[c]); - Assert.IsType(list.OrderBy(e => e, ENodeTypeComparer.Instance).MinBy(e => cost[e])); + Assert.IsType(list.OrderBy(e => e, EGraphExtractExtensions.ENodeTypeComparer.Instance).MinBy(e => cost[e])); } } diff --git a/src/Nncase.Tests/packages.lock.json b/src/Nncase.Tests/packages.lock.json index 3aa4e64e9..beff5e02b 100644 --- a/src/Nncase.Tests/packages.lock.json +++ b/src/Nncase.Tests/packages.lock.json @@ -839,8 +839,7 @@ "dependencies": { "Extension.Mathematics": "[1.2.12, )", "Nncase.Core": "[1.0.0, )", - "Nncase.IO": "[1.0.0, )", - "Razor.Templating.Core": "[1.9.0, )" + "Nncase.IO": "[1.0.0, )" } }, "nncase.compiler": { @@ -1095,12 +1094,6 @@ "libortki": "0.0.2" } }, - "Razor.Templating.Core": { - "type": "CentralTransitive", - "requested": "[1.9.0, )", - "resolved": "1.9.0", - "contentHash": "eHNqkpmNcPr5rvP/8/FFkddnvzVMH0BSyrq03H0VLZK2r1GUe3RgIgsoIXnImHMIrBzUS8gOwV65MfRPdYRi6g==" - }, "Singulink.Collections.Weak": { "type": "CentralTransitive", "requested": "[1.0.2, )", From 1cdea27230494de4fe0e4919b9734658a4ee4ba8 Mon Sep 17 00:00:00 2001 From: Curio Yang <39184746+curioyang@users.noreply.github.com> Date: Mon, 11 Mar 2024 13:58:17 +0800 Subject: [PATCH 3/6] Feature/update docs (#1174) * update faq * update Homepage * update link * update gif link * update gif link --- README.md | 172 ++++++++++++++++++++++++++++++++------------ docs/FAQ_EN.md | 59 ++++++++++----- docs/FAQ_ZH.md | 57 +++++++++++---- docs/imgs/arch.jpeg | Bin 0 -> 421719 bytes docs/readme_ZH.md | 163 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 372 insertions(+), 79 deletions(-) create mode 100644 docs/imgs/arch.jpeg create mode 100644 docs/readme_ZH.md diff --git a/README.md b/README.md index 7243bcbff..33d7ae948 100644 --- a/README.md +++ b/README.md @@ -2,75 +2,99 @@ nncase -[![GitHub repository](https://img.shields.io/badge/github-repository-blue?logo=github&style=plastic)](https://github.com/kendryte/nncase) -[![Gitee repository](https://img.shields.io/badge/gitee-repository-blue?logo=gitee&style=plastic)](https://gitee.com/kendryte/nncase) -[![GitHub release](https://img.shields.io/github/v/release/kendryte/nncase?color=brightgreen&display_name=tag&logo=github&style=plastic)](https://github.com/kendryte/nncase/releases) +[![GitHub repository](https://img.shields.io/badge/github-repository-blue?logo=github&style=plastic)](https://github.com/kendryte/nncase) [![Gitee repository](https://img.shields.io/badge/gitee-repository-blue?logo=gitee&style=plastic)](https://gitee.com/kendryte/nncase) [![GitHub release](https://img.shields.io/github/v/release/kendryte/nncase?color=brightgreen&display_name=tag&logo=github&style=plastic)](https://github.com/kendryte/nncase/releases) + +[切换中文](docs/readme_ZH.md) `nncase` is a neural network compiler for AI accelerators. -`nncase` 是一个为 AI 加速器设计的神经网络编译器。 +Telegram: [nncase community](https://t.me/joinchat/PPcEPZMLaTViNDI1) +Technical Discussion QQ Group: 790699378 . Answer: 人工智能 -技术交流 QQ 群:790699378 +[TOC] -Telegram: [nncase community](https://t.me/joinchat/PPcEPZMLaTViNDI1) +--- -## Install from binaries +## K230 -## 从二进制安装 +- [Usage](./docs/USAGE_v2_EN.md) +- [FAQ](./docs/FAQ_EN.md) +- [Example](./examples/user_guide/k230_simulate-EN.ipynb) +- [Colab run](https://colab.research.google.com/drive/1m8TTree096m5VHmq-Uc60gXyltVCgnRb?usp=sharing) +- [ *Version relationship between `nncase` and `K230_SDK`* ](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK_%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E.html#ai-sdkcanmvnncase) -Download prebuilt binaries from [Release](https://github.com/kendryte/nncase/releases). -下载预编译的二进制文件 [Release](https://github.com/kendryte/nncase/releases)。 +### Install -## Build from source +- Linux: -## 从源码编译 + ```shell + pip install nncase nncase-kpu + ``` -[Build from source](./docs/build.md) +- Windows: -## Supported operators + ```shell + 1. pip install nncase + 2. Download `nncase_kpu-2.x.x-py2.py3-none-win_amd64.whl` in below link. + 3. pip install nncase_kpu-2.x.x-py2.py3-none-win_amd64.whl + ``` -## 支持的算子 +All version of `nncase` and `nncase-kpu` in [Release](https://github.com/kendryte/nncase/releases). + +### Supported operators - [TFLite ops](./docs/tflite_ops.md) - [Caffe ops](./docs/caffe_ops.md) - [ONNX ops](./docs/onnx_ops.md) + +### benchmark test + + + + + + + + + + + + + + + + + + + + +
kind model shape quant_type(If/W) nncase_fps tflite_onnx_result accuracy info
Image Classificationmobilenetv2 [1,224,224,3] u8/u8 600.24 top-1 = 71.3%
top-5 = 90.1%
top-1 = 71.1%
top-5 = 90.0%
dataset(ImageNet 2012, 50000 images)
tflite
resnet50V2 [1,3,224,224] u8/u8 86.17 top-1 = 75.44%
top-5 = 92.56%
top-1 = 75.11%
top-5 = 92.36%
dataset(ImageNet 2012, 50000 images)
onnx
yolov8s_cls [1,3,224,224] u8/u8 130.497 top-1 = 72.2%
top-5 = 90.9%
top-1 = 72.2%
top-5 = 90.8%
dataset(ImageNet 2012, 50000 images)
yolov8s_cls(v8.0.207)
Object Detectionyolov5s_det [1,3,640,640] u8/u8 23.645 bbox
mAP50-90 = 0.374
mAP50 = 0.567
bbox
mAP50-90 = 0.369
mAP50 = 0.566
dataset(coco val2017, 5000 images)
yolov5s_det(v7.0 tag, rect=False, conf=0.001, iou=0.65)
yolov8s_det [1,3,640,640] u8/u8 9.373 bbox
mAP50-90 = 0.446
mAP50 = 0.612
mAP75 = 0.484
bbox
mAP50-90 = 0.404
mAP50 = 0.593
mAP75 = 0.45
dataset(coco val2017, 5000 images)
yolov8s_det(v8.0.207, rect = False)
Image Segmentationyolov8s_seg [1,3,640,640] u8/u8 7.845 bbox
mAP50-90 = 0.444
mAP50 = 0.606
mAP75 = 0.484
segm
mAP50-90 = 0.371
mAP50 = 0.578
mAP75 = 0.396
bbox
mAP50-90 = 0.444
mAP50 = 0.606
mAP75 = 0.484
segm
mAP50-90 = 0.371
mAP50 = 0.579
mAP75 = 0.397
dataset(coco val2017, 5000 images)
yolov8s_seg(v8.0.207, rect = False, conf_thres = 0.0008)
Pose Estimationyolov8n_pose_320 [1,3,320,320] u8/u8 36.066 bbox
mAP50-90 = 0.6
mAP50 = 0.843
mAP75 = 0.654
keypoints
mAP50-90 = 0.358
mAP50 = 0.646
mAP75 = 0.353
bbox
mAP50-90 = 0.6
mAP50 = 0.841
mAP75 = 0.656
keypoints
mAP50-90 = 0.359
mAP50 = 0.648
mAP75 = 0.357
dataset(coco val2017, 2346 images)
yolov8n_pose(v8.0.207, rect = False)
yolov8n_pose_640 [1,3,640,640] u8/u8 10.88 bbox
mAP50-90 = 0.694
mAP50 = 0.909
mAP75 = 0.776
keypoints
mAP50-90 = 0.509
mAP50 = 0.798
mAP75 = 0.544
bbox
mAP50-90 = 0.694
mAP50 = 0.909
mAP75 = 0.777
keypoints
mAP50-90 = 0.508
mAP50 = 0.798
mAP75 = 0.54
dataset(coco val2017, 2346 images)
yolov8n_pose(v8.0.207, rect = False)
yolov8s_pose [1,3,640,640] u8/u8 5.568 bbox
mAP50-90 = 0.733
mAP50 = 0.925
mAP75 = 0.818
keypoints
mAP50-90 = 0.605
mAP50 = 0.857
mAP75 = 0.666
bbox
mAP50-90 = 0.734
mAP50 = 0.925
mAP75 = 0.819
keypoints
mAP50-90 = 0.604
mAP50 = 0.859
mAP75 = 0.669
dataset(coco val2017, 2346 images)
yolov8s_pose(v8.0.207, rect = False)
+ + +### Demo + +|[eye gaze](https://developer.canaan-creative.com/devAdmin/model/download?mid=be978f1f38b8aa2f2b649185a10c2e9c&filePath=/upload/model/official/k230/yolop_lane_seg/yolop_lane_seg.zip) | [space_resize](https://developer.canaan-creative.com/devAdmin/model/download?mid=7d48cb68a499dd54daf0ced14549b142&filePath=/upload/model/official/k230/space_resize/space_resize.zip) | [face pose](https://developer.canaan-creative.com/devAdmin/model/download?mid=5b87c02b969a9e60d48b08e357c20e31&filePath=/upload/model/official/k230/face_pose/face_pose.zip) | +|---|---|---| +|gif | gif| | + +--- + ## K210/K510 - [Usage](https://github.com/kendryte/nncase/blob/release/1.0/docs/USAGE_EN.md) - [FAQ](https://github.com/kendryte/nncase/blob/release/1.0/docs/FAQ_EN.md) -- [使用说明](https://github.com/kendryte/nncase/blob/release/1.0/docs/USAGE_ZH.md) -- [常见问题](https://github.com/kendryte/nncase/blob/release/1.0/docs/FAQ_ZH.md) - [Example](https://github.com/kendryte/nncase/blob/release/1.0/examples/user_guide/) -## K230 - -- [Usage](./docs/USAGE_v2_EN.md) -- [FAQ](./docs/FAQ_EN.md) -- [Example](./examples/user_guide/k230_simulate-EN.ipynb) -- [使用说明](./docs/USAGE_v2.md) -- [常见问题](./docs/FAQ_ZH.md) -- [示例](./examples/user_guide/k230_simulate-ZH.ipynb) -- [Colab run](https://colab.research.google.com/drive/1m8TTree096m5VHmq-Uc60gXyltVCgnRb?usp=sharing) - -## Resources +### Supported operators -## 资源 -### K210 -- [K210_Yolo_framework](https://github.com/zhen8838/K210_Yolo_framework) -- [Shts!'s Blog (Japanese)](https://www.shtsno24.tokyo/2020/03/nncase-v020.html) +- [TFLite ops](https://github.com/kendryte/nncase/blob/release/1.0/docs/tflite_ops.md) +- [Caffe ops](https://github.com/kendryte/nncase/blob/release/1.0/docs/caffe_ops.md) +- [ONNX ops](https://github.com/kendryte/nncase/blob/release/1.0/docs/onnx_ops.md) --- -## Architecture - -## 架构 - -
-nncase arch -
- ## Features - Supports multiple inputs and outputs and multi-branch structure @@ -80,11 +104,65 @@ Download prebuilt binaries from [Release](https://github.com/kendryte/nncase/rel - Support post quantization from float model with calibration dataset - Flat model with zero copy loading -## 功能 +--- + +## Architecture + +
+nncase arch +
+ +--- + +## Build from source + +**It is recommended to install nncase directly through `pip`. At present, the source code related to k510 and K230 chips is not open source, so it is not possible to use `nncase-K510` and `nncase-kpu` (K230) directly by compiling source code.** + + +If there are operators in your model that `nncase` does not yet support, you can request them in the issue or implement them yourself and submit the PR. Later versions will be integrated, or contact us to provide a temporary version. +Here are the steps to compile `nncase`. + +```shell +git clone https://github.com/kendryte/nncase.git +cd nncase +mkdir build && cd build -- 支持多输入输出网络,支持多分支结构 -- 静态内存分配,不需要堆内存 -- 算子合并和优化 -- 支持 float 和量化 uint8 推理 -- 支持训练后量化,使用浮点模型和量化校准集 -- 平坦模型,支持零拷贝加载 +# Use Ninja +cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./install +ninja && ninja install + +# Use make +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./install +make && make install +``` + +--- + +## Resources + +### Kendryte developer community + +[Kendryte developer community](https://developer.canaan-creative.com/resource) contains all resources related to K210, K510, and K230. +- 资料下载 --> Pre-compiled images available for the development boards corresponding to the three chips. +- 文档 --> Documents corresponding to the three chips. +- 模型库 --> Examples and code for industrial, security, educational and other scenarios that can be run on the K210 and K230. +- 模型训练 --> The model training platform for K210 and K230 supports the training of various scenarios. + +### Bilibili +- [Kendryte AI tutorial and application demonstration](https://space.bilibili.com/677429436) + +### K210 related repo + +- [K210_Yolo_framework](https://github.com/zhen8838/K210_Yolo_framework) +- [Shts!'s Blog (Japanese)](https://www.shtsno24.tokyo/2020/03/nncase-v020.html) +- [Examples](https://github.com/kendryte/canmv_examples/tree/main/01-K210) + +### K230 related repo + +- C: [K230_SDK](https://github.com/kendryte/k230_sdk) + - [Documents](https://github.com/kendryte/k230_docs) + - [K230 end-to-end tutorial](https://github.com/kendryte/K230_training_scripts) +- MicroPython: [Canmv_k230](https://github.com/kendryte/k230_canmv) + - [Documents](https://github.com/kendryte/k230_canmv_docs) + - [Examples](https://github.com/kendryte/canmv_examples/tree/main/02-K230) +--- diff --git a/docs/FAQ_EN.md b/docs/FAQ_EN.md index 3360df5da..c808d8728 100644 --- a/docs/FAQ_EN.md +++ b/docs/FAQ_EN.md @@ -4,41 +4,66 @@ ## 1. Error installing `whl` package -### 1.1 Q: `xxx.whl is not a supported wheel on this platform` +### 1.1 `xxx.whl is not a supported wheel on this platform` -A: Upgrade pip >= 20.3 using `pip install --upgrade pip` +A: Upgrade pip >= 20.3. + +```shell +pip install --upgrade pip +``` --- ## 2. Compile-time errors -### 2.1 "System.NotSupportedException" - -#### 2.1.1 Q: Compile model reported error "System.NotSupportedException: Not Supported *** op: XXX" +### 2.1 Compile model reported error "System.NotSupportedException: Not Supported *** op: XXX" A: This exception indicates that there are operators, `XXX`, that are not yet supported. You can create a issue in [nncase Github Issue](https://github.com/kendryte/nncase/issues). In the current directory `***_ops.md`, you can view the operators already supported in each inference framework. If 'XXX' belongs to quantization-related operators such as `FAKE_QUANT`, `DEQUANTIZE`, `QUANTIZE`, it indicates that the current model is a quantized model, and 'nncase' does not currently support such models, please compile `kmodel` using a floating point model. -### 2.2 "System.IO.IOException" - -#### 2.2.1 Q: Downloading the `nncase` repository and compiling it yourself and running test gives this error, `The configured user limit (128) on the number of inotify instances has been reached, or the per-process limit on the number of open file descriptors has been reached`. +### 2.2 "The configured user limit (128) on the number of inotify instances has been reached, or the per-process limit on the number of open file descriptors has been reached." A: Use `sudo gedit /proc/sys/fs/inotify/max_user_instances` to change 128 to a larger value. -### 2.3 `initialize` error +### 2.3 `RuntimeError: Failed to initialize hostfxr` + +A:Need to install dotnet-sdk-7.0. +- Linux: + + ```shell + sudo apt-get update + sudo apt-get install dotnet-sdk-7.0 + ``` -#### 2.3.1 Q:"RuntimeError: Failed to initialize hostfxr" appears when compiling the kmodel. +- Windows: Refer to MicroSoft official website. -A1:Need to install dotnet-7.0. +### 2.4 "KeyNotFoundException: The given key 'K230' was not present in the dictionary" + +A: Need to install `nncase-kpu`. +- Linux: `pip install nncase-kpu` +- Windows: Sorry for that you need to download the `whl` package in [nncase github repo](https://github.com/kendryte/nncase/tags) and install it manually. + +> Before install `nncase`, please make sure that the version of `nncase` is consistent with the version of `nncase-kpu`. + +```shell +> pip show nncase | grep "Version:" + Version: 2.8.0 +(Linux) > pip install nncase-kpu==2.8.0 +(Windows)> pip install nncase_kpu-2.8.0-py2.py3-none-win_amd64.whl +``` --- ## 3. Runtime errors -### 3.1 Q: Compiling `kmodel` is fine, but when inferring, the error `nncase.simulator.k230.sc: not found`occurs. +### 3.1 When inferring, the error `nncase.simulator.k230.sc: not found` occurs. + +Or these situations: +- `"nncase.simulator.k230.sc: Permision denied."` +- `"Input/output error."` -A: First, make sure that the path of the nncase installation is added to the PATH environment variable. You need to check whether the versions of `nncase` and `nncase-kpu` are the same. +A: Make sure that the path of the nncase installation is added to the `PATH` environment variable. You need to check whether the versions of `nncase` and `nncase-kpu` are the same. ```shell root@a52f1cacf581:/mnt# pip list | grep nncase @@ -52,13 +77,13 @@ If inconsistent, install the same version of the Python package `pip install nnc ## 4. Runtime error on k230 development board -### 4.1 Q: `data.size_bytes() == size = false (bool)` +### 4.1 `data.size_bytes() == size = false (bool)` A: The above situation is usually caused by an error in the input data file of the app inference, which does not match the model input shape or the model input type. Especially when pre-processing is configured, you need to check ` input_shape` and `input_type ` of input data, after adding pre-processing operation, relevant nodes are added to the model, and the input node will also be changed. If `input_shape `, `input_type `are different from the original model, the newly configured `shape `, `type` should be used to generate input data. -### 4.2 Q: `std::bad_alloc` +### 4.2 `std::bad_alloc` A: Usually it is caused by memory allocation failure, you can do the following troubleshooting. -- Check whether the generated `kmodel` exceeds the current available memory. -- Check whether the generated `kmodel` exceeds the current available system memory. +- Check whether the generated `kmodel` exceeds the currently available system memory. +- Check App for memory leaks. diff --git a/docs/FAQ_ZH.md b/docs/FAQ_ZH.md index 04714cc50..ca9a21e21 100644 --- a/docs/FAQ_ZH.md +++ b/docs/FAQ_ZH.md @@ -2,39 +2,66 @@ ## 1. 安装 `whl`包出错 -### 1.1 Q:`xxx.whl is not a supported wheel on this platform.` +### 1.1 `xxx.whl is not a supported wheel on this platform.` -A:升级 pip >= 20.3 `pip install --upgrade pip` +A:升级 pip >= 20.3 + +```shell +pip install --upgrade pip +``` --- ## 2.编译模型时报错 -### 2.1 `System.NotSupportedException` - -#### 2.1.1 Q:编译模型报错“System.NotSupportedException: Not Supported *** op: XXX”。 +### 2.1 编译模型报错“System.NotSupportedException: Not Supported *** op: XXX”。 A:该异常表明 `XXX`算子尚未支持,可以在[nncase Github Issue](https://github.com/kendryte/nncase/issues)中提需求。当前目录下 `***_ops.md`文档,可以查看各个推理框架中已经支持的算子。 如果 `XXX`属于 `FAKE_QUANT`、`DEQUANTIZE`、`QUANTIZE`等量化相关的算子,表明当前模型属于量化模型,`nncase`目前不支持这类模型,请使用浮点模型来编译 `kmodel`。 -### 2.2 `System.IO.IOException` +### 2.2 "The configured user limit (128) on the number of inotify instances has been reached, or the per-process limit on the number of open file descriptors has been reached"。 + +A:使用 `sudo gedit /proc/sys/fs/inotify/max_user_instances`修改128为更大的值即可。 + +### 2.3 `RuntimeError: Failed to initialize hostfxr` + +A:需要安装dotnet-sdk-7.0 +- Linux: -#### 2.2.1 Q:下载 `nncase`仓库自己编译后,运行test出现这个错误"The configured user limit (128) on the number of inotify instances has been reached, or the per-process limit on the number of open file descriptors has been reached"。 + ```shell + sudo apt-get update + sudo apt-get install dotnet-sdk-7.0 + ``` -A1:使用 `sudo gedit /proc/sys/fs/inotify/max_user_instances`修改128为更大的值即可。 +- Windows: 请自行查阅微软官方文档。 -### 2.3 `initialize`相关 -#### 2.3.1 Q:编译模型出现如下错误`RuntimeError: Failed to initialize hostfxr` -A1:需要安装dotnet-7.0 +### 2.4 "KeyNotFoundException: The given key 'K230' was not present in the dictionary" + +A:需要安装nncase-kpu +- Linux:使用pip安装nncase-kpu `pip install nncase-kpu` +- Windows:在[nncase github tags界面](https://github.com/kendryte/nncase/tags)下载对应版本的whl包,然后使用pip安装。 + +>安装nncase-kpu之前,请先检查nncase版本,然后安装与nncase版本一致的nncase-kpu。 + +```shell +> pip show nncase | grep "Version:" + Version: 2.8.0 +(Linux) > pip install nncase-kpu==2.8.0 +(Windows)> pip install nncase_kpu-2.8.0-py2.py3-none-win_amd64.whl +``` --- ## 3. 推理时报错 -### 3.1 Q:在编译kmodel正常, 但是推理的时候出现 `nncase.simulator.k230.sc: not found`的错误。 +### 3.1 推理的时候出现 `nncase.simulator.k230.sc: not found`。 + +或者以下情况: +- `"nncase.simulator.k230.sc: Permision denied."` +- `"Input/output error."` -A:将nncase的安装路径加入到 `PATH`环境变量中,同时检查一下nncase和nncase-kpu版本是否一致。 +A:将nncase的安装路径加入到 `PATH`环境变量中,同时检查一下`nncase`和`nncase-kpu`版本是否一致。 ```shell root@a52f1cacf581:/mnt# pip list | grep nncase @@ -48,11 +75,11 @@ nncase-kpu 2.1.1.20230721 ## 4. k230开发板推理时报错 -### 4.1 Q:`data.size_bytes() == size = false (bool)` +### 4.1 `data.size_bytes() == size = false (bool)` A:以上这种情况通常有是app推理时的输入数据文件有错误,与模型输入shape不匹配或者与模型输入type不匹配。尤其当配置了前处理时需要检查这两个属性,添加前处理操作后,模型中增加了相关的节点,输入节点也会发生变化。如果 `input_shape`、`input_type`和原始模型不同,则需要以新配置的 `shape`,`type`为准来生成输入数据。 -### 4.2 Q:抛出 `std::bad_alloc`异常 +### 4.2 抛出 `std::bad_alloc`异常 A:通常是因为内存分配失败导致的,可做如下排查。 diff --git a/docs/imgs/arch.jpeg b/docs/imgs/arch.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ad986046bb59429aa0129d8f3f64bb8a73f37436 GIT binary patch literal 421719 zcmbq*c|25q`}dgzV;eJ!D26eXW++g6 zu5Kw$U%wrCw?x*rOdA~DEva-^S?{R93FmVGmm-t%pH;NYa7sxZJfuSL3k)l-l<}`> zX6{wh4Vt`>M~LW%+W7$Rz#!mC!q9*=@M;3)2rRM>t&h$ude&^~usD{Y4+K}PYhNGV z+5yIwDfIkMzVp{{!>mw|3hkupcj!+Bcx#~*qVPZz@6WuNw8kBv2V3?yAYV?0OQHkK zTdh0+Va)6R?;1@cyC~bJ%_i*9n#S1D43ZT}TZ7RJw${Y`*XJPBOtF!*&aF-RFO(Yu zjK-8^uH-0sF>!O*=Ejv{?MO=z&xi&9C)s#8?}PZ&O5ssI4q|kL_(tMoSe#Wnlu#Dee>u z;vt|EKL6y}aGW_BJp!YX&x8Jm*8te3jxar`T;c2r2n>fGCOGeNpLm}I zE3i$4MRcHYSPuHeXI%F)2c{80FKhU`Qyh^4L2HG2+S7EtslD6zdp_n9Puug1C)n-) zLtFOhyBkHH>;Mlp>c;-<=WLQeyR5XvM>=-|y@d(C5Gs@l)6MS}sjiHfKYse0W z4b0;-0wd)v16%-w`rGL^&I1}c4wdCD!n2q+*s86vtp?mx${Kw7m!mmT%s!m{q*b&> z)Y6b~hOpgJFuD}nCNqKCD>kwKWkZe=SZ0xhC4y_opeaOS-7sSj;QH5bu{qjm+ZFOf zYvO5WOdDL?>CBmL(v2JH3<<6bQa&$L1-(F{Eyu)by+JI~61^&4(@P~Q5{fz7h-Snh zYc@$_yE%7b&Ugb9C($S~+57QvRTJ@1Sy8&g8>o&6RhoYT;7=rmAPAmKS+oyHkIrMUAk0CBYgpxb)EoBV0=fVhF+!LLo=p|ga0=<(Msh8M3LtxEWvb;p1y=slJ+7zUU7CakWw0(7>y+KD7 zTGJWhBa3FT>YV9J{&b*S!2_o?zQ&?P6Zi;zuTv{NOYR$UrFjt(bchDEjh6$N;G)y~ zs0fz*)%~~CyNd@l4Ef0vv`Ke*4}w+ZA+31%#;A_~`(~oFKh0mt(Z~W#Na&W;tlt3! z%mYV|*j6ON2lT}ke(uJTMei+9Opc2S&cZo0I7kgOTD}`t3l4{UM3ssJ_Cg=4cpaU1 zTPPcgY0?rlF~dOuv26w7?|Jqjbw*P{Pc6t9^;`AqRh>6y?ErHCb`U)SEZiiXvNkV9 zb*jz-BJ7L;v=|8*9nhkA17O_@=sM)!RvhP-OOP8(_!MuUNF}#O1CVLoR~^ve4hAf( zN`yBs(xgXp*9m15_O;;^9R(&*vHpv&Mq>?xKU)4rmtw4LOgxT4S3!#nun`@i)hs0v ze4+H58ZgYa)&Y&YZadx7)|+pYN|a3k=iHM7rk6sLa{a_zM5^GtH96HHgIh(Ei?vp|eYbRs=nyt%Eb8LjPVjP?8FyqVtieJ@hDo^>N*}gU z&f6N*5iN|)B6XL5NPgjV*n*S6&AA?DRt=TLK|rj!)Iamp^SNL#(gMZFrE8o;4$qS` zqr}H(9%9keeKP>SOVuEWQbjm$07vadE=tvaNjEr(Q zuiD&mM(uQZ{hDeMf=;eqZQ_ASd_a|Y5{;*EHAON;lyEPBUrOFx&TE3l>s()sv*{=u4p>&&Lqgl zoVP7+j2N+Ilv&}7nAa*BA+a}FoX+J;QT5$*+>3USZtU~3>#fgqt zAtric$XC^8Pu%RnIpWHyt? zS5%v8gfo|YsVb!%^!$LEyH%A+v(k@?+H&Ah%b_vR0|K$KB{D|3kbbQe&o1+E-^a(N z8KsOi$^0~w(z!YA73hO98NV!wS_(M|P-P!`Q9T+DwQs4vLrHz3;8mvK!#bMps+XHA zO)ezf(7~na>xF3nzN98yR*%Fe%T`&Zc1+1{>>$Lf#F;`%Xh+Y85hK+|g}{`E*ThYK z6$lHtk}vlu@0Nw_4gc50il*fpZn^GR1#=}~Gz|cyJa?XY6@q45o@Q_@Fl5eVmd5b5 zDHRhkj#vG%P=jaVu>%mXQzI@v<+WK}+7AR@=F81yDEc8K+xn7SPpqVxS{vq=$dlXV z94U|xRDsi0QcLy%`)HMBOHVR{gL+Z`~fj@FALt9*#+*1=t+^Z9O@GH zW{#lTk6h!h;eZ;5pr6!x9CMB+1LaKW*m@lfl`#(lV0@V8VKv{~jVX0ZF0O7VeJwQl z!r3>tZN&aT9R+i}3K=4tl&i4>G7|{1w4+9R>kWjVJ&P9!y8el6&!^X^%Vv4ltk?T{ zy4l({vwbqZ6U;H3bINR7j?+s6P?`+I!xFJp{p2AZi3Ahzkqp-89CREiFMt)rN=vlC$=NvZa0@XDqBcBNvmUTj zh{U_fx)Kd_0n821E8poQtl%@n(!yFwrbqCp%8<_2kAzy&V9R>i^kz zvg>-E{SNScXq)fL(@5^d^Y9K7a)h=#Ed9`t#N(ftTVv}YUlY~h&v8DVkMY3tXK|7mpl0BYpex}tgW82fO<+TDr zzMb3wtRJ6$3V+A;&ZoZ8&_ed8??4rq_os6Pzo}B#t1fm`YGy28j^b^)@*~IEQvaZA zF*Op$8SlgbI6$6q9#A7+0aWtkmd>W=94skrib+yYj9v#|RWj%qqMk1r1whcHH8EO2 zbzju%W8K6@L~_Zh6Zd@<*j!V^VnfGK&nX2Wn9CguJzuE=mTs+|jw~5<@My=@EAMmM zX>@f3YP2410THzW)T2@JD!i)mv?zo@etL)Epb2ds2QM98jC!DEMOY52=H1M8L@6Ms z)M3h2NctqLq2%u1;bCUUE=Po&ULyKum}jbM(332Q`mu;u}xZd_VK| zx_lB?8S%|ZjvAlQRp~%RM3+VqSuQzz#wVR%+Umrg6~&v7d}BuGg3#Jt!ZIQ-I*CNi zh05AG@RplcxcTzexMf(_OY-HKG}lCZ%#eT}BYn^?6fDhW&q(rx>B6LInTKWsOv@j) z*Y;C(AIxH^?lX(2<%kD}_fz88n7o_TBXu4w>7^p+0)a^$dVCYIrfW*vfM3SJz#grN zS985%5QfK0si6}zCl5epB_GtkqvDV!LuPBOWZWuun@+72oSMHcti>lX5Yq=Ap}HV2 z(32}P*U7^NznW{;*&~%K?NWdnLm;b zVq(7BW7>uCz1NslTzz8l`U2qJq_P$8U1B-=F{-_l=1dZl3%i1k3Ye*LiDBa>z#8Lr`3ndaii2`eSqYCqs z1*e&<3nL=*4z)VjFSOm4`T%zGCQ&NngRCo37o|+p8$+WhH52V!RL=Y}zEvxBltaXz zg(c(t@zU~J*#g2OWr)J+*Jue0tM%}pR9wD^AA9%y*X>4Uh_OyadQyyNC;^aCpf`7U zS&Uv?1cU#TL4}VJRyEM5Q|hSxc|y{RVw$RG!8C2}Q{y`%3nE-E-b>|bJ*OpyVGW7L z@#Je`6)&rGYxNS8u{n;twYyQcgTbXsO>Y4NdweEtc6TU%fG{PMamB18;-?fYh#Z{v zf#BtW01)q5-8x}$g}Rn?st61$Rk=HnfWN&p*63-OWTkRB8)9s0+#FY$=~z4>Eo!*h zgD-w#aWL+gXe15=Q5es`kgU;Q8QAH_{MeA2NnMR(r{`aKVahMOwQuQ-Rlk!q$sn6c zUoqOB6JmwoheXqjEud5y4e&bjSxBtz$j^N{K*{h~FlpzZrzP0JS{831^%PXi120rJit)5R*}q;?$~&Yek)R#WXtvXbc8 zi(7c2??qV>fF@#^+eaN?Y#~&Tb|V&W095O78;l;f;63`JMKl&wC_$Z3g~U21OyIO~ zAdju`ujTz*J9@?>-!X0?8Skp!6N}0nj!l=5GA~$hB*$X~4@&poH4xO*daJywf@Jcc zhl7d&5^&OEWi-gA_2NfN%V>VSkp^BPv|-PhpwGs(J+%peah=?8j&~#rB0Vhp0uXur z0yjH|5wr|-uIHY8uDzWQJ~AFE__0&PB5&8@R8=h5LIUZCMloRDj3s-d4@}Sv=p<-u z1<3xSZ&?Txb*Kgu?|jXk&u*Doe}7 z^kf<82%vEmmPJ;ElB2Tv3Mh^W+!-_DVd)(}c?Vc#HNGjd+o04L**q+ojA+Y5FYV#_ z6&S6^rTq+*FWb%8N^?nxtH!iebue-orbNnEg6H3xpFA|6v|!_7)6KVAxy`Cc+A!|} zLwQ;xZtiji_F+{icN&-PhIMI2fFCs`QpL2~StH%|#%H~Hj{v}2d?>aoJkIH`gkOq{_n3Q}; zB+|8oo1l2D7CMkm@SxC@0j_z|58_?gFYSb1tw(q*W~*Fes1+N(ksq>sx^NmVJr|1! zr(}^ISkiJZN(Lw za9VB+Qb!YUwgc~4qv2j8MXHHEA6hD=C%1&}d?a!Q2q0hK5&@$alke^~bCYI)5)?FN zkkRsE=(8Ma(&H6?Xrbx`KL+F?Gvn?LEm0kQGsbz9dM?8CG3etVJ>eqDsYd5ht%HXf`0*D00nDfH6n2X71ftLmJATVBE7Em-VvKrw#qT#GnxAn&( zxW?l@V(ACHAS*c=v`3?%ed@>DFSU7pPiUJV=`Th zaW|erUtkte`YL=y_U`hB71BftmD-dp$eaakAY+N5E!IK;3sS7838=&>3Fj9^bL3C2 zr?;cPV@8pz0)ZgSQ8Rmnx+KcxaT4n!()BF%x)(P^Lt1?kRhQG~EnQREk!MEYTo4<$ z9e|OT%coNVO&#Eun2T@=*>^|A>zDl z0(Svqpv$U6NvF{L82whJ#>PrWV!D)MVgFr&&D1&yYKj<6cNy@SS{42n(ofx3BO zEhxHYCk9t(J$Vq)v;)j648Xhtg7e12w~zbLv)Mn+C3*z!0E-N+E%2(Z%@-00G{3~! z(Gjht@y{O{`D*Ba=H1&p z##-G>ec=!;5;YDo?8WGMlGw!RX2kdoz+8;prsumurqW5lN3lIxFE{hWzOCssh|SsL zj6021m$4czhBD!Ro)eRAZ3hV1O#KPPX{KGa%)@Z&6cRyFS@&Rlt{Ss^_*E=J7^ja}$4IW7CMZpGOrCQQLF?t|InxHKKC#$;;a-Ge2P)Lp1=~UuvMk zf@bBWvCTlL)6Coru#nPWXbms|$6qwcY?bYKN1@+DI$}Ni5TXQ2@O6`65kv(SHq7l$QS&Yi#b`ZNG3JC_k}>fU^JY9LPfK2 zn%NRPuoJ|GMVhPn)$VLHrto@*gkhDR%3SiOiumX;vRi2DFp;w&uK<{ z3N5;GSY;oI*)l{X*35UFZ_Sw>q6wqJn?_6kO^5x&fYcU)MX+V7*SivD>a>pEsN zcI&Lk^xDCOU)hB-As-Id(asEi;HYs}?M%zOyS{gq!MoDI%k9|j*AJMF^|x-LKfn3; zZ0nG$n_|;fVWbq(BwvD>FZMZ-!&ku1k58t#p}F^k9hqZd6{}H@5$mWJFA|L{clCp(#72FK!fdJu0D z2k6lYfQA>KM&2a@bQO$4HCJ4F7UqtsJ}9 zpN{c|J>VT5i;8*jwTq=$0+-Mq&Gb`8YCnS;#kTrBAso_Ogx~X@%JeE$IjXGbgh^XyS$>xgI5j%8mB=qXX~}w)}TRsSyT&f zII8s4_k;^~hUD+&${a*mr^cqdRGo~cyWTcL`I=pSGp#Y|b1|FrAEQYJmJTlE4{ z+T31px3r}ik8^_C;aQKm8Le%-0>{bmR~7d)8P2cWO9zwtj2T6B2Q3U|PF`x8RgB#W zgTw+NX^4g4$6LsIwDYgXnu6JPmL9T|8Z@Tt|EX5lD5bM1zx|+>Mqpo+>$BvF zfLXz>f?3KOoH8}Ir~OH?xn(aZH5&_RaH>Bw99 z)&`E>ZYccc!X^9xf!SXKv}g#VPoFMS1c9_@XoGW9L9q@@ND-LR^1z(d_!F{RE88ch)GGPckke>fuSm$*%0H9g(#dKZXZwCR@?e_uVD z#a!Zm1upBsNgezr3DXWZHA;bA0E}dX)Z~Va0Et3rPDtakrg*_a-E9&87lob+m?H-O z&mCZxmAK!Lt{(Bq87G`TU_;wr`#+`j-(2W87!u$%w)`vOJ|Als z{R2xk`p@V7*$Qc~l8o`IZ^I{Q;g@su5qN!y%A|}Biw=%Rj1nXK(sQ9On==zm4NrnU zVcmvpE17|3vfZtufOdzW1n*Av0iBj&$~O<){hnym91Fwle!Bo0Z6~}CaBOo zdjapk0hH_vfl5tiI}rx6s9nVE5eglP-nUJgwPw6P|wg6(A-SQS9XI=INo+Fq{3q^anpQ;O>Urghy zvoAhvsF}!LRA=d@ws}Q5@q)1ER z?9VW56wPV$P=P!i$;C=p6H;9VKHpHckdDok&AhJHPNZ&Tad&`Pj1%Jl3TfQd8hQMX z8~4SN>;3#6de+s)A`|aa2{`d`Ubi0@^x(=5b5}hPKkZU*TIqs5c3*u&Y8_{)^=%7( z2;FM-knEpZ`r|Hrh3ELG%mZ#Lbu}H@`I~vvsC!1aN#24MC4Nh+2Z%9!<6k$-=Wg}K zcM`eS72!?hFn}ZW@%^9r`(E6v+Ev=6+WqMJ(EQ^Ena|=hk6sBk(y-w-?YodbF`VZK zcw@(kFBVXYcg9Ru3X^js?-uvr^f*c6CQAedrnQEOpn5=R7BsW6D%+gzbqlsUcTw}v zB|Po7fU!?NIWfvBoP`bTd$0S7lO<2cCgdEPpi+O6L(Om)-TOtPM(YkBK0I-OPYaYN zLEHskj^Kz7*p>~X0((~h7^{RsJNu%FyzWAK6G5jy5{LL3Ni)}12 zVrjCTZ;$2PLMg}w{_>e?GtqOJ7S4=nM=3;2i00WDR`g^>{QqEV_r(9s@Xd0-fgMMMFg;&r(yYQ7 zHJgzD0pjkNia}MuB|_PC>mss8lX5q-amT(ytqRs^LNSNHS-@C^xnSc z>C9`ojgNJ!tu2!l-pXd*s`>oj&N+MtO2b%`M@AqW96ef*!oKYBtZF{}|D1gOi~o0r z%dSv_QCIn?oAG%$_%YygfW`PFj#V_tVnurIq;DnZ^*zknEmW8+bo!}JhV2|Nn|-g|$mAxcfCPC=IEtx2qb|tsmihg;oWH(C zyb2C$*jkVFfdJwSH`ZzZRt@mux({ST1-a1tFDGI-Y?DI%kLBI`CoiZ5hlsCob3;3} zdNj?;?A?#=e1ih2moJSzKiN#p*_8{oGrZls4D42bKJY7nUSc!TIdIX3!NGz2BNsnu zek&G?hKP=*laJL<6U-ahNMvO+?v)#bo2Sp!g1seaM$(3F8pu2 z{~cPncprV7t*?~;P8Me|Vl@>ldIjcX>HVQpb_SDX)FQ2b1$*^Pm?-|Dqy@mA$|3Q3 zW~xXlmqrgFM2*P(N!HwtWPg883;7=9JY%Yd3Efcn$W%0RB2uq5b~&OLa5Yk}H40=_ zLwO<*9<zs z-*&9ZIH({N{Cjk-{Rh4$13e}7;E~!MT?Z+APqPg&xV31zExdHwQ3hr zFC2AJjP@cS2aUxdZ;a&6u(I~Kb^*!ftX&cXmBNmc{5BhV zH2=nfw$HrC`Z|h3geCZMl?tK+Z}ZbQBQ?l4&pH0RU}K5I+ZKdIm+q?;eMyQ5?|?nJ zWsPSux3NGfe??`HrhynBNX(3cVyHaY^>@1l(s|Sx6_%)Q;4ixXtun}$?Fm?!7j~?8 z9ps6_GD4NBVXH!0Pj`UebnV%{;e*;-Tb)3fJw%9iBnCa_F0UW6sS2#<73ja%Z7e+% zRs|5!Re*)zOMlUE!El2=b%8%{ksv%5nA}vt!9Z4Jy3pa9|@enu8st6)itYv z1x9Pq!B8gvjmDPWSQVjxvbGc$>tr%H*cp!p_0d0b)Nd(mw1@mp*!HSo@5nqlKeoyqCH&8#FP1!*QXeTs*;ZiEF#k@$sKm{}U!T zeu4stH&NjQu!;Pc=n{1M%b(Em*Td(^GNri;q-A4@%LJ_`=8%IM)}+fVY$|&N&2*_7 z0-iOz{y}^}AH{Ra48Uaf44}VnR7lSS>kbg=;2JG3?Xu{a!yBMlNEKoC=_7$7XSxh^--`My}WJIe(T4>iZhA^*TzqFHIh1gR=%oSE^nd0 zooRx;rUytOz9#7qig^h&LyrhftCDl<>&_-m$#9&k7N?z2o-1w?i52ziOsv{mY+z)r z)+#^R^=GMF_=;WLsW-^2a!FM14Sm_PmwoBB!NIPJ;al}?x!8=-Lv>?^4;FQ+MVr{g zog+#yYf8t=!Y8HDj>VQ6Wz{juR*7-pX}ED??(@;Iu}n}m=W+a_Xdeoj{1ApV-@4Jq0;(vr^ z<1flyBIR^f4SiH%qrH4;M~j_^fmn!>H64*>6sUgbFh{T>fEbp4`g1a;dpCdki*LHS zOt*qhb{U?soq9D;DL)!Ds=xfQ(6b`5M8}#rg7h_5m7KQM{c_%+dOzbLd() zcZXs>{*tw#K|*n7l?!sbjj|eRAA5%MNFdt$%6yZwvUi^hA*uxi+5tg+qrRG#SiktE z$U$5e4@}qre%#^?{Pclic)S*L>eIEvznd}s*P{{t2ZWW?2A}GMp9B~kVv~PG$A73b zCn-gF=CWr`Fz34B!f_mIW}`PZiAL>61zOZ7)sF^H{St;cIL8QBi zIr2Qb;sf4Tsm|b{QE(1N0f5Hl*#6%^9Z0ZGX}#Kh&@wi<1GFxdH3r#T3AQf@{Uc6$ z->QJ!U30^5U)gBX3{*x>cvfKkp(E2QZc!{ zX0#xht5t~+C;KvB&H$TZ0jNRf;+#OzZ({#5S50>VEk9W{ujRl{0pCKX!q)v8?+-N? z0_EI)Wjf|8YjygMWez#_4>?J&*+|j4=V2+k7&W_KBwP=II3q#sp&~ra@^zr5*SJI} z^CIuK#{Ru_(p(i`fl7#PwC^avL8oS|(|y}w&EWQLCtK6rxW%2g4$44@%fA_(_TPF9 zABto!Z{h10eo+J-Rwf>+X(47dEaLffc8?TMzG=p5T?n7kD^*@xN-VDBZ6vEvEw!;0 z5F=d=HVAJU5GX2I_a_PA1zTN?{Fy4V0vJ6fBA5Vi5+6~!mmpkxzw^&UqC)lbxp8lf zYe8UJBFTQV;r`#sumzRBGE9vu=dD1bYLvRMloe7+qAwt_P_f4!!-Xd%3X?kcny`_2 zv3QB_YCD;0$ag+}HCD9$TP^Ib?9&L=TR)qQ)NS?u1Upv$r-lnyKwisz`BpGXv`gzy zdL88aT%_IUTS%IjOb-ws^;-6tqqQP$pH>+fHOhel#Y+I-8BZsHL(RX-RUn88z3%w$ zRPgtP|LDGf?EDh)ZP8)1P4PceI1L{$(s;<`^N1B&&XEkgY7cfr0iUxFOCi53!#mEt z5~f|!Y#h$%&AsgmnCIFf!K;5Pb@}Cq?7GspPUEs?DwleF#{Aj4)pi%>m%7&)tshkO zcy#4-wb1gyM-2>$kd8LU3y`Ymm~%ZKJi2UBv4LSOA9RWF5F15&Zac2fA!%M2>-W-J z<1O|P_vh5Wr~a02qX;QV-_KFQ!Y3Q6X1E9M!qOi4S#)WDg2_Dmnl(UE7R>qfjD?5AUOHfYT}%aF!4Q&O!l@4*=Ktd#RLzl_o#-%E`D| zN?q4sgFmpl{L7Cj<2d!mWr@e~z9W>qNvll!L8)BQis_3^xY)<>T7~NhiF>yzXFjav zhnBPT4A!V&hv77?!~oN3`R&DvHy0M|?toJszP5HuHFHw-rGAk_kb6xAE*8gbH(3L0bGeQ?Ss&lPX@{SA-57$ACSbPYO$P^YN%0 z5JZC_YADeXdXC7S#de`miPLv}QSLu6`>${8zEDy-y%;E%aEIV7tINIn90A3b3~(d| z557o)Qscrdq0v*v(0Y}Cgq3>8ZV5j!S;w*p=2dJ2iX)5N9nj?%VAS>;IKF6@j44q+ z=va*-x%dPcLoY!h+zPXL-^@Uto$8 zWjd9vITE7fr@K$bYtMQ%eu=ZIqtqeFWstWuFz<}0xsOEyUmlgo zurJt0@ky2<%_PljVSoiKK0Utoa8fU%ro{yXz{9c4TpI^5g+!WPSS&b+0_yyvD{weR z66s>XaMjnbfb1P$gEM;j{^AS2V&jQt)2M~hoRQtt>W;K@vYFLe!$NqU(=Qw@5fiTY z+@4AfEIm&}AP@i*JfbE*-3kip!byyBO=XLyU)2cgk3MkSl}miXR-Rt^{Bc&cjHGpn zEL783>M2iXM59McdI8_a8j}du;vfL5GWOCxcdThwzb#5KKUqm+As|^IW{?br=bLvZ zBfVXL+%?K4$jj+SP0~Vb_XUu^ff(SF1Jqpgoe_G z8n4YeI)qHWp@`eHdzrgTFIn7-3{UhW?%T4u^PoOez^yqiT2^L^ElrJ|KQ}p+)9~U6 ziPoph_|iii>+T_!9Ovp)Wb=+(G&))Ao?bk8>B7TZH#-G=J{)VlGxu!P8Iutwgtm1x zIoLkhaDF}fxC=vSeodpx(80_@<7LBvq$+&5@oL3}GW;$JE4}}m!N*wrI_a|2FL6=9 z*aH&YhwmJep53kAcn-%56VlJ5XJHSr!|U$3pxr*4GN?Ojq}J@voL5R1)4x!8kMwp{ z@m9@p+{v#xEjF{NJs)m&UgqBQe$7mz=9#ilTI>~1?W*tOzg-3NPp543W zM2U@cpe^z^yr2C1@xG9=7oWfxX?NHBo8DKYz7SD7@*wiZs{rH5Na_toeb2Ya2W!=A zUkX>smOMx*tp&cIa%DI#1z$|lSN%A9r`%7h>`<-K$J?WCIv6%Lm_$=Q#`IO*-0!SrXZ~Gg%KnsNQT=g|mlM~Hr7SnN9A@%y39QZ%yLL-Y%cWor zIJL)()_p%5w_CaLGjeDqAl%)c6SvZ1b3y&$WZgvF(Ei5Dj6kuc-(D8H?rw11N0d2P z`n}r6V?L68?OH%gKI`js!m-nS-&Y@2%;?l}-#MK7)LUFB+3iktySiiH;pUbl`*O{?vCTPz|;kMl~!R`+p$L#4p-!JKs?Rs`$m&qsT zv(xGAgl}Ku-9CB`>`{7ka$5PboT%=|!)Zi}N%h56*R1>LKXDbDH=Z`ARX@0+oZ#_QUJ+gT3mjp6+dpICzs5rvayejE)_Sfl!aE_d0grvxU)%Q%+;r?k>mD zJNeG<0H$~DL=13!KXt1kS@AY&{GPK%T-0EL!Y<)z;Zw;%XNS1i+|g|teD_qMX`%1S zx#XF~T_J_s$`Lo6E{aR_xs_FTYQbG?Ri9b*eylpnx?p-j#raqscF!2MnKRpqVc%zU zdrcM?$aLpYh+$o<#s zcDJhA2YQaBd5j?Un4B#-c|v%kefLr2-reuHwM~QsUm#zkUF>;G6p)~Msk+O2D>Rky zcF8b4WZmI*N@gNGHGE?FNK)l1jT@D|w^(*@cNRR1QkJts9@~zNOrFkpSYu-Alf#>F zN6|*txjW2fv~Yj;y(5IvT;EKk44bEVGmKO9Cm&DHA*lKIxu1Gt{ed>yKeYi=$@g>L z!q1QIo#=aCG_O-6>VL;~*FDd;()nH?8|?jy$>_?w`Cc{Fy7K$LcY|X!XY4iXW0y_w zDB`^%xZF&?-TE|GOlbyg<#=}OqfdqM*!?o!j-4)<2-x2;$+9~&(#iQS_(B2x?3?9E ze4Ssp$NK3X$I9_)X(nUCT)Xm1K1hG*!|!zx+sBe?IQ7w{*Ml$ar^My!4klx1tJw0X z%NBmvl)|raF#E!GIeVeFu9Mu_B2z}nCU^&ly|kla^~3ZRzF!EHMq8=pjH=|SfMzy# z!%#bgR8DyMImDZC84xoL2J^_4SOSijvFcKKeBV_G*CgqSYe4AT7?}Ahf)+1I~|m_`a-#% zf4!3N_M_O-N~1LHOQ$m|v2BL6gY1IcKCc6B4uvhqg&rz$ncF*PbZ?(q`LVgRX{nL& z==vQ1`mW#y?9RenOIOh?iHAHd-6smvUskt@F|i!(Ftd#d4f{1cy_I8ccAoUMJpaMw z;=W_|rSfLSDjOAVwyO8{RA&-?rrAxs`@)YEH12lb{?_x&<;wdo$g9vQNqGfWF9yiuaPb_D6PNog@HT^aSzmfh){Z;bhgB|XorrRc1E3BqT1 zG*goI$Lly>j6N=8X7+sH=O+8Rr<03S3#DqKJvQb^Ppf9GT~;Q(OAV3D^<`!H#>&>2 z$6#9a%KsEQJ@TQemD@c+!Hr>`V?x|@Mu1x&vX`PB-F_$P_0asZ*-!Ve*0&df^laRC z+m|gfK9Fzk?&k9?cAxHbV^$_*WhQDgk(}I^o*Pf{c#kmMR1(?8o@iFHKj4inyoU}v z)mHO^6ZYiA0mE65X>o_NHrFMO_j1JDQE9Q$p6v(TSfIGO)Kh~bUk|!)?)nx5C7!wE z=)}nDK&z&6InRqyp&C)6ULrwj%>;_&Bs#78Fj;_YgIRcNB;LxS%B77pR0y+5)TwSoRRPzW*XIK^npj7N|5x zME!c;<7Pl?1lT@BNiB0hWV)nN2tx5tsC}QtngLx+i{O_D&T`hIr?(L@t0dM{m^0Y= z%&69C|Eq6tuu%Y8e>!T@ytT~FkG2d1H!S}CBMuw$nEdmW^ylVGfxt!@iEO~&`-FPj z^P0ly(JT-f0bgPln+TEv|IC0KpMo%i$>%#pvhp)ow;SAE%NKtUgdA>}ndCXVa?%j2w2QiFbM^BxWhRlK;S*uSr)wgwWxbpIo zduu|-nW!n8WsP~-AT5jshqEkk#DQC6A$Y&h-2d%M!ug^+gEcj*0Wi)#SKSu`KZ&3hemYwZ9tENCF z>kp0|n;G|-9e-){N&n7;#J6lOZ+$8~AKd@-nGfss#UAI*PWOysUnPz`4|v9XrjvR? z;Kbmx($d39sk4R|@6L*KlSt+kURf7gBw5Vj@L;-a)pBU>fpbbB5<-|Fo%fuEF}n>c zZ9-ojGsxJhv}?*K&+_h%9AjzaUYu*16~E7;2&sf@>CeP{cTRjghE1;8t@6yKy|Sby zz_qPMrb786-b;2joh`o-<)?4|$n7}p-U|uI`Pa{kHFR1oR2$k}h`;!Qb}KcK{_ydq zoBMT)KR4pf3E!1>y@?;Y9O(AusLkv8a|@?)-*(-;^lk+gr^qRB>6xd@>)Go3w{GtA zOoYL{p&nV`Xo?QB^ZPO@FPB$|QRBt_r8%g;>Pm9iN2M2wdg?vHg0+0EIhV@S{rFdV z4QIa^9k)vul3cfN+cu5laS60|ly~cM+7ltqlykRhh`NW2#a?|lSsQ)4VA_-o6)d|o zdM*h)D8QF;%2dQ$*`54KNNvwj$^0jKT*G~f&zw?wXuf<~e1Wl8+c>iiaeE=~*GFFU zBoDqU^pMQZJnJqklOs%sG+rg|KV`gE@f=gQ-fN@3!e`tvZfo~cwCzy7yKPYQA+=b^ zA5ZR=#g{y*W*`rAzFIch-_G(1y!~Q04XYg)S>vdV zSx}0SGG(52;_CbVMb}vdwe^N?I#Ar*p=i)h+-b4kP#l64NN^8YD73hHaCZyt))se) zTX1X9A}zGkHox7S+4+Ci56QQjWHNKkdC&7+_jNCmRC%l7wEBLBp9&rqAVNq}-G81Z zpZ8-|1S>IExfaRD+(GI2M$LW&3EEUS*&`BjLLFQyZp5@}xc#RER&^DjxpfAr@vcya zMUTd4M{T`S{tFHw(-+ z61RbSBfRe}=g+*Za=khlY|hR1m)*oad8wZ|{A##XB{sRfnZ8D)%+iepe@MX%fNJ#Cz0`7*ZJk-RyG| z7HkV3qHy?@(3y;tFKuBe8Emonnz`lDM#StvZ`z#F!qodXqhrQ>i^;E;mwIaEPppi$ z3618YXcx)Gi^vGYB?$Eq$BM_9o~iEwvBHT=$?TD2+N=*Y zYhd%#l!*(f=Q7d2HgYP@if8VPFN=>+84+I89^xd;sV|lsmKykT)6k&lXktn{ns|NX z-gCJ=6XH6RG{BwKG(Gk=UsZyBcFKqego{hD{zX2=Yw~%qjP8>D6S@W?r(d6s1wgWA z&oEBhdZL5{I?+puAl>yI!31*tN0+~CP4y)Hie{fv%6Bb6`Z?i+v9k7CeY{jOF>a|j z74Z6_Az5$7%)o07cA2;W-xcbMey)-ZB9v;@Clzy7-BoH6@?=G4Bl~4)81bn_~OW)A0ndTgdGo`W!n%*}J_ zh1z3Z_|*E?3bdgdI?8wm$>6RcS94<%FH+KJ_R3T3PT5@YYIu}Tf(SBHM#%lTLO0) zK{FLMfx{olSnjtshn}hyAG%hh?0=$v+u+?%K!zTVvtlyu6A$k&{IvK>_H3W;#Wz_X}IW-{H#Vk@PddMy+PLQqp)`OLu zZS3lD0BQvhxZbCFLTqabK)tEwV=4%nhHBlS7gh7`01r=YSH)J&QWRqzBio9HvNHbu zxIeoYFGtfY+J#jg-d$8nw21Yhr$sBq2al$k(EbqrV~b7HxW9m{gU5NNdJ7r390kNF8-96_xigdXihB(Gn(q_gSHWuGVPzRpLQG`vEQ0b;eVX)qQ z)g^VeHj|jy-j$6r^22uTvO0QP?bx;3X)1$s=onkc1(P~kE{U9WIOP%YUD~xsTX4ot zHH_+T5t+UEi^e1R*>*9mh+n-Rwe4$D-z@#`UAaI6_`F$ITdvVI(*RSF9rXZOLZtO< zZE;1lav;B$dTh%Cw)N0$m=ae|u;uinxF`d2<6CEKSQJO;Zub{eWtMd%Vp5ZOpdv}z z32ljx$}No!fsr&FICP_CeMLo!X!aZMW{%QENwpTZmxQXy&42eaeccV&pOMNh-PPQg z3{)J=Nr~$;dCq*{UaT7wl2qn@FsB|F`TLa0k3}evjCP@w#87lvjgsjygBwRA=JF?a zA_6aG_T1O$YzrDWdec#9J-boMFF06P8&8LlbfnTKsC7KDqLDEGwMIeh zPbzXhgl<)^IlZS|nloGGEI3l-2}>+W?c&(f)GFulH#f;;Yz;bAOqeR#r4@w>k$y?V2P<|6r#FdJn}L*BZM!52j@$jX@&pT_PDt3>O9%OBS_I^ z{qnG&U4MvQfDcIHej8#d@I7}5-@SmjF0E5q&U{WRgHhJw09v}5*4}8Wax*2IIyqB5 z<|(ikx%$<sr_Vsk*J^>Q9-h0!~P2N1)9uW9q=^c~TYE;Q~*qIgU)|BjT4?>Hk% zFyA-Z)^?;#kUnRb#b(Cr_8GtSsNBR|&cWiiMAD)kp_{T=`lj3Qw}JUq;%sy9QEY<0 z7TF(c!FRB<7Yovhp>!F`CP_u+AdgDlhkDhtyCnD58<|Qc9aa+h4gvOgm9s27y+Mi4 z!xm9|yEyBb^aS>@XpgeFWAJg+Mwx-o~by4aUs({ZC}>c zB@OHOaS$>SSxR=Gf?U>02dhz;HxU7sdau;;{98(H0Xe}6hIDFMyeh+8ea$30msS{Z zjMZ`*H8oZ|`}}<8tyvv#@Ry{2fFeQJ?b(k9q2sN&v)z4BQR#hDWhE4_GpWQ&Ts8mi zOYOZH&Q~H|nJH>?Urn0JzIC&fc+RAhLkdHFBjx5Oc{~ z9Z0nM67qw+tF^A+iXBH)IwSWr#W*CYXhMu1e=TWQG+ciM72(lOD(a}X-BfbKY`wm- zFnQym&>eV;b8VUtAjpyTTy#}Hx1b!}Vbo**7SAUeQdC?VmDpG1doXVq5bJ>Ln8SbF z?bqjv>U=tlz-`abm;Gxn8qs{Qmk3|My%u0)DEz(^@$BMGB|f z7rkmQr+6@;CX)@B%saC}W&DB0kz1q18HLWkeWXvI^T~Bbb*SiJ{=1<+L=bLr;=b6vV4oyOS$ZC;0zEY8R&2!>ECsP~~0>Ud8+yRTG zz$tV}kLSR4Fnf%$29h~7{eFOg-5*}fi_Af^-wJ_D?j}=te*b!%qz46bi*v?RVT)H3 z{yi?u!bXO?Z^tuU`~wt&Ufg>-7*W=43_<_O<^BWw z{^|S=(3T)lQWz3HN&8qm8S@X&Bw+eCKd~t?*XJL=>NWa+_aOslNu)?SI`L1^V~@@T zBkKM{wh!m~5jgwZ_+_=XgZeo^qyAbNV3dR}esT_IzT)cjgByE>FCM-nAZuR8 z2jYth5IWC%|Af@HQaU0dWTcW3;J&@3>|S@$d!3y&wtlB+?$vI|!cE_@w33qPKnLy? z=J@IsmP(x-AnP+zh{>w46W#aZJI~jN7W0U4rFiG7Y)Yk0iD>7<%$znFH;%M|4iDHj zxDWA`d{S&;B+NAZ8FGN12(8Ryzm|e%v99A+V0cw3;maUQ#2aiL_n6BBK$erb2Ki;>Cen-N}r0m5l~yri)?|V z(l*~mub%_nTEufM>HDuK(`S=UzjuqQ1>M(E%|wSR2O>9xrpoMUzRkuq z^AsI1j*p+R3{CwQ79@o{H(&gkV`=NZ`{Uu+jx@<$erhil$N`q4wA~LP%WOH95=!YnVFDvbu|4KMA657sCqTYW zN!MBO@{cMKIM2Xz?Z?qE)TikvYJ2?*W%c`4VnIouYRhbFo0g>9mH(nfH-v75xlg+@ z9CM@;YY-dZbOdQ~e(AWGYT_}mNJ^y<0QJ!3t&+_a-pnpi2?#zcFia9qo4;PleZs5r zA?BUIVG)a%RSyk9+i0eupmze_3Yp=cl%ZP3UUrsUPW7a#O{~~!>&N2TXP;m*T1nm) zAuHmr&AW%oQQ(LO_!HKK<4fp;gT7a5%2QT+P6f__aQzEx<1h{ZMaB7Yap8fxFo>7S zwnufdz_*Jx9>FbpSAq9G^Zez6@Y++8{19`G*t^bPJrCb~kpTNtIc zRu96n04tQ_g0B1xhF4nu?4O)Hfhxs3$4ry?4`~TFi>AZXIGyj-w0K{$@GrZKJGa=4 zlrL&b@+rr6%vsw5cclv73|7b;N~DO??F{*GjL6N7meAxSd-5Gkv?wIz+EoRt|oB4+An z`wuX1CDSWrTPV%}^0nw}Z#0^f=>NXpKD3^0s!-9_{l=LTXT_{GW5bKms8uUD+B4T;F7OuD$zK>UN? z?F#?j#P1aM%82I-g)i>n{sG>gaf!^`PL znw5;nhzmCAR9T~D6Z+bWN4gh17BGl^DWQECuZmU`LydBA`%XSQM!kq>c~u>U(Z}KW;g8dW^hNJG7W2Uh zS;eg*65a16NVe+!j+&mI^-waD&Xse0(5}gs9JjOmE>Jr}k@aT<{L|dyNoK5_UDf3s zY$lB<*M@hdxq9AE@3^dVlXQaGr;%9J+Wg)d$uEP|KrHF!^ciT;f}I+=${Sa40^6q( z=AV?T9G>BIrT+vs#S+P|u7u?q#kry`WWn?=eBefij)5T~_FUims*Ip>6D<>G}JZ*O! z=JFj%;3S@oXa`m^f|2_QUv$D%E@Ss?`S6*h3*z!bj8W{!S`gEzh2edu$ApBzgYN6D zhQ1dpwyv5Fu^%{P>YoD3#~~E9JdUK$hI@VFDvx;Z0zp8Goymz_Q#goiV{w&w>?hyO zxObhCq_{m#LP^WbPuv#+6F&EER5;c=2is@f%O$z(NGu0Xx~IVf<6cemq-NvHF*3y= z^+fs~B?b7$A*ZJ(rF=#$T52a%K8aEJL!VP`##Ql2*N`6Ui?Rd}RFLcd=S$6IaS zXygev8q#YC<2SfHC4*)1sXCn=SGlyBNvWPrFG>MeK?bew1^Pu>+$FZRq#qIRE9;Q zYf^lkqzs6hJoH}azqjps`y;on0$aF;6Pl`_Vi~8qtnXqxR9BedzsG;58uYDT_(z!| zfiAbB9SyBjj$}W2uiR-MSy1^)Gvz$R5;AXgTs>Dm%U+i1SdAzdU-g3xY;?HYu(usz zt)uF0)N<2$3z~I;+cW)LjF7qsOXBJ(XywQ9X_ZO$6m*XHV;}7FTO`&eDN9InBwYtya${ zc89yp6u@SIt9pF*no8Uk9HP3zN&?#L#C3ShR>`E{xfQ$BEr-_xKhtdI%u0}A*kHjKbOGx9pBMOqJezD2_84LfSQ%1FDzi;6f!Q*+%qqU-Gro9rU6m?q15FWeY1KHscJJ+WNI9*n$rZD=$pmFS4Ec6 z%VTyi%D}YPO&MN2yq77kN~ox51PI3qw7bU1I#_Lq9v`lHMcA*v>a#R!R=}u| z+67^vGTs7}u$%G;9P%Sf#Mo1>N}inI-6I~n3#Rfd42HgboSbq|)r#-Ch{k%6pOg2E zv@-#p6-L$N{@akKZnS*L@gMBiT{<%vVy$ws+PZkVYw7hq1|Q ziUSel^ff#!C@?WcZl;^~&wh|O(^ltj;5aHSsgQAlY-(u`4H-u|uk#Ba9*1tEaqLJr zN}sB<>;E$O%E?$?%}(c>qI_J>XLU^bDNehb2Y1s0Nr5v> zo5)QnPl~CUvP*3O@@_Hg5rq+|kE23Z{N13R)4Fi;jh-@28$mkmE4wON`%Qr%T|sbO z6?lnzW{WIA(kncQqEHlp+in*ZYnS7hP&WXy-zv<%Q8n#)CKr+_!f#Ub=(YX%r`L|%#9aK{)z|MDK)=r zzcIPl=QuTbkcs@(RNJ zIX2@|-0iq3Sv={jv;8FW&?L?q#%2B@-feYuMqSsudftOYQ!<2g|4DC%LJ}O%_esiI(4^#qTM%Baj6 zGd4_N2*A!rydthvkz-=U&Fm2D`EpG#`)lsS`*HG_1IGC8!2x4hY;Z9Bab*CwKU?Nb zuNrdbqoy%F;oCB(EMo+rs*!-7r=+^iQlGBzsX132kF1R;_ktz~mH0Vb$fMQLBl5!r zIMd@(-wed1#L-oDaXs;T#=cvorsHj;l_s9^Z6RBsRrf)a-Z3KIX2IeGz7z16Id6g5 z%&D|3rBId2eoNR{ z=yOt;lPDh(ztzZvMca@*9w*6_lcX3QD$o<`^{`bTWSLrW14m1EG0F(PJuVx zpkQl8GUBR#>kUH7_!}kpXm{1+^xYpT_)W8H=fxgOMEf8}Ct)W=sQbBAMXJwYgV90l zf>n95r_an~1afP7NVHzst&kT)9d|vNgL(!_E@2kC;&tM8WrAQS?Svbvtn!goz3SGX z?4j^paLNxaD9be|2ie5!2FX^R!13Wa_2CBe zWsBkk=#Z9mhiNZxbU8lTk&P2akt>(gPaL~-8q_f(mrqyAE2}9X%H8Il?wmk3*fwuq zGT3eyUiKZ=An6rffJP6*ONsrtURqLtm=CLe(lUEQpX3Cm;ATdPh@r4PjUMRA5cvnu zc1uAq=zK|~6Z2YdeY)9ej%^Fh>EIvRMg5txj4IQ2j;8}EF7+%e#8+MCmzwhr8GJ7PE;@bh^3xe*r!4z1c*}y3ISr>L^0&apjv9I zO3o*SYC&NW&7YVRP^O_x<<){_zU)`hSv60770tGrkMp}QeC#}aN-pV`Et<{W?C^cD z?8nT zw#KafSPP z_SL%68Ji*=wkB<2vtRPePP01&TOp_SY}n4=W`;<_e-r}~&7pIxd6Dw=Jh9n&9USbw zT?5U!Ils_Bz*&UT{qrBX|K4?9;!@zH8fYraQ#3*+{)k0t^HQJjRD2<)WGsmv%4XVA zkgkfse)i+uw&@qn%YOj-E9D=7Xu_0~sf`5FedFTKi zjVYu_05%xigMol6lj_tll7j)V4eo?gmDyc2d;d}4psgW&5t2L$yk#bKTb`UU*oyWM zId5bcTOeN4FvP#HF52uE0&U@Q##qG6DPJIwb05(K*htaZV5p;0rzC%%4a3pUqWh(u zWfH#V)?2(B2^7ME(4uE+w+p@VQqOV2tJ6hSDX~@B4Y-iM-je2L@?iS#_3q_|Kisfq z-=kNX5Pu`y{@p_ceC0PpcQPEGUwke{<4>Iy0l#i1{sGQ@$h1)NYW{llsyGP!eDmM% z<^S_$Vq!@auD38vEhC){Au3GQUav&?5eb$7v_{Fu4ZVdjY%VdzLs#tbA$DG}i1PC8 z8;W;va1Ygk*mro*U+o^&)jB@(SWA5KiTX+98PyTNvg@UT`}fbl)I;$PnYU}dntl+> zzujUzJ5wPS#sd;3a`EKI4zXgg{Z^i|5L5`PEsh6bW%5O1{w1RV1P)>RYUsj1b#?wS zWzW1hcz?FGuZ;r`M&rQf;qrWx-`p}wvdY}vrT!PC5+0p+Zav~3nBEuwOoY^s)c_eB zZpx|2L#M4ku0F(G`s4vqt_+SFsCGT|^gVGW8S@Qh!4oguh)%|Lbn=7552S~c{IMU) z7mxM!*z3xmOee&N)n#OCG5z|i0K`BE#t~qrU0(X#7a%`+-eEB4J*n@Z8ow8n;?;#$H5bI?8UP+C<8-=s9zFta z-G9m|z*~QD8X{&5^mX~_5l6zY);zHoDw3G^iH!Io(z2NwXwM#+ciL+jL<@ZEn~E|=VJNR!=t@rt00EY*PeGvV*_EQ@+M@qseY@jDtFF z9t5@785Qw_2k*NQeX=e8EkZQ-b=kT1#4?Qxo#p(m;3ims`KHo)1ltFVguf%bL9%Uq z4Y!g1p!?!mu!~97-#G9pfQ7w^n@lYu5sQ^f8{_?NeX?&HlifIfHjfQEHqlc`Hd@2v zyzrxKrYjkSB;sbElJ|`MGb#nFGJ|)dD&*g+F9ZBKeKVx!h?G+3B*@n#pB`RbF*h^+ z#6|EcVol-!OXA|?;%emjJs)vd_J0k@V*Cs)ZLYP_oT{;XmAG#pNa#z^0o*g>1oGgF z9>hhCv)=Ubs?EPkf%ml{DtOiPFcBr#Jm?l2X#nr&GsYzJYsrnt^Q}8t#P=%d(2dC! zLjo<%Yxcatea7X^G=7*Vg0@eT*$PL5Dxm*M09*H0)bSBy-|}qz_y^GKZZpgd4Oo6lkh!`kBVlOzAbu}yL{ zyiM}iO&T{t4~_W&0JvUHI=Xr~c+G^pw5~86M zXT5J}ge)e4{{cKfNw*DoD_q4o7Cjs+79!cs4G&&-Sr>&@+am0=a(WbsQ7gBQ=?HFv zT-C9Ctar-~*r5)~MV@QGo(_y$A<#pVk2Pg`-f1$!qWplz!FiGDpZAV&RFOL8B-dpT z(oUu~5AM1292B?DH;SCN?ThsOw`9lv9)LDS-kM~jmg#R*k^|66jVEa7bFAkkIl98e z+FPfaLJBOv*r)NDQBRI6&wSbpg_ZUE>Vq3Gru`ew7*PkaffADVti8|qMSr^mB}B<* zmu}d#|CWqE{9xf60 z)VoF5SYBP>1>0?e13{{xb3OEjoPzaATPiawFXFnEPd=mn6wSTw99|eqJ@KAlk zWW?D+=V`C6s2{m_vg5fh(7{7}07Yy-CyUO&Y-c6^lR1Ljp21NFO88t&!1Y7K8t@c~ zVJVukD5?H~;mZowKLG#RO?NusB17)(;yyRVMVZjcgK^MN9+4EIv@F)T2 zW3c(!TbgHxZqS#jtbDdh$vH>ee^%ArIDj*}hi&t}0nfqD=>Ot_s zQa`<0yqgCpNWt`(%YUvk-Lp{7!R)6%t!oVesv#S|rZjZ~OR*J#AL#U#;|sUD=LbRh z9)xvKb#VHFqaVZ^*D5YJ&%zBOH90Kk_%^dv{L4k3H~94>G~3t8)4!2w7qyxWZ*(;z z8_!Y|bkN++?WO2Ft}H^4v&r(z$<~>iR#srza?jEoZ~jM(KAi%*`1Gm|2jxDwiR$SJ zLLey`Ly0`d+fcu0B#%qWw5ziZg+618S5{uE*ljYbwS5C+UuYLt#$MfsLEl85d9A&% zEnQ5GIqQ>h>Pj>8UVO&7GoW2^+Ef2GE>NyRJo46WsGu10%DLqx^9H?H*hBM#?|NhN z=RW`e>@~75x+#!1RxUS!9(8rtl--jIULqtgIL(U5@y5D3aDS~uz3BfBprR#e^IruC z;7L2i1jcWpO8!s$CU1S(YG&3d<&|7EuNMB|E?t$dUF0h&)A?v;ojPQNklq6%n zVF`MXF8sGTM`fe8abf$^Td0i@M$hU1iI1zx!2=^b(XlJ{Edoa(FJ@9Ixu!;1@ zq;b6{0r<-B9LXa|F9INm{xiYh4?JsM!K9jR1E1%iyU8pSjP)_}q~0m$;g689Jm0e6 zxpKdM0{_~%6}EeIJ0f|+fTGHv^d2c4+YPzDdiV!;)@OmJboWlw`S=ki_%~7$qZ{{G zsgNg%EiB{D=7c1IB9;Wx%s8^l;p*4wr^{v3PW)lrtkkOCqJFxunwL6yYqiY;}CS?9Bws~|4k+r}$qgk~y%nNYeGX4Em1w zO5^ioy<4@}dM z%g!9McVH*cR8KyEC64iTCsNwScn zzv>GbJhhJGDIOQ~T`}?THrP5mW0f8zGbjvgf||x$u&#IHoB?O0+1#i^bVPW3`xAhp z_l2(7q5GE@ zg|LVF_6;w*oek+XJvu(g`Y9Hw^^iLMYH<*x0Ra))noQcin zHn>7Qa;CHsnF~&Cu=#BRYZ6~qEW`Q`G`++hUOO=|9B0Yov^Qz5!Ka6;1Y3!#tE=yc z+=NE0(2POz%~Frh?c70DN13B3wt7V{cdJXQ+XgkpMtrr7L9C9R;*`yR8!F%+{S0=g zZT;i+K32}nMmh|4eyt*N7S6@`$8@rRZkzMfH@vcMZA*?3b}2hA0j+P2$LTr#sxYoL7J!NA4eYm?&Vh9ZO#SKF<<^ z{0l34sk3##*DrEbMb{_ly)tiBFB8&1vUP48`A;@55~2{`!;i4}X-QncD0aq@68;K; zr*`pCyFq2k4G4iZ3T$qucfAX!F0K9oW?`Q&QyLfcDITI2@Lxe4mnaw)Z!PQ~_--;jrn@7v zw%~;@Z{2UhEYwb%&44=WwOq^-fAgD5OY6Yf)8yWYlS|jw)upa?i{SEmUAp$3vL*lW zR^UvmxXh8hVfE_P>sK#xL~-p4B&#htAE#+m1LV7?Lyl05^FaB?uoh6YLzd=Nhx-cW z)9L=qyi}`U=UQGija+CVucY==8k_k0Q}Zvdx=+-nCOY5FyyIVlWv8~mf>36aCl`yt z>cd(SoDRTLT%Bob62JVGG<&)~PA6v*LcZQcMw{axiGqcLZFQ6sa!9x{nS^hZm*pIm z>L0q&B-nq%=`xxsVABql2=|t_Djt2Gm87IUC7dp>gr%7|mgjOirlnjSl@*sS5#UTK zA9HXu)DB4W47*CWr)Ad}VbObvk$f4@g8wmH&WuVwiBDByO$nRwdBI(M0xg%bDFc)r zE@Gc-nWoGz?)Z95_=`kBH&iHdK-L|)yzyKI%A%vjtJ#i76G_S^G}Sg#DS%^yS@#8~JQF%3K zzploz>=?+1SDW=m@X^r*63^tuO)m-N-YvPYMqX8&!1 zr=T0?(1N1YQWM2}v`g=al<5x>#6N((gDZpiq-zZ6Z=(HI`{ss!z`00g*A zqn{`c_n*tlz|RZlh16DI)nClkxA!!@mAuwjc77H%^W^Wt3PNkKTjv}zonPe=Oa z3n(oNCOVAslL*2M!>H$xA@n0Lm_>*9+8AEP7r#-{;_~=ThhgNYVOhz!b|iRwCC@mR z%f2@YLKi zdiTE)np;7edeoh{C_?}aHT04OywdC{l$>ERg^lQ1-4DONvss=6@bX5^e-y4azuyio zbJy!max>R!&IaGEKGzs&hsqvYxTKf}0==6Gm`!F)A)LBc3XM}=YSP>LOCj8=Sz}pa zBjlJ>KLh>a(Ho^!`87CcO$_gK{iQ6#A*LC^Q^JZ)osX){3<`{OeTe+38d8O!D3$ zdt{Pi_N~>gj7E;wncXgx?U_sA7fgvm#*20BNh&G;MWhzFGu`q#M&L#sm{${kP4K;b z1_e7=`++~3MQKIIcv?(r=ZXMAHRx=6-ANj0Ue$h7^LT{wjHY@nHq9=cSb_}_V1q)! z2Twh_G}p(bl&LSXgW|c}B;@l~$&&I5D4inIW-P{e!WL$P3gX0F;uynpby(aF(bFdv zMfcCMPu)1ytR!tcUNxt;lWe6L1?^wFiO3b(0yZ;MvM0#;wrt^NJWnO|av-_1Oo#G0 zM;M}?xyiYUziuT&!><^|XM`gX@-~|@CTZq0+AiC8T#ccko*axE`2G?)ekgh4{aKb{ zFqP39Nqh}?G3Vy{F=BD*iqH33#)p*ENjx0P817i;fw$!G&@z?P_H3XQSk%A3$2mA! zxl&s_D@BITWcK5UQM`ad!)2xB(sVkbc+P%VQ+2_Ji>vx3JAS~ds^F|!L;Z;%{}84d z-l5#brFb|K2wLa{8^(q(pBB}SA z7SmPG=m+bWQVymX{55bv$*3mqrq)>Be?m*lO%2Dm$4Kb*_D_A8$?Eoo&;CVE&WVRc za%@LN!j%AQjF}Lkmfk>8F8lsbuJzKMZfuyJGeJ~Q*!Xa~cKq9Lco_+`36nuvb#o%2 z_)}SCkTlWv3O5zeTh$(DZ3C7zWekbkx(@53^fg_BanNtPE1`vS_KXL0!Ucs99eHo2 zN(~~c!h+1mwzdlvEuBx`TEUeceQlKfacw58w|XQT6^A3${)jiu$#X`nE$`ZW)VR>6 zxSvrr!_cgWwO60F%1SDw!qn_XsbNNKKM%3A1mbb0_H-p9NR^r=#*9}20$e{RqxAj^ zSAmrb3l+38OXE-?{`9rI?2~#nSKW~fA~U~Gu{4oFnw>UVn^%O<`2C?On$OGxc<^Kl z%Q!~#0{cC9RC@tx-2@7&-p?wJ5r3`gZvrz)`|pQKql}_~LM~_#fa?R`D;X zHa`5d^@6mwb#HRsKHiSLJ?)8Si*Mqk&(xyX!6-Gg(q|{zM|QE}m{8xuPN+O}~tXD~jX= zcz`P9J7B~Vy_mjHf{>N7$}wnEbLCP#J*9&)NjAnnAFkJ=s!9W=UZ9@_%j);etclti zgO`lw{bz?}t%XAuj)L2bdWMaO@_;XWT2>DX#(4Qukp~X!-0L)g^N@}Em|#MYNlEqR zZfY9reQHTtqHk9EIz`Bv%qB%4!ZdS>eD%~CH*VHJnoC)(gVLnbTM#XYpOGI{x?8cL zmK>GQ;fjwH3&8o&RvXix{`4*)t?Fm?GY9TV4hgchObOo3xVf`qHn;Wu)G?#C{rpz=I z#LPLbQ<2Qs%Aw@aGxV=2`rtQBSgoe;&KM^-0h%CWK{yRbNZ# zbw{4er?+(Vv{TH3m60?KZP0c|(4HxV@X77oC;uWf8{ToUYekPC$f=Sn_Az)v7ZE$a zI|{U!IF}9o$V+h9h6?HWR=kFE} zp43*75e+WQBKlMvG@B{Lzfd>V99<6)rxcOlnbX|oiej{{J-LLtWch?)uy)O9sbEU) z`?=o9IDasVL(xA2ezv>}6REJz@GyV)Q}1ZL7|_x1MiWIe&5}9p*b9Y^uwkBArK`{) zPvY~`d#Dt^gQ-^M=WefV$qce9=kC`+{3gxMW?z8XA0Pb_&PPZ4<4;uSwKAveO0p_DVt-;&@ znO7q`L2A{k8&N22bj4IrH(ZQ9%lg)&|GPM3{_y;0__y}eH^-*U-;#UiIfGHtqv*2M z28rGe7hiO0m;3L}w`T-%YcK0Cydx+*V619Yu?( z-n9DQM<5ggoIf5QBrjt{q=HkLNsdkboN!p!{&m5 zQ2Px@Dd(sc?BbHj)Q|@sR4{oS@a2TZjt84q)~M~Hy7b5#k0nQ7sPn}@Ra(nkgFBYG zr0BiMn{-xmlY6x5y*iKqrmQR^e8isJZm3jjA<>t!O=Afxc#1qU)z#Da z%~;8z@z&Fmdm%gFSos`Q09^#e8TQ7B`$RMm4IrmI*(3(^mrfdB?40=U zp%IBYcj%{0el89t%j&LG-(Jr=$#m*5U14rbq;HxV8UdnaVtXZ3WVWdLbg8Q9+C!lG z)+Ql#cY!TYwOR=@gLbQ} zXFNBFcvn;Y^q2-BbC)`vw8%|eA%z%|o8_Il- zpUdgZNHJHO0#)FR`fc*VX*aaA%;SgG&7aCz|KujOm&1nA(zEe8nZ?5Jw9{-=q-iCF zO_HJwL}$KF4RRpY&n6lRypUyA)R09%GSwGd6OVNtmtMyxOX`H-23zDj=%i&?%8!$a z%_0%M%uwdvorTzErvqv_yN|ZO;-b|a6lYMsV^d>JygYV8n)PpWBa_619O(u2AofH? zmSq+`at)fz1;RF(bRBLDmNYu@&A3L2#uXj1@n>Nv`j_%c$$8hrX-zz?0}dd&wMry{Y;DX1T}4(<@@oKXg)&@ zSK#sostNKyHDlA|?QO=_8|rCA%FV#?CP;nRXb&L;1S<*^8pUJeA*BM-EzQtwn0Tfq zo6hk3bEc4`d-EzKwIgyZzq)8Tb0q(KZac(&z2#a%O&U|eo%or&uqdxrk(Fv)=3`uE z3T%>kB2Tl&SUjB9pjH31L`-C^t~F58J>E`z@GV*1Lfz<8Uu>*B&KUTrHo;nhHZn0O z*`paesU{v!lPcR;&qO7BW3XXWR1{`H;sC@{G$=A_X>%zTNbDD-@9A2NRszL}XM0i| z#~s^qF_kuv!&B(bBM=*X9yzHMS-rC}_qqX7{>S@J3Nt&q8y3-4E20Yn{S=utXO&(k zA1|w^XAp<5u~Afgno)SOcT6c|ET(7k!kGJ5-~s9L!#BC!JAwOI@RrgBv)_X$2cJZJ z*6W66nt+#OiHtIiz=NG0i|$j6_Odlx{)+V^ZI!9LCdgo&@zhWGaP#5LW&ko?XeKpY zBR?`*VG)Fg3|-U}p5W^<&J(D2oH0kj3PrqTCxARME`5GfD);WU)y`y7{KzT-;e@#l z-hyo>36gNLYF^zj*_cchUP=Fm)l-?|H>a4$*QtDfnu1)34-`LY4%onk%(8;? z!!XTKs6z+wduZmw7mgC7+b!wb38n4dg6eB0T-C@1R;|n6Vn}9`eD$oRS@dXE1}vv5 z{yo(Flu>Cd&f1?(UTwMypDwP(6j!l!*W*my)+;9>y=?xM)F+-V)jG|Pzbr%VMRv@4 z+Hi0uq|O-b(#PFFcowh+tRVbR6i&1`>=rKQz&R=@NxfRiFh0^5?zAc*ep+e8v$JYc zM*uUKA*8v{sdSfnqrv9Z&lCyem8k8=R~l#E7$^<^`f+6XlIE2yv+?iTH=>MYbtD~~qx_w^|0YNG0?(Xi8?(S}+ zK{^DL?(XjHZb3Sfj+c-Wq@)|~qkHeO+4~&7vrpVR#`O=!z#;3IYpyweGuK>rFLX3* zM0I+jY)|eK+_yfq5Y;`4 zH=>bDa|5@)KDk?5a{=!Xo+4Llpu5#Vl9g+0DpW-M$t(pUUzfTxpJY;I?LCdsM2$SN zDpYHZ1XE19e;mn;#OZ`$XkXE)O1Vj_`^%zDMd0xy0~Z>8i)pjIDT6!TEbQQ8$kI33 zm_2kZ(X}jn5+d{Sm+$&CCDwYSvgu<@5~`zZ4L|2A>S3D^i*i93FLMjcLwxHSh&Pyp zy&!yNAYPm55_%P^J{ljRTic8=hC|2vrONt{vLskObP`XeD6h!+ar%3;W zL8-6365vLdVSfiznE>SyZCBM+>NPLa&h`0#&OI!FyM(1_c{(U+cdVfl(@r+tRBdAP zqqbL)W*br%k=C}LHcw}EK~?T6uYu$KRz96l4N*jU9jyL(2Q#+!t@e5(_AaFilj%ZS zK}k_*A6%KrM*N5c?j5wYK#2A^hL9IM zmIJ4QQEQM!zCn(5OW?-FjWUNz$18?Wew#fWBA+t!davwLAOO2~Y+Pk(X?vun*D>M2 z(|Kds=+j9Xd0+Xi6j>>*vi|Jq;z1V?b-8h$hURo>Jo@0I`jqb4*tBH@fw`qve@8%K zYwy|;>&%hnXD2fUGHWpdQS72O@5xr0s7tskMq@j+Uhv41)iK5#T_8xa?Gn)uXLy_C zi3nw95f1Y&u_G|86+)rK#NjxNsqMHwUaZ$VLU}xG!qdq1G~Xb>PtiPt=gHudlxx>1 zR?bebW&y<0GO-+47G`eW5B(}+z0awQcZVdo9t%Mx7dNQQ1f%aMo3PuC0@uOaTqLtuUeiY;*($># z$PV1*KRch_(*qx0xVsRn;VYKOThZ#l*d1{j-jZ+F-CCQvt&D%X&j(%=2q)|;8dYxt zvZj;wol8DlYVYn>VbtY-dZPRx%%rwaP9W18ekus&H-4z}TZ}=l0q^^sg@AB#R|p)N z*|K(ilOkwvq@CfxYkAH{;_{lfKxG7k;K^XRa zgNqMzt#FIHi6GnE*s5Ei6kq>)c{BaD>Zz3rP;7NlI4!(*xAU;LDoUBum3;-pvG%-4 z5MQ>x!vSH%K6?Of9Pjp_4`6U}y|$-A|0|em2nb3R-fw z`tQ5%pkcWX{J8sX-fXQ>N(~KYB2Zm~f}4f}mHMTzb5F>JOE30`mpl z1I1zxC<_Ep1+qrFky1x3DdH7{lKjA(CP)Z63V{UT6q_sA!KQ%sKoy+l_^DD_jxz8@ zSJijW>ra99p7EDY$f4KY2#0sv?BTv^00*`Zf$^8D@@Y(-n)HO&Gx-VtmqITXUWG5r zyb$p^Rno@fd*3kJO$(nEFthKTEb$RJ= zY_BxpMOVhH)>)H%htlbbi^wC(*X2;335lw&gzXll?zBR6AFM(3aPi!tG8inIz+lD| z`Rheaz3D5-wfw-F&+@P7JQg|isXTtCG99UX{Z=cpRMD!eQEvGIJ-zb@#=>LnVW<7Q z7i(YinY^=<6*Ul;!H6h^9hm?b?SH504e$b;@iFvDeereOdSaVTsPdU5opZttc+S6f zti$L=uu#)By*)@rXLpOC4$hJWqEFj!O@?Fgz7YYV{= zV6+C~cMy~7y_Cc7vOsU~bv=5^LvkL{Dg1*rpkWNfu!m?Y^-YS91d_uye1QiqXAYJ(j}s&CCenD8 zeb;Y&^`vf}C$`xG&~#|&!;rnNqP+IoRrh=LL*x7kfMjA%8D9r4qM$y2J|ce4I~_7M?aSg z0z}2|CdC<$M6dj9|3iW`K-&KE#T0+;wdX^UUE!TAE2gSzbBld;`W;l>#0nT3U|coLk$wsz^GmkwwH7b|ybyZWjk*aG-T4 z6Brqp;Qq_S&3fm3P3c25d8p26E2ea*R!QSrH#Kh25$2bxF2_*~lBA zc*@3UKJg_Rv*zp;dQPF?iP$nQ62XC-S6{AYE4@ewQCmwR=cI(!EE57KDLfe zia^Y-mo8XlubrKxZAStlF5zVQxca#8C$?hU;MJf_Ml#+FH@i18groOoPTS`` z&h1BKq`6;K{1AARJ$?)DOj+s}X@BU>oY#0`xhBW)-I3{)_cqXl8^t#!_0M^*J8@ww zVBGM+!{N(XE1;rB%2ijnc3L%doU!-}g@%V>cLQlDL@PJz(lE#Hpkno3B3xs5+1c4J z@XoKWHNf50_S6gG9nb2_YA}&5=LzCsYx!bg??btI*L9KmdP7Z?;J#>L_4epLXYsyw zkqsbcv#zzT{~)@>VT+*IRr`T3^d@}=P4K4&w&Pq7*8ua0&%_cDzeFP5`Go!hX{)S% zR&_VtvdEWuq4!YST9yXAANAj&Ybo_5PG?5#CoKk~_ZlyLYBWJ!(RZv&M$vnGjiR{a zGBOe*ZWFTEVpMAkJY~txY!1AoO}znf47hplF^Ay{OfwmrZ_oTx-QyajOrJ4}g-GtpDHd7GUq7qwWTjL0yJ)Gh1A2PWsZBU~i zbEmBtC1@fkEMKMbtMiacLuQl+r5C$mCQ?xd1|dB)K!)`1;?UJ?$a88AVNoL?~Oz7_tIW zpofvA44tcHt!by5B1MGP?rE_~io+$Fj)@=-5h+u}t86I>K`t9V@w4l6g?M=^)4d>F zE?~t>65T4yy2*;Hr=&G0(e6|OErkqb zF9XEC1c*Occ!*?D9lx~rZ8qkW6`CGI4FoNWXAmn(9(sG`doBa&a=bkk^grCD%i`a` zAWbq7WAcF>|L1Be!q#&kwrhWQ(DSeH;D?Ra_-P~l0Tcc(3%?U8FUNbU?hN?E)IXs0 z2MYj8fd0c0T%8j*{uh~0LD0gX9q8lyJI3&Fo*d}{CLLe_ARFcG9BG=7824KLYZ(6H z@HbXm?-haLe~4ng7PNnW;(XgH&1kXWoxod&KOk_m{SPx1%JdzS=l#z_fkSucZtnV_ zC~R(RbY>PTQ5)$}_vn0cOD`W-3J25nndvk>JsCWcIp%wlo0?oxk(xs{3EhX1&Wzgi zYR>_$3q;z83&oDa3EcgvPVl4q0XKfRg0dWy0~%I*cfwsIFh_9F`x-s$bg$p zs$`p-psSOWEc%#LNtQU+&z9Jf(iWBBYZdZL%TP~E?fEN;D{epkaN^*q(D26RvYM>2 zs&V$&NVW+wK&py+m%7+D3uK(OwHLlFeu4p=k#rIv+2UA!g7=!vMGrxvHA#v3EG9UT zd;AFbTX}CSRB}k>gh%S_5u z7e6g45c5;ktRDLG-gW@5VZ!}08P(lix8n1593KD8MDg4-{BEM2Peux$EdgFT;1IRr zxDo@FyJqz^m*9t#-c)O{3S8$(N1ljJl|GCf{u1bb`(`|@HxqMk3~zE@9UdGW^#6_l zKh3KhgWkx09v=b(Lay&Kz1#Y!t$(y~Q|^<||(;Q_v75NQOv9`s=v=fQ#&k!6H?g z(n@=IGFZw!EKxJGM?^<4BF98(d==IdyO~AY3KBt?Dgp?}q=3xyGpJu_1KQ9KJ7c6Y zskW|-)NMq_WhG>v@YlDk)Ll)Sj~`KDbyd+_8Q{WjB4BlKEcqBRYS;Fske-uwVKeUa z@$Sjmk@r?7CF9AN6-ZmjycbkJmQZeGm2|gl`HWeF3xq--#LH50V1Aj3=9_!H!sCBt zqiIV1enf4aKQ*-DMazHewg0z7De(V!#JN-$oHHA zg?;Y4hyIzFc|`wb;En0AGT-@!gY|n52PD4!jA;Mv3#n_qPWKL4K40E_`>o;zz}2x$k5m&a_Z_sW$h5YMZI5xws% zC>Jmp_M|nQ!I;3XsYx4Bw3N|Pay;s#-6QpT^vwakmNmwqFEYjv_GkeelYONeaeI-F*!NHMg!eXRlr5(#oWtSuqk!crVUM8e*l}B=X`TF1 zh6HTg2tCd57_WsEN*$Z5<778b`f zTT8=J-a316{zf&nEmgjoml?(xgT`h{kICL_IB%yp-nKzzB)J#k32BWHAy)~xF!VMk zO!bF!{%}u$S!JwEK0N>Cr=S~u2T5GV>zZCWpOe_1R42Xu^m0bOP~V6Hkq0YqAG(En znZ5Bx@&*W}JFRYVZO>MgHt!RMF>dgV0cQn(`s&?gFVzQX^hXZkr%O@taJPRsLA>7} zpjF=z@Kkb+-G4+^e_7Q{AIurxT?Q=6`&O`q(4}(c(XPfc+!7qJ3$zSoI-q(;qVZw~PzNZ%&JzJpKLd#FY`yNZA1-bAY^v z3!feQTIFA|dduPMR)Za1ZgWO}yxt$$x@SgEhy74ni)>b{I0UYD6KsQi*z4ALgxr?X z4vo&a!yhRqAV!YV?!GMjOQ?B~>!Vd;3xwkxtc@p50pCG`S1$jO^703{B4AENIN){s z1rdNa`TWoP+Ye7>#pggy7TkH!mvCsWVa07>fN~I6Qg!`fV*x_jZ$a~H%1kAnOUIbcyasDofe?8Z)4xgXG zL^{nIP=r_Kx;LCpC^Jvyk#3YW_b&;s=D_hWw%dnDIgwzsct67@MB@wZeeU1~JR$br zle32pv#_)K^oonxn4g2{HMNG)ZZ$Y1=NRK_NATHTDC0Inz2WACxmb&%O{IjF(tx+& z5le8+t*ByVX0R0|U3iG+@oOFXEK7-^1M5*_bVF4~qGxPrh+-i#MY3aL`pGUZl_?Jv zfvV2$MU6sS9)He@JBS`Tuk7|;*CVu`f8^-v?@4vaknry+CjV=dus`Z^+`pIBa%LZL`kz-J@}9?e8aN;4Wz- zimJO&55Ns9gg`!kg|Qcp@(F`6L|oszpgHgGn5xgFO?4rkYQ&)*LqINK3Afx5lhbw5 zejBI)n-@1ck0oxlUgWS{sn?_-D40`-nh(0ho|=V{s_C`PDQToGfrP7wM$!}!Tzf)U z^Q3GesKn7MStMxHk=y|V%@lYL-d1*`IZALWRuV%@l!Z&QrQh+bbTAwZd8j{xie?$e%~6ZY{Lx# zcpvy{>1&nZr89BRD^#aJie?$W7WnrGG$SMER&Vw1ye65= zEcp&4EPSP#Es=5z&bgkstN+%!888A?k>^ z+Z${1D^4@QxpR&e7U|WZ@wunmSe^Vk(oCMP*B`C$sg)y%1S>Qwan`ro5h}-ntF3`Jyrz~@L z;J{cNTc(nzOmYMx112-WUVSO-N znqThlpYk3(lgHlAz~8pV_o61+-ab`C_-u+ygj2a#?SkaW0O|z3*6Db6gm|^V_uvzM z;d1BMCc?KsFPIkmZKaIZL*b7|Q%4o^s|SG)U%In*zMd+0tdp#n`dzaC4|zM{J>YWs zpTaW3t5TSE^XcRR8?RM^n`d^H`?n$wk9Ji2rUAEPL;kSivuBHeo`0Tg;h*PLABjfw zx1CV^_En<)##ajqOUH$F!vcd7o^O9-P*@speV_!l_;_wnRDP`eD zhLuD2!H%W&z~g7e{rUm7j|IL0H;KeNf;3pxp4P06v{90Ok zqm|jlaVpk9C(|gJHeaucUB9CSN9b2(xb#crJRyK?(#yGw8i^%8AxA5tpek zLse5H;#hGAvZbOlva2#)1;3`hvE{J?XB$3daDxJVHBl@}L;X9>Nk6TTAOAxMc2j0l7lng&n$F zNBmOHLgEGfCQ2o*Gb%-4Dwy%fHRN-7+lBvy>d1ESm{AFL7^7xi0TVjx4qSHrCR>1( z?3^kD`9doyBIAG3XoV%_eN+7}v1E1q`BAW!rBAtj-QPeE4H?)UW$0B|P9DbLTq`Wb zImg~d?Vfx0e-4H!9shW1+PiFybI2?KyIBaxGy!WZ)H(234oJk?A$f$f!RPqI#YdCu zJ-wWJJi-$`+inmb99Yl(sz;XlNw7=y;qPnkmb#E}S}|6YVRCcFMF@?d6;V)PR=M8x z&H<%DLWndTtR@D$uFe_~aH}hk?XRFoKQ+!%Tt>W271r>=w_9LP@$W1F{a}d*lrUvc z5RA!--Z|-a)$@2^2QIg%;AX@JqV%tAgbLq3wM>zQbFx)?kRXyp2=-eA6S6L zu5sVrWQEkgB4=4Gyxuv1@j&X^cyH4x=16>SdOZ53lbOLOPV%63mTE7P3bF(O6g_0$ zzv0~&SPpUHv%WFM^@!y9FJwtLf+Ati?Y)cdy`on*}TzD0g)`6SMv6gq*$uK?S;k@ElK<~afbh=DQPxDIMhd1=P zXz`L&W6bv~ohXe$)K0)-c**Zxnbwg8%x3DWcz5py+(TnlJ-PYyZ}L$$gU*@_C(dKP zqQw zq3$#~n!g zGOAxu7}bvm&N%H0mv0^stip5LFN|*_Uic>UAyEm+5TX%CH3&Ycjs1B79>v1r>Dx)j zpr?fcutB~cD7-{uWT5y8@@o?juR`-${?&d{D5?`A>rJx>ZM{6bv|lAsQ*t#DneWrQ z#n=06yVEblriZ}%f~$4MM5hJ9dPxkHlXwiIC?k{gM7XqN58Uw~QE8=vPC8*EQ?%9G z^8J#%Qo>%htRB)3t7D!?kD8st(u64!nAQY>Z9tJ(j7w0gEb5fi17|TAvY{Hu_UR59 zE;}`PfU`2E5E@)eY1WgmBvnx|8I>tT-Zf-l)Br|IK^nsKafj`4GjTYc#)dZ~HW-q% zwM{kOV3AAXC()v8KM&0xzlARgf-5F1iu+0q>4@43fz+=5OXi}Mu1Hk~^4V%QwdY-J zRWJYlE4EqRHcUP}LR?1g#tSh7kG4+^SBrR?T~PO-UD~}DI7GaID9qO;#BZeK)|9yh``j(vD+sh*4kdi^Wwl6citJd!C-5% zF}EPmWT|^FuV$M~^(acxR7qA;S*8TnkI66l0&swed?@`DW!Zc}3n1?wJLq2rL#UQ{ z>i6k?fxAq!z#$y_B+Fu*L^@ygA=GRKl+=|1+os7H`v|v>%h!)e3i1_ZH-x*N*iq#t z*+i$+v*g;!^b#6w_s2*(L)}WKs`hJqEyL7gGI>Ozq6o%MB$T3{Y^en4K|Kquek(d* zTU%NjV;_}mXY^ESp7@7`J^S>@hIj``vX3v$I5jB7gaNaUDZF8eDU8_gYbz!8*Yiuy zljj)j$O<7__m>BVC#PTTtoXDABlSHg#Q;?BShlq(uu-t+o zwt?&SUREa--$C@rHYBsAvO7TNoN{N*0Rr!>VIiSas(!QYI|L8zC%V!Khx3qWQ z-+t&_7E!KwQ&DLb*vZ7?8jS`~td1kM5joRH!B0A0naX(S+E>ngKI~J8ugZU^)`)QP z8I9lb0i|*e7E*!EXHOp_D7TgKlC0HdH~e-O{{Q4xfiw(&BEBFl5fSky5HO(B9mFLb zlW&@yJ*u@bQ^S#8{HAh{#%B11fYF_cH8EP8QPGoVS412RA{-jpw;QK6QwD>MoJ2u6 z(26W^>jBAw_kw#1Pq^#YX-FCA5>=3dK1`=oM_bS~Es}|nWwHpdp&>O1F=O@GdPME`=23&eQc3E( z;H-LM&q`8K>p+N$0^9Wdw~H-u`eWkk&{XsjQ};x?&icaK!&Z z<%b5Z%@k8>Vk2@a8yuA=pU{SskQ?Wfyf9EjQzjc{HjYNaWwXeTuTgWg)4~>tHPVzO zHAk2ur-E3n7r}&!z(!INMA#%wM+q5(h=449RrWFdqX@IC9=|fxys2#5t2HqR9=`g9 z57vE>f+~akZ8{SMvF3#|rXymdn4w8X8iH@1WbC~8<#yXT_}jCrZ^XWXk{e8Oty|At zPSJwnCmjpX9BHiEzdBtJCq8~^I*N4rICq)(rE6a7ZbDw@LXwx%ZoS1ZG$yJLTS)Hv!X~ADC5P<=53?!ZI*W`y`n#-#Wsc9*h z^4!-ZzA{{>_4)jwqM-O$VC-I6rN7LeMR2!^~d!sU` zNu>BVAGR1mL@p(7jMBWo5w|g}i{xJcm(D&8sCdpG%-7#Ri0*KPheBT5AS=BN|uJE%?I6uLHl;^MM)2Yd3A-iAvM#l(fz5(4*YdfH!d!Q5k0&Zeamt+NsS*X zEv$BG-6*-m#icq7zf-3eP8PeOIVidcTzkLsj?=`O!)ke_JKDo?B-skxl0`uH^M$(V z^`tDL%j>vL{ze(8j_XOdRf}3*@$cK|ohsO&dt5dr4NbUeUSReG2MZ~vG}~Iv+zre% zO1A_JYP{~lO^z?arHQqBY7;3Hy@-9}u0Mm9cT9mtbx}EsX1nUh{0s0X<_gMI zez|I1PK`2+k{H5nA4+!q{l^*)BM zP7E~s^Q){AC&@IGjH5DwB5cW4(U?@^{TRAd&Cx6t>GXr(MA0MWqd8VXmx@|4u@dyk zCZ|hD*43hN3nPiAXzw>2wLIiLI9|s*DO`9nU?s1MDdf2&HC?xs(ikDziqTvz7LL=> z!nFQ^Rg7+aMkp?KDq`T^D76nezJH-+EX6p@>b0P;#u5uK-2-N$c^0EWw26hJv}CI9 z;?~ojUK<+*>YM302JQMmolY}6x6)nb{&YrB@2+GjRd9lo9Jhy6rBDm*2kd~=poW^Q zI5rk9v!^|bsiVXzO&Fq@Ye$p!>6#-NHq4N-HHnrOlOmPc$Df;Q-;qTZfa#bl#fG~i zc>RqrdvCx>Xi{x*qBmK1n(K@3DT5B5`Bde+mUr43DuNvI)MnVLuIZ~42z$_z+^HqfneYL^b&F7`r2-SMx zZ(G=dt^wKK3TWRt6hi2e8*6i)#nbW~I_X+R857vb>XO&3K=mxMNX|(0VS(d4P)b*m zUz$8MEJ}x2^Awj(5g$xZOC3rgKAyy{JVwX;B$vgejT2plX}xNrUrm2Rt|3m8jUKzx z8Zk&V8$+lX89@WT_*JM^hBdR9wP-l^$X{Cov3ii;O5 zr!{uGB^h;`B+d=~*-{2wtXSi%MlW8K&_JQb2lCrk;a-IP!p=lzr{ytzF1k5FcYVTG!p^Ws@!7ANas&u zUYO#j&3VIZTIXblQ`2rduj#FtAth#}NAEy6$K^CfO0VzDC{o`BnMhwIFcji5kt%IuSNJgCb0vnqZ%Zv%r`jP3y#Dh1AXv@3;QVp%d%P;v;JLm*|w=R7MQb)BPMub zqb&9#o4ShMbT{ykr5QvStJLWVUAc_y45YuPyN&gPG&{6e@3+F!B~Y-0ADV#^X1E#` z;7iAQ#MHejrX_u=)1ZuJpB1d@1w7Ruqs5y;sOL*Oo6e$>5!sRzvs9NxJR;9$>EQC~ z3(=X`LhS!`eqNZX7!=v6-Ba(LsxO4S73p6$H`c9vq%@+znI4Loj5oS^YG}$?%h(Us z6M!x}2J;Nj(($U>eG+A}+;}Gvw#j8+J{70*T~6K_?L zXTeiTpnJ}ZT)kj#z0Wqwuo7}6dDn=P)2lcs`aIG;=A!HK;i~l%deh1L5!-OiEm3G$ z6ZnP4ZVR&<%__qrdD$kNeI$!oRgmO5t}w##7gFb5`W?=<^65iNM`L4AoR1%yOmbvC zo{cy@FV!?_S1`aVXEV7&|K_ws%f}a8s~h}2I(L+311Dv=BeV5|FyZh{Ai>;difNm+ zHB%!QJy)1(Qbi*YjkYvXRC5mT(D9laBC#Aat$>$hEr;c+L+OP50A8F(MqA15W^I)@ z*SERiy!h{m8ZPS7*=+SN4+aM>r~Sl?`e}@vE40li-Y?NKL61CN3dl`G(QnN5{W zt!S;?WN~^f90k|7VIJ{;%|w@6ah-FWnrG_YJl)!?pBrhnvXgHLay%{VV_-pw$V+YIkaV;f>P`a-Y$RU-&p7T{A%(1#y)TvynXIw1I)TZUxLHcpM$3hd z(8T0~X5n~s6^t=~erxP21V1(z=alb3rc@UNg5MSqf$C#l?892M4#7LF@S;Pd2;Aj_GQ2O3 zV1jCTht?oJ`-f#3>}$V%l9vJvdu4W@g*VO(=Wkt907vTl>;o5Q3%THW?n6}4ERO_V zmBQm{7rlUYBT3<6bS=+S_eMf|hw4Hig^++59<|#TpAX`bjF{_4X~0` zPq*r%7uE&a%|2xr?FKDa47fp3f|TA_iLIJ`P_|TLsG(&`2pU2VwYHT{R3pZA(VEjv zm3;h?AQ}|{a^7iA(}vXZOAaZ21Ny*_tQJdwA!leQ{d}uEbtGcuyyc^3>()H)FTdas zS%HVP!W_I-UzxVH8RU#Q)V4c%dG4-BjnQ>eVk?Z4&%vDE3M~|DvKPprJefd4)qo_i zykBh0W<2*_dC}GVfxoG4Y1-<|o{o&ytLAxmR!Wj-szh3FR$cDBe~UNgL>zyEbJ*yPn4 z1qp59Xps#Fyq4Ks3Om}f0($v9&&J@&s2ezRBXo2$%_liMy_>;{DjvHW5w@*~%qiXP zn?^c`pbpev&_Q$0S zinp4i3Lv2?4NhA`)+QBY!AjpM{th-38xLLy8CCBN_ z4#+0ICr1pM=OUq`l;$!cQ+1xzC0)px8+>FG_Zqvq|002IoB+1`T@;}%n8Ux(<)uU2 zBF`)QWF0*S**D?pIZC|d3-B=Q-G|m_imGJ4 zXqi)}i?B2$6?3NM<9L!WvwArd37ECkX+bJYNKoc!H_!*E7ifgO-EQQz63Gn}<*z}e zGb(@elD0ERLrhYhGqU#NDa@ztF~e$TEk3^)D)IvKm?I z@?`5Rn~mupSG4Vy5;d=o)g1ED3*N?@F15aM$`Y265PY)||0o0NN@sx0X@U137Lwjc zs@Gz+8^?GaeRSNa4=Z#-inXQbBA(h-bRIx zzYTKcEG-M-(VZ9u_f z;bX3c)>Bv^Ri5Su^Nu_n9FHpWmd4V5s8~%P<#_K+%usrp%ypOs8>IlP7x-k9me74I7ek( z;^-4K@fnGekfpN%lStu4Zd@rA<;?S^I%0$MlDjY_P>b~%P=mCBTq=-hAVCq(2G!fu zXA}M=*_#_#c`4E&yqbQoWUS%3S!9nDIO9G%N0L!SKO!2@orw4xuGgyS5$+zcM@KKc z;3h63*)g*4I=J)jQAbyUc1^-soGL3W)l&sg{6bbD^yh?gYr8>?aWcg{_Lz8~r|vE* zZr2QSdd&nV23|If5(A=|v;4*_7``XA_jE#HB6OS<+gDUvn3ori6=7=nC2OHnC6xg8 zhULggtW8iDV;j*MsI<++TI~_zRbFZfK|H&HF+k#QbLV-d@1DX$|6-ax)5+WO<-)8_ zboNmKzA)lSLU>w@W8$+wpBDr0!7wP_;J8V)_H9ih)JIJQk_R?hp3XQq60b%F4!el1 zvGW73f`)oy83$XJ+mwaWxh#m1;ugHGBaN?7Lo1GtwU^k?ZR24j&Yg{(WRs<%F=E$T z+w1BWX&B$tF3SREB}c?JTFyy7Gb*rdkk3U2X8g<3JyrD+^ZrbRGA$`O&rH&fGGUVo zfnlzp50K)?8Qd!DLa**?_HRE4f>b{RLhx__cyJEpF-m4|EI%|ws=+s?J_kGX;U$M|cfF!vn6LVQj ztldhz>WL`H3OdSru(q05^tXPl{jUv{lcPfOv&aEFz48QDR=FC?i4x^f`=)H3h7mg2 zNf2JB0g^SQ*hiROiY5Cq#!d0NG$z|)GpJu~EYWD1l$~YQ(~$*28|g8x0h-xBONb;CaZ50X zL;vZ7W#>Cna_3J%9B>6KpMBpHxMZ;|0v?v87EXd^+_x>F#_-%**_XYtrlA7~mpYA_ z{_B%M;Bo7P&NweK3rW#Z8p>LiYUDTMgKW!q6PwnIz^gmM%5(Snl*MdF7K_{&oQF2t(AwS(@bkQ!9?A=dt=q>@zkr|O% z@O%5Hpu~feDcc%xdnvDxn0-Yqwi<`-OweGGVk5PjJnx$RtL`PEY-o8!8d+y+d z{bbLa$%cw#c&U-Jc!s1f|0v`)<}8ux>QP)cF>=f4X8SJ#%4cNp(|JUaI!v4gwy5L- zr}Xli(ep%C-@eMg>75~3K?|{7RqT#(5jl&{*x6#g&vhBSStQeCClnG$Rtvq{B-evCM^$|Pnx0_~@nM%#*(7wooDrcm)VWGL{wYqYZk zqYz$cN2~@ot>krUOb~AO8s*kaJMF|ei}7fa6-4+D#SZ(t)X~IIWZ;2`Raw-SHW4i^ ztvO+4=t8b*fWtjV$C@-h%p2HJ6$oMTQMR^h3I#H^1ajZcpK8HJ(aA% zqk_>x49O^K+vPgBBok|)1xKSg)WzDZ20-H}QTRSjE9Q2lpH_cMQl;&Z+SyJ4`1MvW zNnZr2$roU5TV|-!7SnKoWf0^Cp|4b&n)E@`4cf1em7vEP=n6dHwj|@LYs<@Nc1<6f ziG3)=9vm*kT$ZLrI%nLKtfe_MTjCL8x=dbO!mFiV&}G*XP^@Fd_U5o`CG2xglfHqm z#M7j_d2F%oX8IV*d{j%j(Ls|qrSWBBh z`d)8jl~}n=DE(cx>ljA;0WD{MTr-_NQqxRxh8%70UB)4fjxC{wi3Y3N=Wz26dZK0X zE|pQ%!bykz{m?i9nnr4oYmL}}S-|!+feRJO}azS4HHklN(M>52rbrTfXLW~o1{=suy zbyx}e)o5}dq=l5-^ZAM9XJzPVt3>&q%M+ij$O&@Cd5K%+ue>kX$FRvZi?OIB-5Q9h zhOr;2_iBNb?Zh6Ru8V(HC;vIFuEBOF=Z4DG`gEzn9T|J-pf^EmFYbs`=W8I{+GLU^ zsbigFPnBkkjnw!X?DA~Ez;<&3LmRT>usW)FX?5#_h(R1_Me{OYtU>YM>e;6)U}?@g zWnG!^k(MfJ;#ih?Fbk?q(VpHwI@n(KRU!6XILe~^LRl4~o@o=))Kl7p^YA&p_0qkg zhCa0_(*xM1Z|0%&0oA2c91c1I+-?)gku+`>mON(P3RH`uMO8Zpv^226@3AtD0_qrW zjoGZ)IvC8V(7nSwT3c;pT#=vAraYzF^PN9o%@7(RT^huBq|UI3q3Xi?SaE)2Q7*54 zM48cTozLEWbvNR3fP>4<7!9h><`sDiCBL!dM~RiFn&E{=Qw0cXhq^gp1*a!vPFNgH ziMYyli5BJEk3x>={EOS(ztU3+o9?vT&?%4lvZq;$3M&CFz&&}=f$=RuqQu{2iF{(b zPe%}z5^o$?0pdkken(Y9!=ya86#J{~WZqKRmi!mo`T*H#%)SNZwSDFhq|^}0)rpWD zleOo@FQuOK4viY?qM?+~s-nT*#DzXLv7V8mJK^CoQFFQ;+hqR8=E_@|+ZkW;Y>PHm zlLF~E19q(>p%l4|CJwp1b1{-T<)?$EQ4+*Y(2*zNDy7t8exwX4dtO6ko=JTNa<^R();pO9g>(W}rxx8OLxhcHGH3rb%gShBx=4MWTJC7J^gTT11d6zbr%P&BV}G=Vf^Y^Jf?_oBxX=`N=% z91jPRF(A%1Rz(%bZ2N?|gJ?h$&Ay^rXs=G(XT7nZBg?5h{@{G>es(Io(5@fcxK|XJ zd?QVw86%f(BYN-%%S71}o_ur2qWyJFQ4X}xbZFwUXg7qY-7lORXDl|^bUgMfeGY24 z(p*o-m|tAke!yY6fjuwf*$Il5q<6n4crEfY%~R-&8aX^Hju9zl_0!y1t|!a61U^IDU~aj;peOCLh0FY0J*JQ~P&3o*!= z1(b=t)a6^4sRhl;sdX3aQ@zm2SYDA+NzOkdqVh|hD~Dn)`@)$!+6m|mBO|Cgmeb0Za$~%pdl&EBe{L_ z1H7EYfdXRYVJQ#Yo5|hl;eIZ?oBloWJ@}g0=5mRXhSc=P;Zd?|GV=Y|2A)2}3QRU0 zm!0ag^~DfzPTcso@1 z(iFNWV;bkdsD5=J440ss99j}>+Tu4N8mal$3ZYqZNb*jT<>*tUkmFhyShBTc6iZ=J z4LCF#yzar~;Vh3xj2Bsq#)+%U;ascs3$V-XSlLBs$S9a_Yn~&A8~h*k-a4$#XIT?n zxLfcbfrV>u4esvl?(PyGxa-2*-CYuby9alN;DjK7kh^~8oIQu^yLaxnb7$_%JkMT# ze1EO}zV7O(>aMrD>WxjeDPB5FTh?J(C0{6!o~TFYXZesofj}w7z$BzCIp#dSdsl-( z{_Gk}r6=@Gnok0@;R?eE-8q~qIK_=$4Yu9eKE%lJME_e?4UvI1zWH$zgYN8)Ibop^ zMNo1J;b?t3nAqk=swjquQT&jvqP|#>ad!9Y5r|0KXS!1BTM=SJ`QrtVUP&ijtWxmVD(a zw8^n1Rb55jZ<1hblN*|OGUV60Etd-_c;iy(gei~R=Iryc@CIPF#ANC0Aye_Xnw8in zyleSNbf*HVxOA!94t7m>b*PtbQQd=DEvl=M;X!mre#XQI%?sB&m=ktgg)GAZ>2qH| zBz&)mr&rrN&x)pc-9L|Lx0hK#wJ9Yh4xf_h^F=ixYik`vR0>(frzFd{w|K#xsziwr zanCX)#*Z&1sw=xi-O|63f|o$a9MzSJZ2UG8(IWPS zc746b@vD?n$oNFdhlcXWPr?*UZSm5qs59IjdQ+i7BVs+5z3x%RLKHC%|l1>}9?<+^>5-hT58G9CkW+u@17F zN@aN+1iCj3Ft{$zgqP8AX;tbueoR-cEkZNIIZm?1#DI)A=rQyKt2f8EV+EllyjvQ$381jI$vHC?qv=S0v}A%sB8wS_v(F=IF7T4R+=zLwn- zZ}22YRR+&GZ}%j@A(l&P2-X<<7M=H<7a_p|?Nr^J?wQ;qlbd@|mmK4{EFD z@Ws0hfti$UhF1c|7yj?x{-i0FR<5C){0}sl*6z}Mm%xGE`UG1i)dy#`<%{+r%rOn> zF=U50_@cw7XK#LH^)M*P@0}6uSBLH+%G60MmTmSG=5iu1%F(N3YwfAm^F4_*IvYpQ zhIdeR=qO9_W8&{^cblN!uNpRS^+%#UQnc&!f@-LWm8fuZ(NmKqmJK?OzS8MF=dk?G^%=ySxE z13a%r@7~4AH-6XECAHCYP-~;QV!wzuKYkn>^CEB0l@?y9VVDe5u6>?q7#CHv)pwKd24C+&UB(Gq`uD*sMoW6 zkfJSzKp;keLO>$Jc+NkUta<5MSa#;Sh((Z%tAJyt`SxMH5xcY}v#hfz;DmmS+mKoB z$|ZszdHrCBU~dU0W$(+(tQccPnp7PZ?FBXzef=g6jJz@St5S{cNw3E=?(_?tqSUK9 zc5X^t)>!YiViKir+XY~_rTMiF8ehqNm?3B6eJ%I3p>8&zl-esdhFL1dNty;)UZCLC zzWut!UbMxPR;@A=LG{V5vL@pmFGy*`$bEUv!i0=4xDgO%I5Ec!KSFtGD$HnBZqP5y z?7j@6VYu&ng-9j4JxY4*VYQIjsEl#Nc)ACI$sJ|LuUlz{NiwmRpaFr*Z0BQBl>j`* ztHYXy6+I)u2_n__c%22Tl9dCTJbV={wCddOIvTh%Y`tFwv}I%xSKor<930oRkfb%E zldDl|7`_1M(%Cn;qgzgunlM~SCBvnqTP+Ls#k%@Hi;uQ95KH&d+(Gs_ajJgdP#}?s zM<>)Jz**fj;5y8cc8{lrT)x~nR$&&p2bjL^gEP^EGzh%X{3QRu?Jp9$H+TgpPz-WpB61OSU zYu+1?l`;$Et4S5*(G~ovO09=Xj_6NT5M-RG(QHAS43TA2ycQ{`WZ0_qc{N%GXX^>| za@D8I3@ACR9A3L`gulmRTOiQRsGh~71`e+m1vK0Aeu$;R7$+jTEPBCvvrB8c&_J8BRWI(!`GK zA|O7C=X99b^y=h-lES^*EUM0ooaR>#z*jgqu1}~F&a(q!xb`kGGzVi!k~(R1INxU& zOh>eF-F9Y$;7gg$xA*rHjhv!g=_2rxf|HUe`e%WsA@{n;mG|!ioUNV*XUTVm@M`5w znmeK#J7W_9R9N;&;VMU`@To*!GIaCaXK-Z$Lw=mF#CMu$c_bOksScG?!n2 ziS%m_vBI7VO+R7NdmT7>=dRHytGZ|Ju~mrIgbW;9Z(S}?Z~5Mcrx&R#(KA4~o*}G^ zrCWn)KnuCOGsym?T%xkn6Sy_Tc(Kkm9=TvI76&GS23O*d>E|6x1${bajN+0beLWBy z?ad-h{miiTsunmcHG5S?3(surwzKaYIYg9^qCAD{OE$(foPexoXOY{e7BwuI*-GXZ zsn;+-6YdU-Z-GI|iQJd1A*g6TEGd6-a!B&aZf<^kXo_b#5OQ`KW79n{BxiY9avHA6XWZM4cf@vXBd~szl*LsN?A@Bvs zuTGnDEB7w!IRH!oqyGzl^Pblq!ZYcoVC%_Y_q~vSa6355ES%E+Y@+h`?w&XkQ+u{`(oOK_Efs#t|A7I9;=Qr^-Lq5n;8K`PO-Wxnpm> zg`XJ)N_G<|*dp&rB|6OR5Pk{A0~RtD6fG<@SINOW(J`U!G6dm!799Pg3*s&4 zHvRgRgjPA(G%7Q|M#8bRCbvNx#7H=kk8}t0_P+C z&?byli?uYXm)|HC`+3J~RGK7Zo&bS1#P4QXzojs_sy2&ig$y<4tzsaIAQR>%hZ^1Rz z`o1lqM@n#8tbU4$yO~Nac2PSW{V`I$Uip>Qw>7)nZRzR(-Ci-x4u&8`ODCk6erH84 zgD9AMe{d^A+FtY8at}jVxvDhI6R{~}Q8`@$oEYBmjlZ46?e>Daf2pe3&bMt;oe^aa zAD`;#!l{I%u}B5)Mw7YKjChryv{V(8EKDt3r0jSd`7yz(v6L7>5B>PZ+<2R_Dobcy zQ(qzr4#x-%aVk5mpUmDG!v`wn#$&G%1mj0%AyYtgu?1yTj-5`hnStDAl8wc-Z25t< zw6D#l<GV`Bqah;hEy_E_E^S4K$1av^&1T)`Hxpcd5oF}2%rJQ$CBI?c)~ zt+ak>Gij=S&pA9pyLv}o+!vIn$*?FxMRcEs)mb^J!y_HyVhA^XFQ5HM<`)p*(J0&!UA3zyuBM7%=j}*>A_3q<|d=nAz6JyeFm8A0w zua|VSnYT~>{s!F)wtq=+)O_4dls$7%sQ$;=t0`rRN_OIr@9L$qX&rJ36`58p4&!sB z{s)1dZ2W`iC?14Ix%M&*Q-q!8Z3K0yT^7t~yT0&jad0YGXXBwpseYyMCOm2U&eQ5= zYW)RNS>;aX7Iw@mz{S{=Txv9=>6e80E%0PS`>wkL3Fy~;%UP1)>noD;$>xV9AG%)? z$6-F%}__3SVrqaU&glSs7`R>y(Exi#-&j!SaipdXeN z2hG5ph}e5$ObrZeZ@g~iqdg&d@#h!s$VsD*_;I+jkzsXph3f77Kk9?VbTw-u zSBLbqHn)Y-T>>=Wx*A&9#DqBzK;H3hL>nl1nCB=L;3jO%LP8J6?7h%un8VjB3QZ ziZvmu+_bS-goNn~9T-^l5I5b7c$4bv(D&u%FmfuYqF}YHNZ+3Q|%j zL^9OUPr(l0$}7tsIs%sAPTvSoy@@*VTy<6-&@-vqtrC!mc<6E4tL8=J>AOkG&BE1} z{?c>wVL0BvU8TxWpEG7ow)cvlRebk6{M`Q52b=l_-beJ3PF`~NqvbpphRd2Tw)`bP z7boEDDeR%epOn1tH|r>WPfr{!piSU19qY#^fO=JP9ZMb zWp1|TDCm2BDL`z&W=d1hwEc+jF;d2JnG*18m<5d=m9Q}r*i6G%D>LG ziMF~!_??>%nLnI_8`@dS9sn4?ATo7n!woz0KEFUQo%+Z3CNA4*))SkUbKW(ZL$t~0 zsI%ugj0A~=^eHBUw33m%fwF*=!(?0|V%Ny4q9La(?&m5I;>6-V-J&FoB&w$g5TFhS z@uketqBx{T6%($AoQ+GCQijKiq%16!7XkIOQ80@lLlOi+LKzhDas^IQof23eWK*p6 ziRU#)V@Vg-kdI(}k=+OLM1)a;K9hRF!)xSbUOar;d^D-O`Kp0a({=b^QB#K7v0kNr zOHD&dIcyVVlZ3iF7UJhuI7?)r&rivXFD&iT2^Cmh@>OIDK_>*B=m7%zCE4-RaF1>e z6B^S4M}aJ*%wWktL-&&K3?I5ed+<^WRrjfv7XMTAd;ZNEmL4142>qB|%?Wn7a=P~j ztyYlk7<%EaUmDVHo;xQ6P4rDQO8b$70PdSGPwV-LHpg~l;8;yPy6h{#imHlYF{U%h z2vzP6`ASx&d4Gk@R zbvp0*5rsdz35N{CqT-O?m==)WT0l%$4~>)osfOeKXcq=xRQgQ<$@<~^Rm4A&z;+#t${a3pp4WI-uU1+@vj7&bGACzL5X zZIp1wgm4f8gE5wU0m0uNLN-T&uQ)y z>E#B^;18^o`gvKM;qa@JC#Q(l+yN*vwn8XDb}cp88b~z=kYiPKB$Q%m!+_ZTezJe$b{fb?JdyG9Jx({O+yX|Y_=X-5b zjJT4e(@HM9%oHr!Slw8O*Y?@8iT*d3+%o5CQ~yN9A`Vrdh!NE-a^cv@q)AdrDaN#v z;L>HHQ`uRPnSCmFuPM`K5YZY;(u!GVP!<1HyHr>zTULTidk?_VI(^Dxt$Juv$ z%5WvuV|LzBadj@+3+(8XfFljw=MB8NugogN;Fhl=9AJtF5bPz>Q2NJe-Guycj|qz> zA1rgk%0g@`1b4xLjJMyk4xudGNciu2^>U~F$gC|x`%C1eiGs^Ctp`FVj3F2io-`Dt zopOb;@1@vQGjyksA3y5dp=dYN-~wq|fhQO+!GR6XTEYc&CA{%!k|ogduh3{xWXb&1HxL+_;oOb|YCh`h&iWOfgw6$MYu(LRrET2YJF2dtJ(0!qW~FhcNLDxr1e02t|jOBBH_B zyn01NH+##PiRRY&x(PAxy=)DM4tr6=1AH9>92DN$j^@*ua2Sn-Qjn(vlmsw(NH1*l z#d^J9>HHY~4WBhu`BX8R{tRQ#C_eq&^#{2^rkraFoSjTI;p>>bHcs^}0}+7&@**|h zUd~1`Cw_)&FVPZ)Z6Cx)F|~IxE85qw9Hl>oK* zn_EvK@=Dh(mJN|RYfB@K^ubwdubEF|>(nyr=Y>w@sxl}Q0jRFS`N+BemQ#U9;DtpH8t@I z@J@I2oPE`!@E3qQU3|3AH<>Ewgoey&0=~MLt&E9P`722RLlP{orQ9*(N0AmU^f%V? z={LNbUk2N_#bDS|OP@{_b zam45hSvUuzAR1OJmVY-q&et8TmTIL@@bW|QFMIIYHx;C*3Pcvbbe?|mR1-aUQ1B)&&;rE^qM97(_=928^5q>Km_BOeEn4a$+OvyDRnNoYU?;3x0=VJEzI zeGAjTGtr9hZ)OMx1gSvMV@`TM5G%C+U5dN2U zvk@Oy5{Zm5P})T=UQjRu@-jMsWFkdtD$Tt~<2#SSOsNv=XWifLYo&Ak0#* z01`mDM%2!msc{4k68y}IAd0MX4jLdDHIB0_p}q$7)PcMN1+8!RUe4~zY0pWo3W@{E zz4O#ruk&MmxGL0i)KS7(Cxv>HqXXKQ2`9AuI@)#UR?N2NGh)NTq#3Fi7E`uJ?4jZg zrQ!}@02OyDcRy4-^dJV98DQ=Ynt>*|AOwyeX%qzs0ssgj0KIlc|2$)?H^OfVMEgAV zN@n0=Rtu^O!*3ba@sWkAI;B72zEqFj6{p083!mizoBuLm9ccY`L+D$(5+c9 z@LHfS3Qpmy)1C!?H$`}#P1m*H9G|+*ME8LtHCGwk*{;Pp@BW%C+*tthUMS#hB`NxaY+ zCBEgOHV5K$ibM{}a0|+OWD#8;ZonFlpgDl(ww zjDZQr1h~y6j-U|g^I(Sc%*(aYTl@QW-=^t~(zI5SrHt?+u=P~p#TPX%F=)PEVu`}K zU#=0H6HTvIxzcFi-Xb%+fv+shOnXCf{Nf`O8(9V-7eu=E)z+66jQsLC)gOVx5uZpK zu09PtJ%YJep8n9dv=n#xaY%!oPP>bDEG{YKut;Qvv!6qs6U+>k`xo_LYzQ6jxhJG> z8{74p3)DUzFDy=6u-e?jI2!2YX6MHn&##9AHX31GPS?(BH{srt_n~8hk8i$Rfa{fB zP1mmX0|cQ3;aUi;(e@FCJL`-r@5S`qt$lt_kbm(`KCVw;lRVsKe#O=LMEgS{W3KOk z{1KmktY}~bJN2LX2xi$B5>8I=H|(9cjO_4g|8Sj?9fTy&OM85905|IG?ere4%gtq{ zxw5aT?Sb1q?Ek|c*563R6*z=PKRMLjd)$G^vv%{Phr9pK@eQ8#EA9F14PD=?R*_lK zqs$$Gw*>zko%R;x!}Jv~+kGGRa0liCyFXHHczcSc&5xm>z{$j~GWVhj3i5CB?_z6w z)tfy%Qr}Q9Oi6};yKLL#Q2z_S4`!Y0CPGvf`}smZ?k_awc;JTrYJMtmp%(RecW=M_ z82v`>3MDn>R^V_0%sTP^X1IKRr)Mq`e{&z%jH%rNx$>Kz^~rw$6d8UrDPH1f10ji= zG!&@e{e#kokKlc%?yPS$C&y$6cBB2{(Bsv$2oQ&x>6^?n>@&soW}EXgg-S^pRaMm} zM?aFGI~TepE3tto;(=i_f_=LeVz)ZZ4#}QKc!PcNm5g73#!{;{U&7O3pcS1*pcA=> z<$_q~vhtCYXvMk5+zzN=dYW|Am(Y{?WSphg}*+6;qR@lKZO2v$K%C4xqpB@SE$A3xsZ3Z?K8(p*3*Yd zw&*6t*q^G=#q09ByM>!i;&;Z4++vU=hyi$HIFyP$q$&<*)+o}zV9sl+?ZS=*-gzc!XX~GvtGsMo@_F0m z)3STFF0cPe=Q;WQre$m03mQ4h6zo6G zG*ep1rOVtAC11TBFxo(d%!CR#e>7Y9>3H@FV141bHhgW-TfTE87@{;|FKJil>Vchc!={tdHI03Mm)2b*s93P;Y% zVSGt1<}iD^=C09igB|9{glLP3+j*91^S!V2XXVE^qeb`oiQk0$?&ToLS*2}94cbm? z!x!jKFAcGl2;X|FGA^EkIXr6kl=Rh{U1k0*rQZgjYz|rmbvrE^U{t9SZGEPx2lMB;Z-Q|2Kq^92nQ8Yo*NaMHL@QF;bink{~TupT|z6 zH_S0^x=A%5)hVe~d}!wSoEC_c3w!b-%PBw!a`%Z>WwcBY)&&6w75QQmsIH-xO!2bH z;m+fg5*fq&qVGPWH^&gZOP5Lts0*kZigmz`w-Wf=`jSpsW*jS_a&5uY0ocZH-XW87gtN+b!c4~l~c1;P+ zE1WGN1KUo3z{#u4?SHxLf4S}dT;TtAw&nkUD|G$wHtu%C{Nx9A24}0Slmpb!f!5PZ z{>yK=#i{OE<{k$%%zNQO$oMSSlkiZepd-PPipZ#Vl~{)9S57F&@4e36&uBbII}2RW zgbU24XME)b`pGC+C&y%mHq@r$P|PJ3)}2tV?9Vw5u)L9+#P2A~5L0Ee%#!3@Oe-LP zB)$mX~%2>9w8dhzF3%&N$$+ zs+2kJZE$d!)KsT;KoVc+5NBfBb$JKB-DZS0j)d;c6Kc!&p;Z2+jT`3(aVu90OBwTq zfxIrIxVmZ)a1`r9oevHtRw+8QJ`*IF zBNpTp21ci=s6$QSLZ3+4d_!1#3(yT+^nj@D>|Wo5QUrbtCk^nHXbZ4`)C&9Oxv9Q= zxdW>G*FNN5Th4#qm;W!?a%O_LJ+BDV6Z@au-k-1?jL9h65?3=EwgYcJrVL#ole=Q1 z>;O~SmGp(`SKG6E%2*^Ctq})#QL{C-!mvU(wqOy5vHra>>o=vXjb8vd)C~U%8-`zi zEdB3aSiH%sfoGW`l+&W>Q~f31!`bRnuz~m{oQbMJpXtnTSt1TuL;>aLq-_dcYhOip zr6|5GG%Gr_;W|`L7A@VEA35r1eGpaL6O9GVK-kl)dDqrL9$g9)R zZbXMb5j3(3=0tlQjLK{h_yxfDJ5ja^0J=ZE{RU%QWAJhtuOauZ5aM6a;@@KG|1+b- z`PeokE=@P5p7yl*11h;1v~eRp6IN5DYz?AycZ`DIR@IM1=a|kl_TgpgnB>Y{xDjARLWn6oja5Kim!qO>3dwq&y20HLz$|AGEgNl4D0I zaI@49bqVLxH|>{cqd;de(BeEc|1n=u?0OvX?YLn9s}Uu&e!kHkrA$s>?c09q;Etih zx->$eMcaoYSYN+jG;!we+EzmC;%=PE!`~KfNl%9Ek;Ou^$4(Q4rx3)P?BmsyKumbp!E~(oz?#ze*QD z7)K!afGGt1SyV8*Aj67WCp;Zq_=AXp&?`E345dbAI0IQj{X=b5Wct7xd28N6^r(8N?Q%T<&8CmiH?pOrhc zR%fk5@1!AC=2lne8*tUpXHw{^o>Y*T;}EY4`d98Yc4xXzLfb3(vy(iuMMsENe3a|# zwhxV=3Iqkmg-tlN$CaQYz0Q=A64O*6R~(vIE$l?@IW=ra*Lm4NUTAZ;b|eFwVNOZS)fA#5xAjWK$We^5c=7XP zZK;Y`ZDu-~+P%=ZpiYa9W`)ohC>1dU8`QBO%sFAQCyHocKt!7kE3$s%$lG0aU`CrIB`~tQV6b zmS_=sG%>C8YF>@4<&}SK&Z)WTFbgP~m4!WT49B_zB~b@2`khH15@+LRcs!FjX(5^M4LwD<3cMt4L3}oaPpe1)Q85r zi-@A1cN-1N-IWTUY%~qw=*=D@HzV@X&!ZQzRZdnxA3jbNp+(^j2!-p-BQXv)*0qI% zrHLdVHR}lo9Rv^yL7+MpSk%B9tk_5W*r!;heO{VdE9+9!XbmYo>o7vQ??xO8p4s{2}2|NBuynJmvP z?~YF?!O&h;QkZ#(wyTT}#g0#o@cc*mhuZ<}oddj1!|itR<-D!WS~7m3sxcXcZp&@7 zwD@p#mkD#Vkc^!fC+m~E>1pj(gs|jo=?2#;ZB6RlGesce#$~d8UA#auBj7bY&M{EA zEQdw~e?IZXR2O{tQN>s)=PZ%x(w3z9hqHWrckG<1OG7N|yLq_PZUM(!E$?9KMB#$m=LuYW>!5~mB5%$ zif-|IB~9cKYYXU6I~uQ0_3eXF+sK*AD(Rmlyp|2a$#w+sa@fO;tfu2az=KJ^ETx$e z6IGToVkkAGPwl0;O#i2?+nH~$$_cdw;#RwOuf#IBVeQwMc^2bT@x>)hUFZXDTkL^ED`0wFUMvr-!uD0eu%Af1xe{=op znFn+wCCM!RQfdD-e@KFoY>rV+Hgc8$DOCQ@Y+Zu3VLV&1({WjC2KH+<`vOm%2@sK? z5NVt{fEJ-Yy}&ts#~9b6@oa-FDBOl5k@}+z;Y4F_yrwRBMmULRaIvO}%sWAN{9fpZ z$w^4OeE>H&`3X%c@;?$R|7%nFkN&Klzy!M*4!c_i2#3RaKQWX7s#dKg!rl{~_rmO<*P)}2#BVvhAsZ{ISmuXm~zTNm4vR7hWiP{8M* zAIR>AfSy!9?#w6y7&~c&!xTi(P{SnH?SD}5LB@^`T`c3GCPjTjB7!I;M81GQDZj3Pi;8F{?j&;T&DMzsbAR@BRkw zl6zTC+%vd~I-cjt4-?zO-`megu%#NTG;6+2J|e2IeT!}6i^Bi0Hq6&1;4I9ZYmRl> z;$#KYx_c@|dK>?HrySv|p1<{%ZzH;7{H<1n88WqJ+Eu8^X$Lg$B4sXVh{BX2)cNCN zbyyMc$S!FT@rc3^!CnAp8|8?ygz=1#ipY>9)Wi|$$RZ2?6U3})kzyb?LWYPW015UC zlaQg**i!ws4p{RVt;Vv+-fR81?MhSo*>$Y}KUKYAd60PWs9yTAH}i%?GkS{L2|{j> z37%imv2ZlYF;izMOv4=|vx3^cyu#wZ*fb>S=6O{RUxh$R4bj7_`$|y}2Ab=0T5bOk zNgnw2U|Mbg!h3Yws4=;J>wyR3Bg#9*!|PvwaWH{BxEJGp^&%*v_Ut#Ay?fcEO6Zcr zN`ml68T$9ZYof1|Os-@`O`KklP7P2yr>*JJh=6(_#2t(DwmM0pZR8@G3Ty@I;w(h(xhtY+$mWDUYW+kHNwgqPAVp$v3;!M!x`; z*J@8sFTeeF;s}aArZ!C`oz)CbA;M1Lp+hg-3^yq#mn=v0qiG9e2A~aaVo5~uB8rq5 zC$JESWPMhqOh+yVV-7P0{oAzllEBbNQ!-rx;ICC|G7$ze4WJZiZNM}mc3_Q|`I|;` zznp`=(+G59!cb-`(m8Hq3T`aYB*jqbQ{${KNN~nZzz1+u(E)UHCO|-lRmma;Ze-mj z*qk>()w_zTsB2Co7QIu8O@#CQxqnpE-!#?gFWJaWh2+*+a)YbY@q5t)TP&Qhxk$PF ztW=qzaE$)3UJ`4?*xhVh$4=8c5wcVD_Cx7n^IwEdeXWF6>6eY)&*0b%4uAWr*Io@q zu1?d;1jXWQwK{C+^T%2b`*n`?x-PYlOST`kpNOtXmfUw^Sov}MKIR=%K0Ul_pzyNy z6`#NSZJ@dOi+?e${Fes`S~=*wQpf!~cd`QJw#s~|ir;=yMLVv?q796q%yvyO*J(sNYC4_VmY6f-TAsG$6l|CCv3lUS-zZ0G#sd? zA);MQpo>Un}hE`Y*)5seB91(rLg;4=j1cur5=E5$K!UUE-HmZI9 zTk+j3kK+VxxQO^X)!{Q|^pG_gX*F4ZBI-229^fAMaqsh?QWOQM5%U+zr9-Ckh*(oe z6Fi9)AP~qEV}yQjp6liu)M__Us>g*_y}@g*@>+q`DO&wpO|XPx5giUshzVl}zzMFt zjw-nOaKxZ@&tuiS|E_YM$V7+i=WNn10FSi)0b^w_5MmV_ZIsua&!?`PVdNfESntkx z04C$j_UR&C`OIC}yPJ&U?|+niX^7C+#w{@5qXEaHF7xb-q~V8};qah9`yipf2UFP% zC&&3zn(SLxWpTfEGjK0-vrv&~y_S2W7xwAngF3{7;;Qhbdo}Nck6Bo=*SqAzyPUxJ z&7hLZXO+=UN^?^}))zf(uv9jw z!zfHzOROTy2zA%`xEOd)L-oLllC&(8Q;fWldH~~G3~#|Fr81;MPAq_GO_QuLnEQ}M zS`iZu%z!AZ9Qqf%8$cNZ5Cvar20(x%SOzQ8;LEvgj)&6cxK=sSCVbY@zOWT~aA;Al zL|D3d+3_g*^cJc2COu?(1^pKQ`_$guvA4nC+q8D)rR$vksF%hlkJoQgAp9;sh*(gS zYXm+3giQ^=lZ{UUU{hlW_L}w&K!y{%4~AAFs&w`ra3}t8x33AuE@FrDex>Q+<5>#v z{NA;?%*H<#zom~c000D%000Ex;nx5F9Cdgc3BWmg;W4EqolCE9VN#3NwtU)oX4hNRV0)>`WeeW0GuXkLG)}dP4Pf@sqSj9>z(vIl$$!w}`F3ir4UYYPQo~??s5<}y;|wfwurAOv z+bi7H^lj=tRRRu5R&ag+qAz})<&HR_T95erruE0a4Z|%4HR^&83O`A0Mjg}yb|uPd9|sR>Z`-}pQiMrK4|26% z$qWpQV!&1*N0{Qbda6ddWkC$Ew8;sQWFaat#RFu)W<&y^(e9d&7HVQ4he1P%=YhJJ z>@w8lI6j8Wrh|Z(pIMfcRg8%ztpX3G)e5kW(RFD2)|-9yVEGL@yeqxb;xL4F^?K%j z4#SI8-KN-E!Z3v{(%mKBr0%wbSZTAC%XVk^s$tgkOWdd8;9!jfWz_WgA)W%*`DWX*v<>{ zt9PSEcq;_j-+gEJLyEFGlUkTHBgnc~`t$Gjm%m(w*tjRdkf zRj60kRbBSrLE-MgXXjl2(G{^^#qm-UYCe2{yY>WiMhMNEV*FJY>98S9xHDdLe+kW) zQ>1bDhk(U^a1=!_li^6#NV#=2i#2+$2$=ZDlp9rPf*DnX3kqw12_CNmfDZnB`qA~< zJp9(_y!rV8JqgVYuMhJmXBNWRTp3@DFxYKg?{(7;X9c0N`zFd;Qpy*vb`D_|2m6`CW z#kD-T3;EZW7z+(`BiTpZ2=}g?PatnIVI zRZ$=RpOE#q9<6`X)I0C#_Nx|)zbX;!_YjGqqFGwh=kC&GiUhgY=*P#|9p7FxMvsso z|Fj%|o^{TYQb)u%^*$iMm{UnM?U!c1!Unoi_R*(fi;rm~D=QZBSW}_lxqcxHKvs$0 zx2IqRLo;{xYwSEJv#aDTCDr9kBNge}1zj{6trkqkj;(E27m!aIz1E~ zGCH$;SJ*9=rNhsm&7Yajx60>#!0z>%_GahiU|l$jNu*VY?M-OafR-pCce1mNG*9`e z!$2O#jZqeZV^VX<0yKZoBmTh(z|ydNHQ*#a=}PZTywEqwd$T;yxNBB)T>b{M4Gt0X zRbINHYSHccZ8_#)s9Xl3-~n*1Qhb#tVIT<OP9K@w4ndM* zkj<$HLeQx*%-E({v5gWYGe`5nQTgUyqyhZnt=FGkZSF13Nc`MjzIfL4Zu9CCdff4s zZQkk>jFi+yD8i790D`(ArO49-BT5p8>A_JRB0w1(oZ^e92novji(nV~f*M9m9}ydT z6jaH8`MRQ_%!ntFwvbJ}APk)8Ym(JV3EmD;f|KsUV+>6k-_KmYgY0@7#o1%$EM&xW zF=t{zY~@_Dl^h6|9s(iD$CBYy%BWjO%8cU!OwJ8yJeGLkehY;9@BHsJJ^gQX!Hh>$ zv-98P&s`hbjKtXbZL65V;{$>8bL$w?@NrK=zX0#AYEfuFyiP@Y3k8OJS~UQ7N5FTz zJk)_jnAJs?KL=|y2Z(EJHDM(&EesEj8KM!0qY|r*&WlJlGk{&h(S}g-hgmC#_qd`; zz@(_Qs}_jYY0JEIW)RF(O{CHgo@o=90KnQhnCTnU;OAg5qhj?)FrtnEn+bdXRaw9+u}O!4F6%qdD)qAy8#>m zv&fWWgsg({4Z_4s147lXXJKT9B-O=Kg;XCnlrU+9AxC1j8zK-!Mh(P{f;>azt0?yu z)Nwsr1^VaKPu+g}dpIb2Ztq{5>nPF;KJxhsCh`3PE|6GM9_}WcSR%ztOqDjIx8F(-SKKyycUT87cQ z0C;i>fP8=&ID-^AI**!!ghUAfqPBll%_PvWsA3czKG2f9U=$vUlPS;&{SY0D=LijM}PDEkW``EQt6>mPc7A|3l5;K%;56Jq7~LA2+{?RB*0ZtF(hIS!%RF>QyrbG42!LYYEJBSNKk zdtp&_wP-1e3tm*%-86a~igiA%EGJXbtRTutKKDxZ&xy1=j?Rds*Wm`YA-@1$!6A#N z_jiHmsrw|$Z_g(@;M=pNEisPc?OIWM5V(LUdS1K%LIKZ=L(31!EJb9l(ZX3G4KPgM z0S@6Y9)#iARu9MAd*)^vBjoErV(4Ve(dEkAYt$lm0el}`fe^W1q^*^c55C^m{g;kX z{=(f=zcI?}aUtu)A2L%^Liz4fN3rZC4!N7nIlrE0si~X?sg&Z(e-v=X03}qHS$UbR z)F)=s`)o&AHcSZ><^)a092gkeWU}h>plnmQd7AMaqHB811v{|l&t?8o zp85Zx>#Ty>`rdF&X>lv=6bWmfttu8NaHl+O!S$?gFY)dF-A}Y6et#6%lVWNnsBBg%N*dbEl+4nNG%?p{P zL`r2fc#s^(xBC(YmcUw7Fj{+of$M%9OgF~i)Oa&uLV^{GMQ#+1nbdr*c6I*vTis2} zn3VtQX&Z~D#Wzxd;6;9gzVT6BVfQ(ugqx~YN`wr96;ppWe5=EeD7 zd}O@Kud!ozR<*(((&t_l>zqqUg!nsu4~N>_tX9gXbT)qKB8NDfCW4lRRtpNo#Dt2p z_I}GG_=${$y-GtSYFM7RZn3rf7>|Gdk*8 zo$kzAnY89XR_3;2`dhuW-$K{tVD8u>3&hCAMiPyUZ0cV7j@I*T^`L#EEd~42n&lzw zsi|Bqa1+LAhDe_$UwvxEr;ci&`ab+v$xJ9fqvmJO`KxU}@;sIPQ|7|(5$n4z;KvJw z&I-v0;YKEK?~lMWl$2?=rK|%Qyi5!iFv+)S(9pYll26XF=ortRr+1#YiqxNCPD;2Ppf1@Lv%!$LuC=%}a1>riWN*$f1W9Tb&Jim1f_sBsrq!&8 zHiASI`iGnZINtXzC8tVc($+NuTRc9$W}dc5sVTJDzybAPV2zuvfG+KQJ zBwP{LDrMVpc_dKn5zPA9j4{Co$l%Nt{g*25pUY`nc>#DFAL%~OL*%=fP-EsY@!K10 z9I|=}AM(5{OuBL$yGd~SMo)BJ5CB4)PK54w=LuczJ)~0xTU^mT1+u5To0Xbs?6ij- z4F!*Pn&Q?XU(4tbkho&nyd|5a8U+FentuFo7WU&E4VkRbt5<*W6g< zc#D1U*HdLxo*lL8-ESUat5KgG;bwn=9qI)*-&49*nssCtYtjg2WWxIn_ZnqaI@3eD z&?!*5YMCGp1z#n9)fy8kwXPATfsP?`jSxZpgt0j?w14$uVa#|4%v;pM|=!D>$a_zKt3@_mK!?)2o`eqnM^&SQf+-N@5*2ixLpoSOAGDEMev*vVMPO zv!5v@gdNk$*dO5!f>D$d!}iREZbpnm)0SYp&O`Dd^sn1rHL^XnMM6u&g^PjfH1pc* zr)XNJVuG71xc?`*vkHn0{PfY9PA+$hriuW!)QR=_UsvFZG`}Lro^}oAtq?`^i#N{S z6;-nJLts0x9x(C1?JBD>{(g;bza;8n6GaE5cY$5;OXl63E0i@QkE#7_;MdpB`{PQUXa%`hPbqt zJMDw8OQ5T2NEG@VPCtZiggD5wGYlNo{q=r5fR|%N z{v84f_wtqnj_`u5)p1+d`kjiXWW)My^{``glCRxL|k1UxM0 zwe!Fm2sy2-(b<2If$-!2$ssCaVB3|`1Y2TDY^N|p4)tGp%56?m>dv{=7 zA3~o6k+0yT_o2--x2IdrCP)28Pu{Z(v-UGO*MBW71b%W*&E*jos;XPsjU8>B<0nvc ze7({RH=VIwH-fuXtFPD56?+(e$F>E0Th>dia;f03XJfk+jDzeSIKOCvCBTwhLPvzI zRP^+eohKbv+8^D16QjxGo{>N?Sgi_Hl1;}`hyrzP;Lzafk|~uvMn585xq$_i*PqYo zGa81V6`rfI`jk%hu|M0+e|t3F?^vDDzc!P%3=gg&DUaWDjqew6Kk|9AUVF{2Tjk`z z2&SU6c@_DA?|lAMoWZn%d73E!L@W1IKy3#UvTvw~rB^zO2IyZ$KArPiia5&*bXhWd zHYKY7p|3{G>oAU&FhpKz)2sf6l?NJ%WDzvgSO6r#Y8n5o;Di2=!Wq`)V zP-_;exQp*T3HkWt&SteyC<<$y9Fj<7hPZz~kW5&eeaJCc^wN z-N&ggovdlXpNj)8$DgDS4xB3UwwKou{G0z;LZ9%`j{$h)#ZV~4jv1f&R-TWrgh#`h zIP)&gi!>(=S-ZRS9S$JVjXsEyf~T1}EBb+}Je8|O@(PN2jz-nqCcflfYfC9eRz}sF z8>6(vJxj{8id=av7~v+cJ%V>ZS*9aJsuF9(!Rl;pA3N{TeONw_cF{h;dVb=#h;{lH zq02dYxpid{v(@=IP${`nEO0;Y`)%*tp>%XSi9}jJK zn%wf{``!%i1%LWpLo@gtyrCs$7&CsQ2q0=)^0oM428FB2=>CaMpxN2u9*~XmJ9N$m z(R|H9myj>=!s8Etf>mjJ_0X zBzxeTB`A-Pyg%I@RY8vGUkl7|uL1FF51*P(+=i^&!`5m)ZPsVIvf}nX9MyFZ#D3*x zgLH#oZjcd1u856{aLRB)&30&73WQ0kmr%$}2)1&VeBhW}a zUMAUh$Jw%4>#|Sk=D~GCU`(z>_Gtx|g*?>52}YoMYoxMcS>HlFd&-nwqqiXDL@Mzf zCyQe&B-9IN*ZY2l@%qWGY;)uyjb`^{5O4&(jfEdIA^tJ8*=Zp-WUsR>*LXzP(wE$m zy^$y_D2R<__!&0jBJ&pwgdYdl77_-q{zl{B`p65{TRlr@b}HB~Aldn$agBta%4O)+Wg8ls}*p{`nRKk*D7G;Zvt=Jo&F3DHZj~(-7W(o6 zmLxqY%q}kYi>v3Xj*r{3w~Pmtz|w*}4Ld`xQSY|iyKzZVRm@G}{1hp0pZ4A8(QwZ7 zCf)C+ZlQoTb5NVf@gN2=Oxaluta%?>mF11^?z^tI5;7&OX;U^WEhvOV$2U=pQ=eQu zQEILSdjdaa_nv7dtGwI^ruw%cFWXFlHcM~7O8+2Dj35J&C_ine9N8-O&D z7ZdY1or-)JT?XI|X*1n#HgGsKOPG*0ziI+XCl^!{=N-Rb%T*jr=YAM6LHd2gKIWXN z^-CQ|`{>Q(igS&S{OFDjOkfF^+!!bBup*~T=uCD0p0?9i2~lAx1;_smkBXe=mgs=B zBl6qh65GzAt^|+5Eue+gGXHLSp`9mbm@I#C0&=glrSvKz+SdDzMb{0E*4JU~RdSYOzf9h69l{o88KnI4htWW&5P z-4QkNr@14e%7nYI+Qy4E?$Jv>o{Lb7D#B-XaZ(ZP)UMorg=8P5wH3GGwionzo!iZZ z3C_}PYu;P1<;xx#`-1FQN&3b{w+f2Wzg$gipp~obQl2n@xo8sNHa@roYDT9|0NDph z&Gz>~5V)6utKx}nY&_^vcx{ivIDa{Xl#WS2b3T7j%y-y-SlKKak)pgjZT|d_b)Ie4cN_Sry&R(Ih?YT~vf$VnD2Feuo!#eb0!aL`9}JV7`UhW_=Jue~r5bZGD+{ z2Um*B7TjRieqVCiq8L5C69{wm2S#K#fE+{>~S!Q+lRLM1lb*( zv{Qa~H=>p-R~Z$M?H@?wA$TZg=7tAs3{Y8Cm9E%`_R$vL`uJ(7)UyEV1YnV#^{O;c zciX#Xnss4(x4Vn896_O~#Lro71L&&ZWe?3@|NgJY|EFHowpyxx9aDE@E`J%__i&LN z=Z+xSv`>Qd%Fj2JM2^o;$qtR0)a+-n@W>?uY7=};K-E<(l@8e8N@c##O=X4BwQ`5i#iXSO7zw?K(=6s^{tI8=d=jwU^2`t=_nAo6X*^sm z0;6Esx{M6TyD;#Jl2t2`;F}xcXLSRDkMK*P$vNMIOO_2&Gk%_{EAVZZuDBRs9rUM3 z>V^kOIvtyth9m^EgrDGk?e^++=>J^8xi%`_zU?AZo*%0cVpT zLZfv;dCS2=N_>K8Zj*r`N9QL5c`9{}+y{sMu>SSm|A&R&?&tCUJX&YBFqK>^65hJa zz5m^KH1r#1=;P@oruMGt%>CWPw^@c_u>PaTWkcpYR;T|%{+i@#lZOWVO~$)NCK9Ai z;oG|h-$x7Y5tH|!KiQ`4`(nKwc=`J-qxXj({lCMDrl&a7p6!*7Y_}gDV;bq!9B%Om zJRn?Lg8W*y9t&>mbak9-)gAQ$H^M+m%_V2uADRIt&{zkg4SPMxq+CpCgIDRgyy~CB zacAI7g4uUDPv>bv&`@C7Y<=Vr!o*Z(z&F0s<>~W15hz{d6Q0y2{=4q=3-^d9+~*qsJ;sf^4*knLF*K)V<_I296QYG^27z}X!+Ik>Nm`mF zICL@BR)!WS7QrWsnlZyuKAGrnheZ3JJ%DIay+Ux#H3wswf*llHs{N$|P)^dsPv+H` z;kd{h=U!qftQI(0UGJY8rK)$S))QTj{AA`|(Z%A~V!oddHGWS+;`&5yZlWuQo#P;q zKEGlG=5IJccO;Qm!%(kaOa~~^MgL_6e_WUp#wP_Wj3|HUc$Rp;kETxn>0FpD2Y;Kx zFfyyJ)o3a2yeS$~7I;&U8{F5%0VJ3x9Foquw#4&Lbk7?Hj7#T;yWSB3L~#Yasd8=; z41eS&!iJ9?PjFsR40eR9IKCzTH!hqf@>g$&#a6l_Hj$cJrd^I5I#pbI+3(I0$E$^L z;hdFKX3hgVnP8sKY!aquIIDODGkJ}27nIcdGTR-IUZDw4k#aaEsr*szrT6VF{c9@N zC2o%8UB?B~(Tfc-36WKm&ESLwlX{xb+(elN2lk)4^#nLoVPk3qDsw@3yWyhr&j);^ zr&jZL2Yu;knAMKCP5dmPoj3#qs@QCFlIV7$wp&c5qXZi! z8lHeUBume+aSb|~EcIMUyZ1yl@(ar!eX~hCS5fQ`JFmK(N(`iS$LQ{S98()!ky_Us zU^;_$H?%saQmB7(IA<3y@+&0+WJ6mI;+ZA&I1kq7i9oA0b2RyFe~MbKAGn>E**Yhl zFC`sv!-NIelf{tY=w*Y~&X9dZ@=^1%{D13(a;JHv`#EYl&EMZ>04&i{)QCl?>KdY4 zJPI#kBl|M*8sKn8Sh=UKosnN_{2md*pZN`m%K_LlPs9fn>^jb<->tM>w=5Kbx&zqMs|SgK;Iq*L=1muD5ZRD^KXTIn`f@x7{p* zep(K8;9&&!d#)IX-O55%k3LYal+F0>Yq29^MSFDpaFpM)M)T`_49ME}(>3xyIxxR^ z{@0uh(9L-dnK-!bd3pValeHB+O~{wF=bj_aJDj4!#mopf&ILxixBk^Tc=9@H)A19a z(s!@7h!)C(yjbg|5~i1+vQ?K`%1O;P_rrK|Sx>b&2P_$w@(4J*<+@A{D69?-j`~3Z z=^1+CQ0IZ~Msq%F`SNeXu()|`mYE6oA-~JZY}eB_N3OSl8}wN-z3D9YLn(eW*2WGg z{--jRYNuB%3DpN7&HiMSsUd2Ppju-{d!go-HftVvMJoSw&#M}M%6oWq$#AXb6VJ6K z$pDKy0W>m_UNiQ2BYmNp_^~Mq$4fgfS0F7yA~Yv6Z^YtI<~Vv@r;+My2{}Wx0((aX zp(-7Zf?xwRyReQ+@J8yg5L=I@PB`qfBjdQ4sH9Oe6K{HRL(_BRlsAJ;fL%!AWd@>b zDOp{MKqvz=;HK_9D^%3>mDX>!XSd!bZgHd4t|oBOo}U|cJ^Qm%yEh)qF|7cAxmVoL z3Q?=mbOeCriHH4USwJ9JIX_D3J$h`l12iP9&Np7U4Qb~I_O>;|w2R6%5EcFTnxiUV z`Ga~`x>0PX6U*nefA#3y@rnkUQlQw?(O8|Ri}$+Vnd{hNJ0jodv~|LqlG!_ROZ_(5 z+Wc-&55UTz%|?@#q zLuIR^WBH7+Hi9#S1J}Ixu|ao*%ZhD;aQ6K zH*?5;_6;9d=vo!Qz4);sgj-vBIj37luR+ia`nY*9?Dj*uD|nIWQNXdP=@jxY-hP+XwFMs^!cPO7BH1cUSaw;k5X`5 zms~XNd?(Ywa=Kgo1-7*YIZu3d%+IHG{LN$S;jNhPNwl{RC%n30LQ-f)9r$Hx!k2F& zpN3sky=-0u(%-{EW!+R&sO3BYt{4pUeV7u@Y3L?sxQuo79scT}za5uFBhu!%Z>3`^ zrp{=4r7&49Ujm`&Py=;CCbwM(ivy_4x#-;5t4eL;LSKgTQkQ$KTaQ#OFsFlX>%-DX zjA76q7Xxhpvt%X?7635nm5#CeAtz!KltoU*t3CyORmEH03N3gV%Eb&fhWUe(^q9xf z8u4!u4%Kqkf{rz*;4g!mo~VdH%Y)9PT>A^i7zT3Zv1kdB$k;$)&e7-l$J)4=W-ZQe1 zSa@1hP-q6T97aSfi;09l)-YrH@vVm>F=Z}dKNIIBNXvs3l+C6lhmDzi<-8(Hs0<>3 z;`%^8+^A*=GvWow|F9AyT?lf-8dJ^NyLLsp=mvvk+YD1Wp$qi{yorK{3TJEn^pZ3A z4P&dhmK4E!F9KspTXkNl+^%@~7d?er*Yjqa_Epkhh-Kq9;1lB&4H~D%#KY?R!&K_W zRi3?Atd<{F`IQ|e)?Upi#rr0D)D>gHp`iN&b^o*kD_=u$?4w2e5!5dRE4u6G&CTo# zgu1?Q&OfQA&mTj&Wzm%o%VV$-w?IK_G`XDAoKqW^d5d4f`Frm2U$8NJlU*H^+aI_Wm}4t=A74wIyZ* z0$>-vsQi~zqN4~A>(RTkNh>`W1ss8!JySvB)cF`L1I}mKEePB(Rg}*6GQRB{1|w0~ zbZi)@>EHT^D#JSbM;hvzX|d<$sLe@*3BEib==H0Ocayjy&+5-w;C)Nd52y_QiPu^c*RI7vsE?|cHLG7is&q6+0zL&u*PL|LClUtK*LOhWA|AawTLZP%hhs;4>V zZAN#%b;7N7n$NlJz#lE48D9j=FlE>K4oBa!Y|4z&y3iG!DXZm7I0;MWveZNe^elI% z_u1s1n%S^SIV;01hxvCh^U0Z?M!-eWKLb&Xo}u+5Du;c&nF9`1T1l}XjDFaY!$_06 zy3Mr93*@f!_0_fTnz*gIMRhY=S*#D+YXg&1W_IS`I=P^G0-x`yDMXv$0E zh?x*R&_{La0!jdel*Jn;i`vLazh>8a7M#~cxslBuT)JebD@-|OZPG#^bP@t~J!(1w z7JhA}=IV*ETEKM~@x20o*^$Yq{=iY$8>c~%xPad5+d%T{A2L(Qf{qXYZGs4Immr-> z%y_e8ZgS-hzja+psq9`yYaWl&Q=K~w77(k{Nw&Yxqbj1|mPEY$7g56u6dz`Y1t#YN zJka{@dEVw!_!NG7R`deoiSSu%UdfsmDbG&LL(|Ho39hVVDH-pxujnT*2{}rsOYHey z#ws`y>lzY@+#NJNQpS*;2~^W4G%O@8(C5Rp4=tzknVVuwEfnKyyf@O z`L52!jO&o~S9{@5#hX){zc==xs#U27{$3+q%Y^H zl`kU+!|a9Q;hLrgQuyrmm*)Yz1Ok9h>Q@BHcHM!NgQ9jZ6Sv-bjGqoh_A*{mF zIe_2P{lPxyBzjS~)vva+|9}Th?E^pZ@wK8IekiB3JH7k&(7%eBOp{@d=d|gBSuyVs zo2Pr-Jl?tp*8PV?`?>SAl%;Qc*b;Q@ElFU_3t5K1&SNoCtfTnh+I776wlkkkqf0MK zcUzHK9WG7b#uCG8omV^Uo_|CA!7WLP~O-EUgc0LFvMy7>;fH>EJmF&8P$fCX!>>s0O+ zLrVF_muT-#E)>i>BLZpeodMhOVon6#PpY^fb*0Rv=JBW&!9TuV8oT(AHX$`9NM~D7 zr+fjdR;Nsd+b&p##S;jXD8dA5PsA+jYtbw!Bw}wZgtMyVakP4E|Tchp_ zoEYk2WgbGYso@NHv6-nwZWi_ahn4$(GsX&!8DoCix-j|wu&4?j0UI03`0ra8!96uB zk7?JB?^lZ6Z)Y}{_A);jg7mWApPxi4VUilG%Vw$nEIa*&^&b7++{4Cv=K9Z(TVIIA zdkcRfLHz-;Z&m+N+xMkwKVFtCEI;h}FW+1D)GZ?Z*B65CfqyR^74V+jzAAsqJ~gGo zw>b}gxE`Kr6)#lqFH-M!75rrYzd^Qx8VhCY`7t$|0`St`VDL}4p`$eCVg;msVzbo% z&m_{6F!4@=cd(mJo&C`60b^h&84^cUvGlLIo##Zp1R*-L6^KCJ)5y%E}AH(mT1$4wED>$>Ah1XvinmjT)Q(cGaJ?3%Wp>Eo%byTaZ z6!Swt>$+hh8z2=0zd9*%VqZ#MW*@5*=2BB?_sy-2axQk_(*yx$EqTz9fyERI(dd>R za5V6(R{r0?0x8z=Ip@4hcNzpDeDdvyyV=ZVhac8fLDnheSzUH#+)MN3z8yXE`|D$h zaUK*dih#7ERxiLqNj^O@z`)SOodS{Nyg%tWNM7%eQC0}5c)?C)Zlp#9%p=WoFOM=F zrRD~xl^fJ&dRIQBtKsib$NnlXI6JG)D3wM~){TI+MOh3(INBK@yD^f5jf>p88eIYr zi|(e00h5>9a^$?kwLVHj+S~PCvxJG3tt}aiex*%VHUHpXaG+bFCzCp0Y)?a^dU_3? zYj1tc9U2{4tq*fn+0EqmHJp;-J{&<6WHKHKuWg__ilg2+lQ>>lcC6H@s7=C~~rTJG#uA`|Nlv$|8;a-AaPN833xIBW>KFPp7s{M9xdk zgRJK?@(~lA%uP{lQq%y>kRmx0KEKQ|}>8lUSsP z7!!=STN$KYTj@4>{-a<-F+ImaR&H+d@t?y4ik$Rifaf(zm@?*hW`d^j;^CIhtcX=R zMPHjDnoB91n9^O`Dy+3LY%iTdfjpB)5ha??$OTHbR1+ ztXjtBiqd!AsA@Jb`NeT1lx%LhcZ|O|xf-XENV8T)~ z_BmbUS!91nnBi{3(+C&f{-9u_?+;SRv--N1N1>^0Cn29wK2`qErZ1o1%@E{oB3eb7 z+1X4ddS>x@cGiY4Jz9k;^m8QSbTa@N$lSStEyTpmiYW z>EdJJEv~g%tVWT^x)nBn@pz*2R-J(`*P3^3>upp~HCcYR@tlrpE{^TmkNq~5nsaTr z{D*FQc?TkuD-y1?N9;Kbu*+AB$t{7Jv@=VI;=}NdY!XQv^(VpNM{CrZ^bzF;6{ni` z0{Ye6^2~gQCeb!rK2m@&vwjUjiL)SGO~rJ1zT_Im$#(&*}gf!=pYZ)5Z2jeDq7V~ zq9<_K^LVERc=?p2BRw{(D>$)jFE740jTANsN@p;YTfrs#5~jR=FDZGO-e?>Q(-o5 z3D@smIX0*g%>x3`@vzdOOX(byt(jL#lD=AeB|7FX2nw>9yX_WE_hWIM$a-7k`QrUf zKFgsVC69HGDcqB<;>f!SD#Bm2ROS)s)U)tsF#&AaB3P)T0;ofu7;D#EoY?nTmSu0H zRE0Z?H}7)$eE{0nlf7Uguhd2ky<60rx7tTh84|VM^B9VWzyL0!=@w*jPNw5N=E|s( z=MErJ3Y-?jOGfvK`~YB0fjMmYPsV(4PYceqLezxTiXAz^dvbPfH(;{Nglxv5>PqP!)rBGFtAI;R8ejGU0naG6SG?xX;b4AgEqe_R5wiN| zIiJQWbIocd^oqC}Gi(2qjw7o{`pSfcyM$>#{%Cu;V1qvmdjOLns6~$^4%E_>Ii4pu zS!4c;N<1pUxXo;+6G|Y6XZo$@CUsL9V*zp0G!qiKYmx9yBmH;VH z{||maDjgOelsDDEXh)j*uXe%kng#8VrG-8XfynA8r^1|RW~BR7SP*3dQTe+) z$5$soe%Ek<$)kgw}#QhvV8l=NNyk9PJZP!IwuNmH=pmHhGFo+9m!tL5JoytVnNj^ zY!H`>D~&O7Hzx#+2l~SFoqaMTgC9)zxveYy$q8HygSImPeb|BunfHgjF znYvOC>LF++6OUG+%y`S~bs_Ce&*yQYE`YODZ^4Hf;Jx*#gnTzLNwCGz4bry_Sm z4SdrzD{fYSV)PYLv;JmGYvgK`wVq$|NO6l=Nzhu9{$cuhieVRvj=xIQzMva65n5Qg(Z(@<3wqUV5F*TVE!h5d8C| zsMxReVn3MYZu>L0oVwn4vz=gwi0fRCiX={2W*2#;BjG-kQKA?B%^$p|Cdzc#i#MGk z(m@b??R8e#R(>;LG1G1mufs`0e)6|K42oi^6B8)$bN)|`at`F@YN3RTNRFnN$?2XY zXEglJ(~1TQRZ2~xE~d5+6+GY{WBg-^`|f6z;+&@NwN4Eshm(@sn|-f8H8~-OPA^Ap zq3)BBW$^bDkOpy9{Hv)uFH4$w*Y(O$n^n1unM9=LHalXe0Uqn`RG8Kxq%0Ros6l7H zZ}~bgJ;&P(WPJ%K>;ZacvDNqdU1y@V!n&!q4iip9WGNJ1Efg7BZIr^fx!y14wd7oWLrCd@9jvi`#Ye1<8VU#7gj z+Fcx)S|$5NdFRwrkd=L-t@u}(`yn*!PSE*3EY(jh`kP-b7&LM6_uc>KQM&W({ts)( z&Hc~u9pnH1LMY`=dEXWKKP*l2>0za5-hY4kjv4OwU#=i}8&CAcT0uEW7%di}Ns*I&984G?+AYsrjvl<1^q4m=YpgEI=uF=Hn z-H~(5@1ZGfmjz3CwP4@S4`^jQQwswJ zku4j!Hml`QhDkXY(@`;{sMa`2HU(=DPpV;Z`f@2!f+$PEl0Nft$#IdT;l~8_(Zcf` zqKJyKV~p$bkqwZ+K{p^ZfO z_oRE8Et@OZQGGgE?VYD}Fd?wY@EEdSag-0vi^I0rb*wu;x?7RLfy3_nRTEa_!a5V* zX)5j(lVE!PeNc_w_4iE!PVrkv_N+jDkXsoZ9b`eb7oA{VsFP(7?TN!q>c~`(^y*QN zi}IGJ)uGocvPjT;X@>hGsXDq-5(@z z!gR+UNgMrB$TX@GZPB1|BqpXO1#Di`906%;V2`Uy-kZWq^IqEB;$V6`OSDQ!4J|1@ z&_z-Qn)&>O8!9lYGlUVKx5+#DLM+~P6HGB-13x_`AAYDi03p}E(6IM4=3wviBhdL3xUc45PSYj4%ydt8od6Cw;T!j2WPi@}2E^{`S_%C0;W(5wtw^ zFgXv?2M`a2xR|G8uJhTb`%y?o=#EvpPT0ZM&N}HHSvlcWXkuuk5W^bb@5r~Fwpn_4 z0^#7}4#@m>KM`{(8pnd9ti%9YgYOM2(xzhdIk~jF0n&ogWr1l1i?pC>{z3aPGz%Gl z`7B$lmsEG!gd8&ps(}{O+W%D0rOeb6u@7KkBF+eK;nk4oxfY))}#wbEl2O-8hIOhCHiocr-o1~7bH<}IgX1tD79tbD1FO{P2%C?N<~ zvHYF!LXKK3lK)j^ix~F44^h#VdY%gZDou)p0OH*gLgg?Gq%~5{;A%V~9mi(yb77iI zx`AdDihkCw70dHO(rJYu&f*jIMSoNAZSILBVCoR#h5ym9V=W!6#))QgAGFd=eSaEU z9>Q0ad1Z|v=auuSKnc|sR(P;)O@o;Hrpfb;KdCUQ-A_Noda_N?-2dv?%d5Mzz2{HJ zF0_T$nFl+WIDJ>(20@>Bw`m5`q)do5R5>k34D9jOBB}ZFX^xEuYF5{SIkeTjYQGF; z1VsDi#F2)EccH!vNy4GK6Iuua7i@mOt7ROrgj$vdg6(| zG`U#tQ_^LZ_W}lGo(AR29U2@S)GV@>NLkoL&;R8L zv?2~+X-B#ApuBzt2W(c~%nOou$Q8i7{3eEn+mi({GEA_~=d%&^EcTd_5uIhvWmuJl zp$JHsn^A1TY+@SUiyTaRu8C)EEmYSI6qWXnEJ*bA{W3h>k*ddM1b#y6l9gi5%F1PT zdo97(^)$UA)1Wpz#dM-hrLDGH-F{8I7CigdRVtEb5I;hauVrwaW;jHhMH>@lTn>-P zv@9X4NjJ^gG1>stS-ngI1Hf!`RcbB3BDoVyP-S2_-1RGsS#9~o6;EbvE*(r@gK9R& zA3z8=!xCB6PwSL)IW4qyi_?=jcWx72e_L;6hBFb-{*(l&!}dhp5yE}Wk*ha>Nq)^C z_=1;o8#}rjOFObkdCxzs%hknQ!o_M=hUe4$B+Bndc@!T?r)^n(ZaHB#H`LIarEEKx z*I7Dw>w3bsHTl5gRZR?+Wx{l43R>J$B|$Y&;I*Iw+rYF2>TE%w6TSU~l=XcLt88G0 zk5bzuQXsm^VnAPQvIklDcX_QY5jZ#}x?A-;t(Uk;v}~W!^+JxJAM(o3grIFgl>&)J z(6HR#ajodKNvlcMXV!rXMz#EDmHb5cz2VW1{j03Nq)}Y=DwMv+$lJG6$}{P6y{OuB zUQZ}hTNf!uzEVH0JKzcDTXLVaD@ ztOnskJ4FguwXlzlpU;m5 z>v5tj^1^ocoRBsfKe?v6uLV7<^%jBAfoP_S2H4qzNf%Mt&E4#L?8HQnG`=4FHraeq zUzlY`xVVe1d*F#3U1FiX$mq|1W^nlqQEy*`n0cXU6*ZfByHrPhdV0x5MEvNOb6^_q4#h|Z3U3xM< zbgU@|M3e~vJTz|&K?bfzE$%tz_(Q@?^Q!D>OJPARCE~bK{5)n2I_aHp(J*>THjA?q z)@lj<8fmOQtzUB5>8{#+5*BeHJeBQAB4x%oCmTy+S=@Gz_0u-g&Mi}90CGfs1QRz) zPM5gr!V`F`*5@Ge!=McZP6&{}FfByP_cPu|NFS%mhR@CCXD9CjPsTI<}W<#4a z&*3-7p~&y4t+95#XNcT7YhxK!=Xg6Vv>1bV`Ct)mfjoC)%5+~Fd{Lf6yOYHI{rqi1Kj!D$ad<+IZPS`3?2(!HZ(bD@Oi_N*Zs&Bx7|9&{|4=m{f| zdX*s_Q}m<#{2s0h11|%6{W+cv)K%2EyDr__SRWe%6I+E>w=DhbFe*|I&{_9`J%_M; z3+RE{!Vv52Y-XCH^$hjR`~Ff9A#&}4aPH=cStmDn{rBO2*RXy8EK`?<>)xvD<7W$a z#nA{PmOy1)%*odnYt9^U6avZ(5?hksEG_)Jo>2*z>cd)~uVd_F&MyGl*d-KG@pO~r z#&%;{uJcTRmIzQa;R!R4)~{xjkSMpZ3T25O0QX|wW#w2D=LsT|wmuo}eZ$4SGW_DR zj*4bYY&rX}>~m%8$~;|T{$iWwfmM|vO#g?yw*aau+tx-m?iSoP?(PtR2X_nZ1l_nx zHtr6=3GVI|+zAle-93Z^352}er_cFcy8CpWTlf9%)w_Q+p%y8qwbqzpj`G^@$nrhIWCi*=4{WF*GsXUO3-GZe7!$XNo)J42f=+ zF3D7;o8*ODK4lY6Pba}L73&7kaP4JhLF|_w0LP;g#1b#3g_m+t-z%2`Teu%tMmY{* z31_6NQSAFy<3P=qSaB&Xu0w6nuTcl$$Z08j&t>)|)K45}8|GhzK$r(=9^w3Tmp)&( zxmb?N%U3#2B6k#+0xy>MPkCew z?}o#)4nMR>;H{+_(VIOtAv_43N(c^U`dl??XQ5N7J>ywVaw1(Nf_g)Vn^j;~P^;>} zF{wA!VHZ#+iuRh^%3i(o79EZDW9<9__gaHO6{&DQ!W%0pLO~mj?Pnj)^$G{a2V#Q@ z(h+oD?l~qEV2+h(*W-DQbH{_$>Lw?rS-e#{22sx|7>;hV{KZbSrTjT#!}t4YGPyOP zq*{z;CHKx3Y!E1|V@j|0qay1j<&&Cft3f8EzMd-yOp-7Bz&npbR^PTSe6YJ z->VUuwx|V}y-U2+g8EYUWRlBDp)_ooNF&X!{$FO}rl;t3SR?oJz}PPx zS(VBVx5`VAR^Ug);kC$|Qzq3{G#9{};-mH)RJIfkD%FhC&txN`v8C`15civr1tP!a z$jmk0TW63fxxJtpyjK*mXU>eZvkT46bQL$eiD2_lLq1`t@>*3x+qXY$UO(AI=tpwy zljXMi#_G(jJ6i7?C=c8VQ^?1;e@b#~VZ1-f%E_!HiB3*xVcVl7-|hrmogPkUtBw!H zk+wB!Iv&rKAeVQfqLk*3SLR2SyOg>Rn4>Ys#hMhH)214;rn!ECu)xAU8=`1oeazJD z%k4udsJfJ0isZT~a*=e|cWP^`({cL4jsisj_`ONR`C!LT^H%l?;q);p{^kU`jdkZx(ZrUl zby z&>m;eEM7B=nYEI<@Zh{@fXCa5D$DiW z-Xn%rl`nT^ATg zgqJ-HheVPk4ED==Z&+wQu^ffjQ%UvT%Aq*n&h2X8-(}*CldcwAznDO#O}hfKcbTCrXpdS5UaE|AFI#Y?|kIh)n711ZSM*IueEX8fk(G zZU1{WvvK%uF1Et&E2Cb1@-kbCW@BPlpSJH;Zfj({s}(QfL26)`9++Ca!~{yjPSUz~VXU7_4=2u3!huM8Z83WgQUFPBz81(M_g zXrUn8^m>?(lfI8v7fj}dofh{##Ykbaq>)684hzJ!+{*aqof}+J;?++s2d)_BB+2m` z5fSJft2q~Es-NbvxR*%Tt&^3$e0*HJ?&p07y})=o&S1sDzg%S+qa~pVJ5)YhzAlVj zMo=O?pVA(MTjKQk9*v^a(qKy%l+*zMkcx3 zQ(5q^6vEEnOMZ<&c{dc0@{0g95CKSpOTyJ{GW|u$T7))_Ilc#UxO`_LYYDmQ%8Dp! zkyPa2FNR6Y$BcARBEC{GuOEV8UalVk>;$|8MGirO!vjRe zF#F)vB;BC^kjvW3`q1lY@3>DTy*~i#&TP@vhx%X1x0QpQjQ5NPK62J1ZOj+jt~?M) z-*n9mFf=Kt@HZbe-6;5ztqusT`?CR;OEJ}%w2BlI5I8OD0@OLi@8~#<(=dlwpMrN( zIeY?fTd65xHBmDxRlq6NfdLX35h0`vS0swS`W&!u}D`$V6lj4|-fB1{{Uc@By7a!`X1iIY%g|WkDt=+&N&xG~5ot?+C4qBM~oWjET92iCLNJdzw@5 z$nfdS2a>2=BCkbZ={xnUAAmFg{2}gDBf3sY>tA%x;_*vCmP|KxUO;qbHG9);c>BCl zqH1yHhJliXLJCK+3`rqDih7`oAS;+t>e-bV2TXim8jcJ}2qwDR9JPXyCLH&mI3PI^ z36T-A_>nR}3`zjmemEMA9jYUjCmH|G%^}lv?>2hE7a~ID`E&71jnyZXw)Kv)v`5wl zHuBz;Zv2A6^md8>?q1DjoZ>AKbW+dK@&W4fa7UpO(k9SItsP-Nz~{NeZIpS^rYd2L zjrQOc=22T#qNAp(qRxf2wspzz@kZe=vjJU@w&M+R{-ET$wrHV+(W0>oIZRvztzDd! z>OZ%W`HXbg(ej#%k(?P`d_|&8%YZM>z;I&UD)F3Ef!xppO73W|sHPF&urie zaJk3wdH^T5oX}y=Pl%+V^dwtGYXQ+f!!0;}QtD((+-I_4^oTeb3SrN{;fMi}gIIuH z{$WC34s#8);GpaF)_x{NA5y%M%k`QVe#+R~O)P`(Z5$ew(kZG{6=mR7opXb#s zsN}d!sXpP{i5#FyUBx{A+2rkOlBQdEl@`v=6{%J`R^BwcPl*2WO>%oNiayo(@Mb>d`!A?}t32@OIPjCoHI$NnFfylnc}H8{E|}SmbqS zp=J-l`8n1omshUF_(72eoTK@9h-Jb1?DMkh5C-5ls~(EW(D`lcu>|eO1%>6&(qjum zV<^-eLUn?C01z4<488!PfA>j4DI8bGoc(~y=_Hy58&}EegngHcW=LAh*)m*3DtH+!STk| zH><_OOmVoWo6fsI>AGsg?^D^75zm!&xb>l4F6bL+tDbha7|p& z+k=_rAAlgDFPS95@5t#`mR`*|p?^HrDe+o3e{rXASd(#AF~I$shqV|gdumR-lrcH~ z<&C^4Esq3?g-hFKclQFIzM+&1kDtX>7F;jcM9%tpZG`I?n(4N88>0WkJd|v4cy!#w zTJKG7jJIMe*%U;MGiDF0^Vlzyvz@2z?|d0u7AJf)cZhx?#cB;*C*xrOHTzB13njhG zUk7gYuYqeS^-t)~5iYj{_S9Fy=CdeVTMfKQSL2ZJw5D2n+lbqfGL27^bWF?ot~a}J zhv7MXEr@E9Rqadt1&$46{Qm9FI+~qqvA*pq5%ygiG^8lE*-xcIM=CHB(@dI@RTwlS zr&pvzE^cSE%q~q8#!XT*k8yXlDV9Q};SiNqWscd$g*nDFjbuc^Q5I&fw0`%p-BQZ* zHEypohlYkK4T|5e!XX7%&J51P9MWWgQYbuj=f%0dmi2~PhjJIL!0AC3;}zQTpOsMd ztHz~9AZ)!5jjOL{ZGJK{Ofm~=_{9QHi2mwc`^BUUT$kxY0v{vD>`oNf{{X=A9P{$~ zynv{%wiXi-xtv4j^Y<{9BsPdDbjxa7HD>`@Rwrzd{tS zw_ZJgWx}JNEi`2#!MuJ3zJT;dAwm6q8ibio=zafZ7Gsl8Kc3`IGEs|a=%vQ<&U}oj#zZvx0&F@S!GtR-^@VjO9pU!ykx|i^_wlE<@Sku*K=e7TR z`Y!eP0pRre0WgImr=eQ!wZ3>fF$fw!dgE3@8ai0=Hko}YS!+7J(nyh6DVx&QRMVt- zbJoSU$5@umL4JX62k4`?SdhCb?tLBUIJ(2v(2)1UO)}Uv)Gs)r*+elg9h;cJ6BE72g+dXGSVzwqlb)csRhO`7RNn$ax@a zeVBIQKz!}>vO9_gNUdcCue128`V+Tz24urA$omJtHZ{e&fq=iarCs%o76##Sh?#8S z(?Jr?MNkA1SsH=h@*yZ#gx{(5cKL7GE^$M)7btfAlT<%Wk}P*MtC?GsH1{RbJn zStVLLn%dX@fX~50WMb^$9>J2fpZ~(W%z`>|K2_vI#Y0%jAr8Tw$>ENpMz*eh8M2br zLsAJ=FIz7+*F0_?-0q+$R=mCoW+Pac<+`K!H zKa5dYYda-B4kDXaWp{r-V>K}~k+%^i-AhVsQ4pZ@ZkTV|+a%8AO5*H6Lb3XIEJ~lY zB@`i}Q04nG=Kkz>ctF*!oNd}C^qGKLr<|%%x}_ZT#`LB2bfCOQ02rsw99NYCCIAfR z0|JaYTae6y=#TRE+ZFT@5DI1aWP_7E0|%tcvuM>3%V`0Wqs6(F5t5Q%cq~>&cs${* zb^nNHirO?up+2gX_d3OY4x+oiDt2+D4OO@b;xJGBes76u?yF9#@7HcCzQ9T}Qj*8J zKiT|8i}dD{_(veo)>zfOHT0f#7~?g>HM`@9Qo^(%g5&H&rJbGxK@cw$9{0v+bF*^x zPqoDTt9#Dh6Y}uUt6KYgU@+XW`d91hKS1unyYq;r$L<;A3AUfjw@T_E741dxAfLfY zZ!!k(s#ofueh2zf?LUn$I^o|Lp~n-F!)M#0f~QM@+aCZ{Vg2Xpx!=Jw;2upCn?yMP0Us*BnE=q+O3_Z7vKIs)aQC|ngK$ytz4&dVnR+xiD6eYjXA?<}uMmS@+s=+3w(Rx&JLgC*NRWgB^=Xl7a zT_gX}wS)+1k(2mnbZU1@otr#Hoft}wBxiw5@j)&8f`%bl^;xoXvM4M-I$6Sd4EyI~ z{x<~{O&G>|;d5QfF0@~>4M+?QsVyLUf?yG)1*V6z+EnhOQ!KI$!eNA+JHOq z7{;H9@P~Y*_#avQJEXY&RnIWJn!!(MG8%AF)FEnNI2Fi}xN?RDW15ord2-LqKx%0K z&;C~D*q!2ZRF?$q5jR*ki3CoZ6GVsFQqyGA+|b?HECq^IFb0bS!p~XGAF3Pw%sanV zZJO+m%&in}UfE9t58qteY)~wmUim^=8x9D}$Q&xC@Svxo=bJvyXUH1FF6s6Nr`hZf zr_JyMg(k{gO$>=hC`3etku5{o?sdAv?zT;}h54&i=05(M;r*MUhHZz(KPxLZe|Ytg zbtJg7F!d$$6%;5`DH`?*xCTETO616?wQJu$n|qEvL1R`U5J)MdP8p1au7X7|W_kfL z2GhLtJQw(vrHp@H+3H&Um)gIm|Fcd4PL4!2$3;{N>mUE`(`%a_o_fy&%^SSF5YR$pl? zw#xJE9@kD=*jfRMr?z&5D9}S^UPA>;{Vy23tyX(Srxn|hr{;BTktHcyxEcVW3Q$>m zv1}z2IP?kPSmNk?)G8qYu%e=(l3`Hv5N1bW@Glocz~VNx;tO`#4C{bkR8XimcC;}X zcxVUU6bus&yBdxFM4$hw!etHb;^-w|#vON@1K)~g7?19`y2FDIv5Wsx*)KEvwG&dX zizt3afUU^gGlZRnO@W9Y(7a3XD2mQ8QR@_I|G_@Ui3r&msaH&vLWOr(OqN3hQu2VA zhVAqlgMf?28ZxEI60G=tDyGDp{8~I^eZashwO4nz75TK9B{K96aB)Dn@)ks-r^O}C z&5H)WbB0s95Fiudpwj^(z_|c87{n`40E{v6f+?*DMRdk%PE*SCSaE{Ua4-O}As;CT z(xMFum@EkZNE=t?cK)X&w)Jc2^4A46dA@1>OU=-G1ApiLVKv1t^?Tl%Zz0{&Wbc)~ za6M74K#mx;PregbW+`};S9Z%P7$<0hUHuN>8~3F0B?9HsQNEG>`^~5KmT)DN4iurE z@X!Z1Kid@-Icbp(rEMsg@*tp@6%{huvf?fI(DpVokj`2vuML(Tm!m6rAm)}^SDMkQ zBVI8#>k;!<7Xae}Q(j7G)nu1%MNl7eDDn^&su4)JKBEVx!LrhaZ?1H>cPL4n`4u*( zsYgvpRgfhWv#5dGaP4yG^KG*Z>7h{=fk1V@hB1Kb;|*ISP7%}O{E_az>u~$W->F51 zkMp;C5!tD_n5N;u+HKLyjJUIGyLUQ%(gHTA@eDS_pEc?qL*X#}Q5`0VZi70N4!42@CK> za%p-@gy+UfSsh;N8l% znFZ};+H|i}NSj$)ItD%X4`iRDlCPAewl^LT-XSlzqxXlNzl(jFiGIKJ{7%E{bu&|z#I)#-CgHz=eX`S)cy!M)8twjX{?@6UWL8xAiPGN zd5_npav!X)U7D(M|7v?Y(l7gaogU@S-Kca7moh94j2ORns{g#)3q}6dW7I2Zb2b(r18Vu>gOg7daYu@f9dGy+~oS|a1W8w7tnVA{ufXQ1@IL@gfO_k^GD%!Ui|aU}C)s3Y*_)ZJJ-IhZ!t zR5Fww_AVIy88`$JDr@W%Ij`AL{5KdSzPe*Crqv|t`nd`Is#}&9?U}zBZ}EW1-KedP zQAMUyn4f?b8|g_L=}#br^RqI`Fy@z(4NbdLt-sEloYB>A7|}O=JF&~r2HP!0e0=56 z0(IDz`M3K1R^Q*&_b;6Jd-48_eSf=-2hYD<$KRg!@4)5nxbGiX^50?e-(mCLS;tS+ zp1+f}{|Pzo{3K|spIEKebJ z@eL@i%3vh%?-S!g{LojeUZ2WF&GM5;=FZV-1gg8a-)_thfKXS5wvw?rwz`pH4E{7} z6p$-vKc&^@X=g|$xu*=U#!_ZbmNLhGEuOS7C(&0ZXCnO~o|F-^U_xGK@Ex7!D zsG*JoNS${GQs*W54==3_TvR%Gxfvz*#RrDQHK7)E_SBH^$t5x*mldW&aEEL?dG--kJU81SM^-n zTkR3^8^Zuy5nC@tev?{i?A_OIK^Z9};mUGGf#g#B!C#8*D86WwtNnV9TI1EPk16@* zQ|ILjg?1ND&~3DGD1;gO5&dv>uxC=Y!lrf0&tMa)=X_JB|_eaTip;Ihvaaa)V%VW{!`Cz$%uffMSk_xIU zea58YHLUyF{s;R8*--pNkR(X0|93c%x5u6=Drda+ zEDg38YSk}V74XZUkTn=b$l(y8$2Eke@zo0qmzGDdR*-P+W{bA=B?j#!%_hJFPFMTz zw?I|1{vCrjHKH3ouJ($5^?Yy_^6fA>xaoJ#Tf7C+{8-T3yNN{#hUubw4u%?|S}A(y z-`{(L`hZh2`CBAX<@# z`F5eMrOk~~M~eY(yV*>5B@)glvN;c^f0>qxb4Nihb(^Ztl!CKbsGjq=q<(G7^JH_k zYr7!>R4VEebGKJHvPrU%neUIKQb4TFG)72{u9Ua~`b_IG1AYKl7|k{0-x!B+M5;n) zY{P*hDH`aYLI!kG1Han<4d4yySFsLF?BD8D6ML@O89Ymy(*Vl9 zD7B7?T<%S4zZz?SMeB5Dm{RCpc4Ct6jt*5*)S!x>K8ICElIYT*Ez%IxQYl=sJ#-B! zvo(6PV$m;{S6{UnI@@@ynS-B9)8WQI^u8B)yni;+e(57b z$Y4#!V6P)D(cDHo;bF-B)=a6G?ZtkUsB6;k!W3Ch7!99nek-MVHADRT4*>Qa{aRZT zM~-%=@i#^)y4`UqDk-Tk!nVC#Gqy}a#$yw5O3T-pdGG42nWJ8Z+LXsc@6$-Zp~uJf z%aG7ArMHrQ-l5f0P+aZhB9KvkLmx=~x!<`ow-l&NDfW?6JztZL6<3`B-Pyoz3#f@G zl;^nFDxC4K@murO4Hgx6ncYKX5KRfk+ds&j`UzZoP9Xn~3x$P#1gF_`v6))^$wia# z_ik9lIUpDyiAbC!3M&d0&f^CoVj^_e2d$SlG|3OY8Hcb{efs zlMkZzn5f0T5uUXpI~N~evDLd?Ieg#9_!f66npKDnW6L3vK32ky{+lL=cQxR7S z4vrHkfcisusy<;^vYa}xtN26k;2O%Xha;oa?_!ZK-ERvaalK!Q^rI@6T9>tJM^qxz-bZs)>m5RXhGZG5~ z2IK=fWPg3h$hwFQPg*l1z~YSvw_f)i@jMo&7AQ?A2CJcQ6#tM)C^?osse*FZiCk{x zx9FYQ>QK}Cd*g;hXxhXica(@1_348d0Y1+aZbt;e?*O4T$wbRGjJv>bezWzrVV~|)P(uhjUvQ}SV;e{8TQ`JQ?yvAG`ggl(gtDEmeo^VvK-MAm z$`7P9xCE?ZQXe?*<>gDKKXld>_6bUL?6N1>6o|GvUO)qYrs1j40MiJ`L9*#cc)%`> zA3KQbTw!^Jbp|e;Kb?akQeB@0#&W$~?_!ev0!cw{jKUE-SFOi7tq$DE;E@5)0n>_~ zy#}BSec%8Wqg-&niVl*i8AGl89ygkt!;!$KH1ua?P?9pLmjpe~YH_V5$OShSxwRqd zsWn+JHv96lyA%9F=)8L)OJmQh8JL;}LedQitWs0$eAG&_unJTBM|A3aw;6EbUDp?7 zQ_4q~y^A%1p9RFiVW%OAV(ZiLhis_~ZFRx``pR&*vQVihqG4IR28yttllW1xY{4K_ zr%1hF=PSTjjON8ZqhTrzD}Zj%5}a2*r8j$~LLh z+4tnQ?~GdOrXnw59wr=)Rmx-J)Y|;qk^i_u=ub{4|EFx_-`)1F3Hm%Z|4yj?((km$ z*I4Q1pS^LV>dp5fD2c?IOS2ZddRV2)TxccUh2cLrDDnMxU#hjp@ftZ^*H52dBY_=p zJP2Uq-dBs}w5_>-fvlC$h+S;wmv&hx5W*8uQDu+^X4RiA!M(6JJF^a7FPuL`Vvs3zGx&RpZN~ZZ+c*7Xi!QN$` zt2d`f*BX#u6V}+PyzwZ1dU*`HVRj`}=j9WZA!o(v zGVE>yL}rG9k~TA7!hQZ;l$J4MxNq*o8v0m2j|=#HlVN{!GIsXYkxX3YWoH)yu@V4a0;*1|`ie^o7vVVgtvI&8C6qc-Y|8YsC!F#%eE=5&_2q z#R-uMee0u;gO!E3-{O_f8@1;GQu$?yw;hic&|A1d(xYkkr5lyY(D9#V z+UsSc(saf8O}6kdH}Z>IrfF-t_ItGE_srgnW!z>oPYby(JWA~6XJ3*`S}+Av3iT@T z6KCxcCuwCgZEufdFf}xFm)dh$-?&J$o-$49dfMz5V;{MR4-KhvCbSl|pfJ2zr9Df1 z_fBkW{*sj7!nL_xTLM;)K%soQu~zTGruDhuD~}iSi5)yXR1xOYgKR?Bc>HtGbyrV# z8SZyA78|Cgit~-%HY^zU1H7Y{ob{*qSUxm$F-p_0CWR>%8uZ(>^>$rrl8B@aIFr_t zojHY=exZxe+xf0!axe6NE7V*cQe?YRq0=BQ#4{)bSNUyUxa;5~FuO^=f?AdqMWJwq z1)l|RKZdIQt)vXfhH0xot(BT{E-f7e33P9kkw!W?^t*##(Wk-^zSq3%4*B}lJp2by zTF>zL4KkqfWZbB}(g(iejnPznR>_B1767Z5$I?f*urr!|s;cHolqJ$mIng%rb?&?- z@55}6-3Qq$POg51jrzA|L-`BM)b?H-;7M{8TFaNUOCJ&%mId%JKeHXIa64w{#^^M} z*UzkUeT09xg*Acpb-om}0;!76lM2J463SUH(xhY+)RPg`_vzz}yWnvAab2_t28^}2 z2Bka;YtU)ad_Q!`5m)Jmh(VVXH8q3KLA?0YZJZE`eyXStkaY4gtse%RPVG|jrAj~6JMp5_q5kF9od4U z=)FF#dPI9qH^3m#Z%5~2)r&5heaRf$eODNmN%*oN88*n0o~^BO>o~+GVt1{3?(2Lc z2X%*hIiIq2buKOIb9@&gmMl`YOWT|wEu;!(g^7S(l%lHArYbC_7UkUMrWqJCstGkr z1oyLG%{KY=MRDZg4+)7HN@8%VKttcPY2ps@2OSAHPRm8{qhXXnSKZlU3*ltm80udxcOlqC{puhtG2HWVU|-04 z!!#>vfW3b}qV8==nv%5Mb%Ycb{&Y6xl+tZ^+?K{{%DWPMhT=!Q9G)65%OjNgzR)n4 zQLCP+60?3T#x>QF_F|*ogp=3`Gt~vZg%&uLK+C4D-Vjr4Io`AGogl9LT=ZMP@iYZN zt_1T-*-4XRG)`J637j5^cWLSoeGkDd;rcz8UB?14uB-JF>M)Ff6Z51hA8{Bx`1E5D zp)-Q9F|`E6(<4RMp%BZyl*h~AVSHGlJ29z7z8mm-@l~SQH^tX7#(D5~?6RH5W$tuV zJ45B93LJet7-=s(UWAX!A|Nz}h3d!YF~+!lmi>9Y^8?Qy=`7~_l!DH6Fq5=^gUYRq zXGMt3%`{q7{`2Fvn>BrJY=+0y@v4g*_k&!FYESiAs#>VOcKT(%sc~os)m>D)Hfwcp z7K~P`?}x+S#!rjflKTk5LbaK}n>u`(eHi!IUz*mcyB_W^zNmyNdoV*Uw?RwC!Y-%4 zJgcFzU`5b(v@UI+0I`A4dMGh|#yls33$h)4CJe5bY^HO5Q?S`#exV4zlcR8hM3-1| z`I{}ra;@jso*UVY_gu?a2}d0}YC@_5-Vnp}*N^UBJ|4HmT3NE}k*9o+#bqf5xs<~~ zQ>Qz~x>y#{zyyqD2*>ji0QywfGkpPhDr&mq>g|f$usd!k98Kb|xcZnovC%#GmOxt9 z26Wg-wo#WLSZ(^=(*D#qc!&`3h3W)0>Vs+=Kfzqyfk@rJZrD3E**1#=^2pIVlZy0)5 zJ_#6fU;{4{KLRGIQ0O4G!x%9FgiuN2Awvn>?c8>gRG^i|vYDpsFu9#YUu=<(m0%NV z4Mg7Lez7yG)gNWQXQj_d2yAMbUmdJkrp;~weh0VeifI&MCg1Ifrc+LAlh!s7?A*z$ z=+9OM+xgL3?-IqFyU485byAA)r$5{RMW3IMgkQNlJ$*8ZxXGxnSGD?X6ZTMqc#W6$r9>PQKsgJkFm$3az znMOo`bJ;C@Sa=5*Dy^%u0ulC6I`YrZq3{a_n{k-Tfp(|fJQJ&U-##dIDD$W)+i#x~ zjdE_-e}jqNXyujB-{al7810sQe2av8PP7E zRds$J9Is<(odz}}1@IFXIK`T_?$Bv|vHiLs;27~iZIi^Zg`Wc%LWDREX%^|?q1JsZ zD$v6Rx7(&wX`aq!8D*i)&=9CnU1OIR%FjAY$q8L*j19&bh270CJpe%p5?e!Wlt4W1 z`ex(!C7b$P9HUQM``j+(Y zk2i5%rHP>GTs5P!3^iZd8h&Wpf$Lov7-&&_jj-F{-H?t%h<};Yk(`#6=z5`MYH$h( zVU)-Ob<`CJ$${%j<=e_*y)-gqjYHa+5!WQFj>DG71Ti!YZ_ zv$Vw|5n0rvRdO@n6}7hNQ0W{|7-`re0=K6RGj`KNIe^<#qu&bqeSzsSSBp31+aj~6 z2oI^v$%e5mUEq?mK@(I*>6oP!B;Qq>1xB&KVeTC%&D9SBqm?OhpM9yZBIDA7gc~y% z5PTg24;~Hrc59l>^#{H84W1i6!SA~nL~;<1zg3gKnlw^fDuG#ld;T~xBWn)nsPSQE z%Y%!F_G7q+8@Zz*fHkdsEtPsI3+bEvT$lU^pTGWO#!Ai*p&k&MZcmY^ac;gBzgRx! zlag3t9!XVfh6L__s|hs`q!hQbTzpdRR6p&^F-E;KvFAz$pOdoXW)$xRo?LC!>i%q* zsbkH1RA;0(+}?L$0*|+zZbf6uG5qv;)^RppkC&Q+^Mq{Q`Qup(WjfU?S6}w~T&XeW zLk>k}OIH-AWM?yG{NrKQ!3l;$U^Y9@5~_y{rJ5ejz_w7SM5dgUk^UvT9YgUt_v)eH z6uT%Ytwu#w88Zr_dIYM;6aa=~i{SN19F9#1rz3)aK26(ju%4>G%e^`Kb<4I9UDvj~ zZSvzuxpmfp=VL1iO?kGY&xk&Dos~T}zxbwjUdj=@JRmiuE89~-AkE22yHV*DR@yPF z+DZOMjwey&Hejsh6BMSD-cPeiLV}h@bW*~$#`Ve>lWJ^eKl=?C=H1Su10jyAI=kwq zOxp$A+MtXuK}&q9sL0w!N0+MC8=lka!xbK{^0(jdOk0^2obakRJptbts#e@ydv2__ z*mXuId5cB4Ri*O5tqq-~5$lS-d~T2JD0Kj6#3wn9*z~l#-PpLt+>T6W|Z)7q8^fbL?7vJWwGRv3BtlBDJro)dl zSH)=VoeLYG?P&$S?VNHP=WVIh(YGlSH1U{dPLAh#!(F+f*Bx(5wyaU+fijHDTXBX4 zZ;}~?W1KC0RKa%Qp{e*~YrEinTTGRE~n z=_Fk&FUdR#QRbkMl4_YN&Qjy8ei{AM?ywTS;PABjJD&aEB6hq&yIXw4$Zw{c2T?8< zjPE<#b#7fL4CpXCmRqPK-#S64ro^sq{0JsC*xwL+f7EaExx2OHfHi^(E6bH_)bzP0g;^p{tNB%Em`hIPg-p*B(Q$Ynt6vXMe4t9==mviU z?Qjhn3i8M?t3LpNFj9*LYFlgDgd^?@o#KyvF|(!E7kkp?a#Cr+>_(H5AzZPwbKhXSnMt5r<2kL9_>36 zyg-X~DL@$lJq6F9*Kw`SGQB1yf7v#7lY7YdK{)R<8Hm&Kir1~a(N2MxbF4EYQc*`8 zcznlYaTr4+6HYHmst%w;}-6IoX?X9i?^uH%uPmsG*Mtse{4o_t~B5NXW0d#{yN22BkFKN%|^ zBPL7ssE}@a)cl-OHHIDuPKJ{hCMc#-12D2omR9HIR>w<;Q6!?C2Jy>K!qG^$vG^FQ|9I)6*=>Y%( z!E2|AXEH;g<&4|2v&ouvdTV^I3aN~=ByiL;TX7`08XA-Y_2&4q;AcoM?=rRZY3^nQ zw?!vAslSy6w!b@pK1d0ijm6K3Y2jW6E%SHXnL@gJzpuNOYsc8CK02rvW)8rOjyJKE zV^8wF@wd26J^6@^zD~6<;`fma@e83_M7gy5@zo^xNXzq;7HWnA9zuM|gV7|`7n3J+ zq#s{1TNRpr47FV0;bo#B#3xBBmwLuxh)wQ@V%3fDn)f~q#qe8s|Jy!De?AW3*;wAG zS>B5*TDB;6r<8siFFXG%@hS3E#XYK3TD*$UMP?K{l_0y0S87ybF)p3_w2iYar!zvq zYGlWgt*b)x7xR8^BzB)?6jjA=A>Wv?pXXtXE|gKML+IOe-oJ;Ae#EwZtI~qlU+4NY zfEsFiQT-XsMGUw!L7_o9SjQ!*36&L@nnS6~VT}STSqyyvGSuqW>JNaf zB4+I3rE^6sjdgIDU@{%x8+9H$zk8b=iJJ0qu#t% z`vJ%*6q&)R(7l{|w<`l-n$K2^G1Z-PQ#u4`l^GjX|+G zNgrQ?j8vpJT<;QtD2#V!lYs3Z!FadTa-XDFM}Q({dWB0k4zfA`DLO69hY~+LeAmxn z_Autl*R9!{C)b^B!r3X}XumizaF6C&*S?q4-X%Jbq64o5Aq?0bo;E zw>y}=RU?C6op9@P>|l-iSvxsDkKdF<&fdwwCt*=W`1;S-Ro_{= z@6X!t`f2=b;bqZk;IttIWECuqSYrk`s4+@20?{G>`cgO;4j?KD3yb=XPuq|r5t3nH zA;bp~kROl>{2#>hfQY&HtC%%^A*N9-w9px}kaKMB3i{pbpR0TNFYKwOm`sH}+@lB9 z3P>>m1PX7Xl{F2fTu2)LZ>K(gMO&D(CwHURvhQ5f8%C)=`gw|ve}3u$TW~ zjIX>dkl(}6-)G`g1(KLC$&`blh0n!iZGMU6#dGHaN{a6TXM`>Bi4KIo%D@kq1m0A^ z%kh(_qL?zpFM9ZmG$ywWe*nm{iQjB+5&i%iQfN67iZrkkZ1T%i#B0KXv=pQs`T_Kb z2m-Kj7Qw{;4pGT`XlUY~Hoseis-j$-Q*I6Ch$Nj=^JFxcC0LpA(fBQBBrrHafe#UF zi^~72H!#_AkRhni80xm)yX8d}zl_r+!neCBlxxDxWlZOK{EREhdK!C~o^TWvJ!`s< zB$V`76MZAJ4@YvEIgVbdvBpqfZO(E>XT?R_gg5Q#}+E)I7jL*nx&jGxip= z1S%UJ5N``PWAst784&Yk*pJd%U!~HgM>?Gz<`3IXkv?K1<1y$;sDSd5I6a8THYI55cyCeUC6Ur9-TNVF9+1nq!8idIC(7lxJS zFB>xgNrHY4?;Q~DW&5l5(*7A4e&@ZaC{4l1`KAFe-8lKiFvK9$on&bjJCcH0^xiR{ zzmmH9|345C2qD&j3?UkthCU521UQe7qiO>SbpX!St2BN#V~CTD`o+n%`rzx`|22A^ z37ywoZY+7+meR00M@YhS0V#g3;Ge<+>Az6$|NQVE9gltcd(XWz&2Fa!VM*3HHcdiJ z$BVw$l*Bft{OReqOX5i0wb#J!c+Pa56|_p`iO$EggbE(Zhoz-iYr%$OCq<>`H^7&8l$-qP4kH^=%_{OUeR;9-jy(eg9*4`$&d zc%72^{Uw}qZTfst=A=}Ni7eqChg2f-%ib;pz9U-c`ZJugH334~>1!Az#W0z;Ckg4tiHj}-)Ue@9MV-+;VdjAx) zO82aq{AU0(!wK0X8C1v@f{Hbb&lm22ArOU?ZY91D?)ksCd#k9p-fvs5Ah^3jpm2AG z1SwoX0R%6jEps+#$HTYp_6!>(TlOjr5Ve43Gwa)KURYGC@Ir|0bS`7S`1hCNN0tY1dVz*c0+--4_OF zTCHJ7K3b(?{deQwe>ZdZ07!Ad@FyICZ9Rf0_K&Q3Z#GjeUAT`i2O^M_D_uD z7uOaR>xS{1%l-GaAOFp{{@)%Ao_0vh4g*rmbYJg1QfB`nrEa8Z=<|=gCcgRiX#RgE zj<2GcJ&oPzWLdP8WL=h*alFukagIA+c*?i|T)EMDc#mhcSC~I3VN7{8|DSJKf4oy4 zo5z|adTy>cdECgo_+z?Ie(;YUu9ND2AO8`1r1crUcYAg=oYI{2Ck^lYTm^5=qV@l> z=7?v6L8wdcjvC8HM}8HI`bZ%0a!VQgG{=UxwIk3kh@S06IIa2j%1G z%u01{Y9xY>uY}lt*nUs~-K6yU&|yM5u+jF?`aNV!Xw)hDibbs?|H;F`6Z7-zZ)or2 zIN^La^bU)y*Ah=V+5N~pSH3j4^$9p6qNL+JL*yv!fG-6F8J(n19;pPzA^Rc9yV4}}2Wtjp`Ic#~)1Tv@W6USA)@rIi zoQq%QihBKttLeo^T5GZTR$r4_tzJH%UoXUKYPDmgx&FA)R71R5k{de!)PqR2UQxGb znwfUD%J^VDD$;H{~Z_z$zx5sJy1bRIBXSZg1D2t-9nTk z$UX=f)eG&OrrY#?8Ax$ly1A)YZOUo3?@ngDDz}sguF=2Nad(;p4YuQP{qYDxp?Rh_ z_i8;g%iH94`glDX@42BU|GBcMj-Vh()KCn5J$cZyDzb1Qy8LXm<6Ii&JDbqANG?}z z?wjgkm2JdzQzTzURxXkJ_LZZjz3iy&$?W+;axvl~J_By=Goz*X#MT#cq#F74ryQF` zeY!I#raX%Uj;@WJS(%vyb_YUqAL0W9ZjV$;zgB#tj@-S7V>}Vn^$rr%li`{_gZv_P z+B2`O=?I?rsMY!5d?XRkiKv4hljXXrF2rN*yULl_=*Ki9lEF9`v{5HX)G9cAq^<-< zAri-P^pX*{Oz>YYsQ>2+KyGu z-^ZKj&G1*j@{GwB@r@IT`RbOLR2hz$eoacUJ;mLK=R4OpE@j919FrBZnV5HN; zXt7wC<2&us(m3=&`k8}srBLduC#X!=`=rA4=T0+?Hf_QLu-pWXi(_4L6czF5BC`IC z7c1EquM^6!QEMLoTJtBO7^P9xrsdh4b<^dbu7 z4<)|K3kyu!9)n*mDd&l)y(KyxdmwsLbt$`AfQ6*c0vy`}f-2MRMFUrhF`CJX}?16$GFCg z>Lt=zmP`e`_QuP((?3xl1;%=}Mi4-^F-s=_-fMk}W?2q|?cP9>e~sElm9B+_PlVZ$ z)0LlusIu$1btFf3=y&L@5~r5YmGu`WYcrddLq3En-Lx>;ncI4I$FoU1%V<`qJwOWB zt?6#S>M?fD)o&}`?OJ{P^sKH5yNm&m8mNURVm$g~kq(W(`#Otz``n`yb+f;ndV6eR z>hUFRfkG7)ug12%D8~ygwjYnOd#tP7$LFfc9aF&&YIwIiljJc}vJv$?Tfaxw*nS+U z(g-*{a}4Ij2nM-bMV$`@U7t=!)6+F33{VX$QVPt^_ph8aLi1%*Z{RYgvdva}%gJ%u z!ik`riZ`*CIqSI2We`(SHGbEZ;1#}ED%&^dU%zAJeh|fgWS@7Zczm>(Tr7HnnR>B^ zB4wOJd)vm_#EA96G_B@rr4+sTvFFv&5YMjLyp>s=0m-IOvCiOqBxN~5>tL`br5&M_ z6d90Qwh(|XOVOG8gX;LB-FZG-0;)thWqLsE&9zoPgsoY&tVkz{EX+f0-ZeU1 z^4+qu`z6V$t*fWpWw0uqQi}F*@pzkxFkv_4Mjc|sUIHTxKpEpxn(~hHHn@iGc@tN~ z8-c<=u-k-+XS}OqJh)3+!TDqT?BbiCs(m0GmKQ)j{f7MD$pVB^eh-o#_bC9GKWukj)a(i6}$&y0P z%Kn6XSJJ{;T?n8Rgmi$~ZVfVfe|I5Dw@>qLY=hNhTDFSCHSumVbu#Ug5Olh}eS_Rh zAw87F`jkPf*j{LYB>Nim1yMN~;;DLYwki?>2x}H7*&z2F7OrH(%ep;t%EjOnt*!*IbYu&?z}f z9Sm2os9aE?rx;e}IAP$(m+9!^mvk-zJ@*ahF{omsbtsG$jVrP#%n7u}bx_kY*0pVM z!_R-o=%6nd@`de!J2mpx&Y;SWr3WGw&RFu2W90yD)e|-Dg{C?DHDW62&L>J{XA#6c zlEB=kM5i$SX0h@J<%P;vEtu$&^;dF`@1ACc(wKm@Hio&Wa;O-Qj|%P!6|wai?y%xZ zfNadeA4@%wr@LtT#KUqe2dJubESnudwSuZ&^aI~j#Sa!6+kjy$^_6?&&g1hQLVS)D>(xcB=Seg) z^A@~Z%^eqJ)dro=-yDlXS%J!JQnxDfaoY`CZ+yr1)TlF* zA9_l6Hp;wVMbpeXLtUDM@mYaqP~uyB9TUY_QEz-E`|Tlnv7fQE3pTUuxK4gmpgOB> z153~4Xn#hk(pXC4<&*nq!UKepWo1!w%MftCT<#F;kSFq*+@I6iTsN~pr|5_O{(Zar zpLq-g$<2@#o**^YB{tVz0ErQ?vA^2X8g(Ia7v&nW=|snROXPe^q=3AvYqtJ#R*7!D zJh@*n!ov1e*PMo1>~?jrGf;U1Dz3sH1EpCP9QnQzsVZ+z;oE40l7MvjMORIt4Zks# z>bfRu$q2M|3}5!Fo6%r2z|Fy(r~9@|~+@+78HdhMW7af|PZTB-T`Up5T3&gXnp zU-nD{sv-EDM7qC9F}w`agsz06Y?!oys&F-Et0b~I`T0HiJK#>DO~@zAz0daKps=ZX z?lAT(-C3c>ubTz@%HEH+@7~>=k(!2=AHKif$3KlWmb!$t_TL-6*^lxxC-O=gOBUc_ zM@TO%FO560CF0Y&v!MqS?7`Cum>rYNxt0!NUcqAW7@EnK^Cy1Q_+G3@2D$`&!c1-| z_iar4YF`&zR?Jsji+?&bNI>11#y>nf`6`Uo03f+nV)=siSeFkA)T%tO4P;G zk=kZViM9SiE9;#})Z+fO^9IVCAgL=W`9kV0iX!Tjhk*~-7UPI+t9<6kt{z1LI7#O4 z%(*6*Ho=cF)`7ZcP&#`sY?#VCV^DKYog3d%l(pPUQ&oV&RK!LamO?8`SDjpjs|s78 zRe5y3el@K(7TI2(m**6q#V-c?eVuRP8qMdw;TT^tMkr6PW4(MCG;df#)wIsN)otMEc@hcEqXtQ-sk9RlPTFvE_zwrlthHbHQn|G^NN3Sm zERDNs<*giT#>B>`&*%%<7^mrzN+z*|JN3kdWTxnRrg@E!H#pp{(;uU|RRaZ`o2gr+ zisnVE?FZRMcR4j{rhhI^9ft#lQb)KTOtcu^W68sH1o%ZYb!V*T2xj1RNZ4!6tAz4lzofm`d^eyx& zhoh0D9Q=$+WgK}N7N`sn-sgJtEB$@x2k8zW<_lkOww1ypL?R5cj72Vn98KA}(;ZS< zWbzR$NMHgJV_Dox4ICqJdakY`OrT8j^N&f|qIQhlz4-7<9eL)Y5+OmX%6Bb~nxi1P zjgH%MD}_BDE%pQx2lL0KMZ2{q9@&`om(a-~OHSw&6ic*|xZRUrs&g^P{l5B+#71sGWIz%;PcZZIJzyN;Ro2QP#>y)r{8j^~C8c(B(O~Nl?W8oW*(YzR}WC zqBZiHJ?}q*_Jm31eJfOF{@hN=ljgHfvSTNZF5XDx7M%8%k)N?q5c#v6kJK=d9H~ex z0YB#?!C>ozGk%?IHuv}+Q7~<2&~5<>)|9b$>GJt3*0~0VS|h2y7iitVE$vB$K*OZ} zuEMx@_<_AQY*cGv;(5tB1X}v zp4b9YQxg4{H7JOnQrY_UHjXLLhUFzMHE9j|zc_KA$LF*8DG52?EN4WJR zFUr}}KSVAnhqdiA_?4fHj9UU1i21kr`}A`?I^{m8Cl-YyKWa&!(l5~~s@H~#hCH1O zWcZBR)d*#gFkfI=+VK$oin#}$YhB8M{(|L^lSoZdipEwumz<@Dq|Hi8eb-csl;`bv zIEkgLegIQL!5-)L4U%&4A6XyR3$p7m>c<>rlXf|N27f{BvR#{E=H@x7WINLl7BiaFn+qSs0UjJjv&LAr1FXZCcIU+F=&IZ@)hhY*BMmu zXM%k4q^*yF+WB_a1U-Ge5RBv=HK*JJD9YfK z!my0V4c*E4C!uE=;hzYlHa0ti1Z-Qq_ej)N)%zM`$%UFpn6HTx(?zFU*b3odX{o@I zeE9(8=_#dbbDF>m>V00`sPH@Wp}VZx8#*UZ)|cOZOibe~Sh$MZC;KA3?k!r&(sQp2 z&fo)7NF7iz8O107#z|9&y3m~c=-mr88b7e?U1lXy*(5rIuIM5uQ$%g)j(l9R#bAI~ z`)7j^ir0GE!ZZa#_Kq|0HCGbH^`-q#vHGMQJOjGV+a~BFhfISPhNL?rLrZ8Yhoq7e z*a-k7h8@-qXzI2&XJC@0bNuKLJBE6wSaCgMcT_}pi!j6BciRMOI2yG8Ach5FVsYGD zVTdOuOGv2P;?MH`};{2`CkA_r%9;~-|~mTDyb)#7)OB27|mTS zcFY&|CLE#I&QlRg%kzvqkjLn42)azu2wIgn-*N9)*C>1Y2CU1<1B_kFc5^43VPuT}rrz3~jL?Zq>a z)SbZxcX3+R3yWz_H-spdv1R()k)^qC2{M*Kq1?t{Ezh%V3qE@}*afRhmkOwkNw{qX2u+O5W8pPt=~P=XPp>dCDrZMt7K?}0o`Iv< z^n}kUCWLKYHr9P84j7!`tf*H<2pwwaU}P9Aw9<83jPT1rLV>=O?y7`6RJhOm81`+m z=2u2)WD2d<$>yJA4LBemtrGFs?Wbk?8G$xp=1I&90|mlxP$pQxf8tAC@FD4*n-Z|| z@$uuy#N{)whMg?rbcdD~%jgkqY2ZBFb7XQ=fkr0Lx0UMDi0M-+3?H*$#*xVy!t4p8 zJ-6nW_{hJ@ehp+J-~JBqeN;>bjypc`!J?Jv^41vs0(Ni8Jbn$@KL5SP%P9O~misru z{ZC}eYx*DijK3aozGc>ad3e4u`>-8aN(uK^XAAZ9_4^C3n*0m+K5hWj;QVD8+9i0a z)ad@JJmn%e`O_Kg=3fA9g6q^B@hy~m^#0GH z8Q=K$$J$xXc5g*0jNy&@IxRWHs;Q+P{9@>mTXS7Pw4jP>RKzcsl}4vU zo2IDdP72g4c$c{^8h%Q+41FCXh`;-LAaSSRcaSJ%UZIX@z$C`>#3#2wXmZqUN9?SC4vWAmsYDW z_KKAf6_?Jt0uebo)zc2#iQhFxYHRPxITQ#IYdQqsEOH?|r)WUyx@2Bb=_%AY1>D95 z@v$L$pt?=Iu*z-Cs|s(PDokPm4SkmJck8A?JMnndJB7=-SK2YcVG_)~5OOZusFFcp z1#B<8hAvJzugR4vWhGi!t-x58Lxv~MOXWn9yh<9Q8#rJ0Elc{fCYHb1wl&9ya@y`L zdA6dV%AWg1!ejwn%WziD268`)vd=X28Vkz9nWKis=?s)YG3|?){q)hBkw*TYY951+ zE@^LNM9WfRDD}1LXzDN(#=`1o`k7ayVv^G=Xr+BnO^8KJ?)-iY*LBnOqg}4N;gQiO zn>j?BJ$@-fG580mNWa48xGxCaqZ{#K(P(;w+$nttZJj2s%^-ZnJ*w=+gLfBA+4F_s ziwx`CgBx;_%Y)jiECdf-QTWr4K5_aqW!zaXrB0QUr-934$i>`&ZfmJ9E6NCQmE-MO zi~}F@*UyiN8gT49bS(RdoePt;FE6plK^3cws46}8?cK7JUL`|CVGHCV^$%Y~g%`H8 zS$(HQ6y#l#E%KwP9(WbZy~p=vid=c+vF`_y3Q}D~<{j0wnRgV+DsVX>qi2F&dYq(JVYp?SVD! zgy5^Q-#omiCSFv!hybE@nxAq$j_o+EJ0XI(e$Nj#?&y5pJO)G4=s36BkO0WR4Y%3} z8P+d)uBx0_#gc%|{vUNe?I$Rw0TPmX44(59;e^DXo}@l}<_i(&wM1>A#3YJ`x!00{ zJCmnE>v0`4i?#2{+HPdj@iNlvkm%bYS>iug@Gx-@VJ+Ozjf9yOi^Hb$vm0fH)NSPs zWS@{(J(<7@)wKFAHj%FOR11E6v_y{<8e*Qu`IXMIu|_J><~7wgv1Bmk5c}x)o`Jr2 zZ?lCcm003u#c36#e4X|hY7*<&qsEe!lV$Gj9n&wEG>SPW*>QTMogHgGLYwqyM^6w# z;xPY`*|NrI#>nj93THki;O(iXi0FdT!wMEPB0R`2 zkWG2T%1xM1DSBYt;)U0q?$5G9@KnWScr0vG!@`0{rPr%Gi`6INt$Kp3@vro*UirY(-?KDL&6?!hZh-+t|N_j}I|3CRxdTbaS*DJZ{i4Ki+I zp^!H|I!M{6m;5#_xzWeDb&j@Iz!@?5((-#J;t9R&*ki8pp^2)j`*Lq~JZWj@6e zO}6S`YS)G$-RTE9(f&ogTg32mL8&?7=_e$#@MXE6&6iB5TD_|JRO`Zu8NTMRH1-J6 zxq1ba9$d?s7}x>JlzY^BifT~JPL?lvH+#x!Kr9A6@H#6vdvj{I1J3H}k_w#4U$Z}z zohMpMw#n%4Ro0g_wG{TF?}9iA>DU%XsDj29R3wn;SbkIjU-fFrYS0Jo?uxvNCc==a zm1R5ItJ`bFL8fhYM{N}sTuV9i4YK`+`8brjlcXvxevJkPEHxuXiK|Ku1Wp1Ty;~O7 z)yQzY1i8wbG+S4$D(^VC{yb`#?LIq~S(h#zZT%(~V2U@`k)sMDCmNB~wZj~DFLv=g+ zC98xS2Hl;-*7!oLbfMZ4TACiVQag84yAUkEgyO01dU*eFCmp$a51@F54t%t31E4=%=ofm(kV78sMtY?YeFB^! z_J%c16yj-3Y9e+JQCz|@y+MGC!-UX=P4fA-hHXOW@A~9sl4v~xVKm>~g%u#B zGRHeKcsYwEP&t!8k6{*bi^cf3|CQftqm-v#TAcldXY6gBlM;jN$o=Lkf`_+sH}s(4 z6$vWI{8(8tCrwoyob}Uo^6-KPRS?@|(Gy_ln)h@e|MSWVQhDjqAgu=F4!2o`g@W5{ z=^{QxMdy4fm;Shf?sr7i34@CrBINo)H)AhVG075>0EO+`1vk$js3*Pre=&tlA}j9o{M=KvjQX2%gWNg zqx(QE+(IcG|2^|3r3u>P^L4`+KJ_Ql_LNi~R^|pkmC17myoqo-N;FG(heP9M(h|eD zqX=&tMr>?_zT{z?I0{gyB3ULVa+Hnqv76fkKsFPkDH}%2DaaqPurpk@Zg1AE*yo7D zQ$s{At7tU2Dy5>#*6FB|%}wQY+|e&XWX7k&x9&TqqED$rQ-ZR%l%+2ySvmjl+OOxL z)AKb;o8(>S;Xg33Vf2jT_r>GTKUaaW5ARJ|ju{%x$NmBq8~$W|JJ>DvxN4aB3wYSM z4EUwj;yNS!ay92KpyA~M_i6mT@lEg3`+`r$)AfxRZ*Mi8Z$5JD%j9hh?$txLrZk@R z!X7`zfY0d$@Q~fV%Aa34mZxk>3WUDDOR|YJYt{V=Q1aURG4t}C)316pbei`s;CJiu zIl7t53fO%0S=NqoLLU(*2=V<_q6SJeu_$a3w`ipgt}dUrN1DR}BqX ztO1h;Bpas?APzu0Ij`D>y5Fc0v@P6O;+lcwiG0BX~Nwdcv~C4mVV|mzn+tIHEtf3X9nq9)CV^rzi_>G z7!n=gW~h;m!qsT#*cSM502}+6(k1?;g1|4>#ZjlDIb=+D33Wk-vP1HGxsfz949zd# zxsGZ{%_wL&EP-K7;Tg?%9if0k`iYPcjbhdk| zrYUeRH>}>z&X>2B1HJiRI6$wxqA5037+1y+)@?{CYnPE=(d1hY@gz6zXI;XJf%!Un zR+>mx!KaLT<=_#9bt>%vX3{2IRyNIW0^|&DBwKU8cWF9eT?#Upi*cyCm=~+H499SY zD@04Twzd^BBu8IfFO#vQFVTf#{nYc0fz>$ik zX#!P(^1zO8WSJd)!E3sm);%DbFo?e-R68k0IyrFO5)=8u!SHd$`zc2rq)>}0#B zUB)1Wnc|p@?;2-h;K!&W#H;a*_zpL2FsJ?b3wZXZopfQ1R*Tj>A2zvunCzv)0$0_XjWl!+PJHK&;a+nRteTZ*qe1Z$k0PsLQ+lT*ih&XlioIJ+*d`W(YihX+bE z23@V@<9=yirr6s%6AUww~J#%!jX%io5mD=~Ggyzze$|M;`k`UgA>38R-;zvXp(cW|m?SJ7 zO1G4cvTBYD;A9y29dFTr5$`DvSrs8E#4-LA+aZK%eooC@R~I1aYU6+m;?O_Ng!5e!_xv*yStXn<<8K9;wHMJG`OTS5IA-&gc+7P`D!a^S#ZYv{Wzh-H!PG2O% ztZMjClJ(L~KOK<~Q=|Y;DeXXkT_)$>E5Ro!dV}PZmVCDS;_tGl#`V1D)<1VQCo#x_ z(_uGoqD&=3BFJQ{ZoD?WJet~+b5f5~eNani;~jDY+J=+r`_2Da*DR~3&_7bFn6chz zoR>$<@UC0+t`gLlEX#T@gxFhl|?--z--2D zJVP}q%enU@Pzm=x$Gv|64&EXT7q1yCNWsohy#6l3Q@T#qVzgo~`yPR~KYDS627)w1 z$6_Fmu0Gbn_||0q4_+erXtMrMse{YGfJh=dMm5QsdG)qVHL$GR1-TdeXd5Xz-n))Zjv&bqw?e+7t4^23|JPD;~RN1dC8z>Z3+7f80 zxwPi>s^bbH2H3SNv^jjz@t@O8IPlT61gjC8ySK%fy0fQaCMFt4a5$-9P;qLP)@b7D zGrtEYpUjg#aY>wGxuDwGof8OZIy3vkWS;K^u2f{TL%4>V&T~9%M&hG%?I5xC41f9x z3N??d#eQ5f;?|i}qA_0@!F<6|?dpWBLy-mg0yls3W+N*+`zf!YtV#v6hdkG$$Da1> zoH>$9+yTX_@(UBb{nR_ws$!Lh(%dflK( zRAy+;@pF)fPpf5X6RcKj?7fAOV=&cMN{x!L<$ye5T06OzzW}i@tzq^3v%(Dl$*)b1 z)yZ%sbBvqkbVO{69@5N2MEWEXKD;X^ZmD8v4&Z_{6Ot5x2d5bSeqCRlkCd_32^u_~ zbLyW2+te=dd~kEdG!mXnAjo7*6n)LJY;?(83Ejh-+aSfBpfcV zOrxOJq_a4B+Lj!SO2TQ>)Bv|>(dDy)MaydjL?SX9wgFoQ0cGYB3HHL|h4!9MqM2DO zoK=_034h9m*K4#PUlqBfA@$n+@X98Kfu==Pisfn{QXRMbcjmqllW2uu3~VoP-5WVE zdj!kbs>E8{oCyQy^2cU`134%sHrei`A`3qpZVU?gQZtWeuBRF6tWAr-oYmu#D`iEE z8$HbXgrGgM4T;+-15kpMy;&kZ<)`cT+nqynPUtd=V{Yd|7hb=|Ba*DanzTg+%hlVe zkk3PHkY=8gj5N=AKwzY3GsS{g<(L!mJ^q1v;HBxU{qk$ zkZ);+9c!#pJ%+bMj}mNHp~n1Y3Z&Xvq|)WHh+p}d>8dsys$eNi>n~6!MKHfh>Qg=A zt(7c5-(uJ=YPg6ouijh7K52q&B$Km^Il5#n1e1@O>qjgY!q%XX^h#z+rC&@r=22_U zvy}9Z*eI*>O1()|wu{%5`i7+X_P;6^>+5R!S84|*oJ4^eqJ8loaWW^GtFXpKcZxGx7!`atMTB!edizMW<~0lmw)jD!~z#qXCQ1Ktv6hyz)n$_Z7w4 z>PKI6uq&|>7pOT+K4p;!xYfNv5|LYQJ4XD`pU(;^l>#A3zLlKL#RZ{Lrlmu`K#a6B zN@@qN!#N2Ir1Qghn}cm@e4ff`z+_WSl|7Cxkv^l)Lg&$=!DPZnLJGOHwnD88mr%@F zIeD|=QBqM}wfxD$O%Y|wDe5hjl#yxE&uY6aqZ@wWqXm7d4wX08Ddb=94B+0{fwf7~ zXv74tR|T4qziaEW@Q)s2{0l%Yhz#+sUq#;o5}C?79m5Y0g+Mm3hk0-j=jX3Ij8t2v zv<2`RGooTKJwsXQhTZFkM6+)2lZ)lqnCi|9*z!o6pPt6~x> zj^NrH0mH4+W&_b!M+jt2qkGP7mBh$gyEMLZwS*(iE75RzhoXQ)ld?FmD9?-QOFhKO zpZJj9PR2dW0jW!$j(L{P&yY90Q3IKSNX?S=pdr~v4P&)&xN~c^>`GX^zytZygVoMh z_%eIzjRMmVYfNu4ZR%Iks-fj}1{zRcQTsq|6+nGYPZy6w|HnrHb8zByq9jh~52n5r zkE})%wuJwP1YQnE7V5LSjE?D4s$^+&T$nisZwI3JVLgLj3McFrPH_2A^*R>U zc{4&zT+7>8RLeAGRAl8gyJwsCeJzQA4H9XweSnJ4-ra0UkIT?e|6yWJVKX`2_A|R?6K0K(>=@i7BvcGNXmZt(PjeL4za!(rVl) zLS1_u&P(R9bYWVzlC}ydExU8<{b8EBjp4hWm)li+=M{LQ!? zIfa_9Xtr+>DID(qzH+I*DZAZ|DOvd{mGb z-r|mqYH|?Ya{`@ou=k86Cfu-K2$dO%UUO2*;_FM*s*LzJP^7F#0_SNg1pWb26EX-i zWtBp(FNjDEy|+#T_8O}hIgX?aH+OXs;F$`DY*0y!8IU9+R)!l$xM)q)6yW|v11VBX zC*O``m6Qr}k`PPphm4-53x2Q7s9Uxcjmjp~&qN?w{%2qAmoewWdruDjvS)sPK+u6ux19`HqEPPZmSq9;6P8dMQ6 z!vM&A`P|Wby08s&1Nl|I-#{UfRS_lJy$f5VX`nlvrL&92eS%I^@hOQcfo;+(Cf0KT z?$!k>Ri{$Prv?hywHFBIIfkC-XIYK=e4cvWB^_0-O_(5MA)aDynsl91?QJ6)-O`Z2 zF2W?!zc5hXYgQIh`IVL{Qr(Vb85bTS<5PPbldLP;T?QNIGiw}_Tm7N=B>m$dO74K5 zAnHaydpmn!U_aw_pWl0O8-LPaxbI|q*ZFl%odIv&Lu)BNsUqemD#?D{TXMcY!)I5GS7NE;RH60*t>V=1wQD6xovBo<5h1WE;^bXfe zyN&vU)|`ZM@j0G3HVy)Y^sBDXQF1_NLushSnrN+x1orKjpW1ZdbF32V(y8yE*3}&;q8DB# z-Llyq@?&zNtC1~kss(wOlV?ZL`;SI<&p$rWn8l+vSHdEZ-ULyFl)0ZXyt%z#KH1&d znQ0-yn%7Rv%mNgh-0m)wcPzV%p+vNsnfO|a@2P3>?lJ-LDxopeE_=*!^U+a>UU$ii z!b;9*VwE8%MtC3(&X=7oF!1{^j@BT<=2Ay~GBVwq8 z6s)bwh~77A8;L~NWBhh_#Wd4IsJq8#FWUD-{lu1gx75b<7jL%yvDo}b3V8|&81L4R zDE9-AeUAQY24#ky`(47DLzlZP@2GH$5o)2SUk5=55C@Sd`$YzFYJ#L+Fjcu z_20;Uo->|&1^t;LF=L^X!@1k_SW%Xy#SZ`~YPYneTk%yvrR6B1Zq&cg18XzqTTqzy zPwJf=dxc}ZRljlKrMR?k?$j_j`GxvWnde^EO=C1myATZGbGY{DabC1G^nZs}bq9oq|u$cjXfG~*)9`dCwhM$kdavW8{ zS!v?iOm*C3j1pQ~Yzf_3iS)_W2=I=ENsnnkYyE#~p5`#5KE} z(|m`8|0$)I%JYtow`rAiMOB8rS*b$Zu>sCKhyr)pJChiHh6V)9FWqrRrok_XNwCsx zX*xuGl%ezau@SMEc3-E}{4ZRJr$A$I;ISs;!)^EH*`C@mwPm20ZoXN|8Es-q3QSHX zM2FvR5B|~NCG9%=-Og5{>8NE+=C5ITZ-`N1^0%z6a_Cy|GijAYu=-uB>dWH-tu}f! zsgRA&`L09Yzy{Kl6wY$~Ujj@@A>c&Uv0~@_KA8>=m~+rb^b1yzhuwX}@$>;8JU5P# zO%nuv>8xpJ5kBpoiztG;q+5;X|B&{xe1uAr!S%KMUipPRC+At*LTe|79+Ayrk?DdW zlF)6;n#6Muv-T#P5vAhqC9;DW+j>S^MDHAnwf9EcY7O7X0f2pm? zeY1JNbBr{T?fdY+HZ^5?`IS&S#wWbumHcM@(Dnvh3nR~IQB*P6OQ&Cs#dR9{7P7c< zY#*oZrsPdBMmyZHCoj*QYlz+~{g&<1u`b+lwoC~)X#5@!gHY4#IJD-B%2|1~d{|2s zWUSl!0#~s4P1BSS+jV^bdsCMz@r?HGyXQogvnGyGbjD@tKk7mlw`>2)Ay)o#gkt|P zz-6PNudkLw91A{t<^4FA4=$~v$V1l0|5CM3#ebh(+o-R6gAooKgo}qp zD~3bklNcu&jEmdAwZVOKgW-Xmv_riCc>YH=`$x{~;KZyVdTF{lG?2wb( zaVY7`Cc9%41MYw)HMkc)AunIi1mm8EbGqtn`Q+rdfZvaB-)(y5J`lUD9D0luGxLf9 zCg6pvDoz}Un5jI=ji{)P=v0BfR|AT&CtIXwIXH)NU0Rf7Er=`mOGvhILH9+F?0)A$ zjP#0(qkl)H{+omeg3=fV2f@`R!eHGjj8`o8C)N$M8*825Pl!j&Tja;p5ve?-yV&+B zRzZyY_4j_onpB5&541gLuWAywer#{%1q?#Kfqp-E!d~b7=OcTkyKIx83JnBSm3}#R zvH;K_Ty*kL)Ly6T^G`k-i&DCnP#2a+d{IubTwv1O?@*%IL=*ZPikj$ zTxUaaN~xS$Nt_kgDNt+8UCv)ny5IVx9cUchHjS#s&1HkpaI$vBN$-_fHtE7>KVLVH za~XS$;l$M}{Yo;w|L2Qe_0RWANq5<9n%8%KD?=d+08;-JPRdN7Fo0eO0YszcZv)W7 z0MXl?FNh;dyyAH|i{h-sLvRyuFA&0m;0}f81c-3uEp}6QR*_`UUjjSrBYojGncVezH~VgJ zr@{3Akb9N4!1Vl(%g~ySn>##uE@%cES^dke?AF?0tx?wh&~66|Z^>uuz=HWEMgX;n z{_|yWPlcwT5e7xI>Egw?+!^DA*%VTc%=~d9z!ai+qemn7@p3H(ig>I;Qwj%?gPy!E zw#1G1!4zVo+Qx_>i+?Vf4+P^k;QiOfS@pl1g9iU{zWo3G0G;y_ZIk{B7&=tlyiXhq z{V{Bq{LdJ1qIEPD@!axzq|u7oW8)|iv&*|@vX7*cZT~TeF{x3Dz#|+evlsA+t8FZ6 zJTW4!>?m#;?zhhOESfFZoNY`qIziXsFxAEy8NsW5-nHV6D!Xu`QX`*{^*ZfEz zeR&jZvwE-bbe)kgbV>BnA5n@0eLFOC66{ok3N&J00Knxj624-dYi+bV?zWI$YRt(G z{8nkKc`lZ8?gV|%)j#sF;>IylI?jgE66Lc|ySNP*rT(CGyzcG`Di@M(tglUl8Q5Wrgu=Yt! z@FF7FZH9!v)*-c0XzhuYCQvp^Jf`Tsil<*Y{}~t;ssF#Z1Fh87spUX&-#W>?*TDYY z=2USlgh(@Ht}cybz`6t{{Icn^8U3uBvx&a8GRbUx#^qLfgPvdB*V!_J@{biCG*!~A z8AXqHt{6W7O6z1k)XMU^Pd4eC+C#f_%E##k$=ubi@=wM5RWCAlvuk;lJ;9iU+KUSR z+^om{jL!4I%~W=Z3bgORn4yzlpX`_`_PC$(p&9MI3ggC>`3ukofYY+IHSK5G7oj`{4FToF;QfI$YIS33muMEjf?Dp6$1lAv#Oc_hImmXa3Mk z%HeX&6X^t_?P!-Pn)ZF0LY~^VzOm*&r+d8joh*tFA|DIe7cj95(x}q1aw$lQS>*z? z&d1L`{sMGbjh>EN^ViEJfxe@(@bR{g7vIN#MgqbYy3wf(2@yU2>e!3B1rTL&lAdte=BEQ$Z zno+%HuS;O?Y9M!)$hOWW+V|%~|Mk`Vd3(y0p>6IFF6#R3SAPnzuXaZ$JJ(+7*Z!-d zwdQ16Y

pigFcj_Z5vv4q)lV1@$R4;r-Y=dIi@KTOs{?w6{c)jS(a$ znH-(qm+(d@s@{q1fJBcVS}Yv)r%(xe5a^m`+)?vIPZN_f)NwIhs03Tm)qq)gAIMBb zjEcwUg_jIv$clxs0vzLPg@PiyUATZGw(J3zki>0C`XYnEY713kjrb@Zzil<5;7%u{ z%F{Qx<~CZSF~%9s)aKUe!>#~V3H4h0+)eHIxysOI491<%PNP62)aX4Z7~b{jr?N>? z+BkZypUYoA1WwDvrN5j&AW$dJ&p5Dr6AGXzLD(aAy@a0Hg2Q5G^fb^|C3+u0bqGtG zDLsPHF@uT$8T41jh>em(3zbs-qlO(e;u>%xM~X21y}!T}dC%H3Py;1*0Xo16b6rRW@q2qLdg>VC&e6=&&yLB}uHU?dR= zEw}NvX1pY>Db<)+1hCV}v$U&(RBu9Fu^J1sI6d}6&zVgMuTw_aq0U1wrBaK%FqpEd zv@iCmydu;~Y>V}K*wh%MN){IvgD~Bs!zB2kbcm@54hpcgJ%hF&rNAl4^P!ZrGCG#e zLUG`zB`mH4Y_lTmk|Mk<#=etJ`~u8M_gM6esTrQ*mQr*my4Ao?YC zJqgP!Y|PTk!L+X1qxiQ#T zQf3|lrCm5b#&;R%g#>)Dn$BNVVeITPk8IO?rZSmHWHvsR43;nRo@ojaJM_dRO0nC-VGNXf{4VDw=zWuk37crwL?B)+7H5y%>hdBdroM7lrA6UYJmoMbbXC%B}aDAeVcGy3^} z@p*x>S)`#xNWTw9W(iAsyIM6^1bef^;iJv0yX zhZI5iKG>>+P(8={`V@441e%pq+#{cKKlg6ECY#XtDz9IFubAP!!ug%6uu;12p(3{J?|FpnA*ZfJ`N0)1SsfJCrC=XEb?OVvKf1)i1*%sC_jZw*f$f9?Xv((9KmWwGmcy zBZPV|R{qIcO#51>?x0RP^{E+v#O8Oii$c}(=%wB*>az#eFRUM>R1q(+b8wv+q(x~a zoyo=NQ1GAwQ2}d0FW;`)6Kre-pA^*MFDAPoSzk|GXku9=F_YiQ-OTRo`1>3Bi3?hTnvF8NY6DhBi$% ziWtLe2FMcCJ2)L5b|lYrZA?%PWE)DFd>6Uibe4RxT_52*f!HzAUEG(z&vntaf<2kw zG)3Q;CMC0Vo$J&|$e7E3M@~`KFCgfy4=bcW>ukNTKo=3pg0l6vW`B}XMLWSN565b0 z--ORRUQ@qjZ<5)G2JJ$zW|u`%c?6V{RJLTQ;4EK^LIOAT}~NS#XxN7G8BGri;YLI zKn2*OZX^Jk$Xl&jZ&-;7Dx#8Y-n@!9t5*apK6{1#0E7u+BQ!3U?ISuh1zIFN$d zW}UIfqzu_*E3uo`$(E_R%{fLJVbS)CnVizmsY1^NP1u5T>>-TXD1CGGiE4iT_qRhZ zs|Uj_M%b;ypY5|)z<3*)X;8h*7x?aJ#hHV<$9{S{HLR?g1^m?ibaWzW|MA23ll5$zZ_@O3_oF|X>xuj6=vZlV`k&UtQ2UZ(U zt=m5?Z&@X?Se%O7V+1S^92lr26Dv&~j^$mUyRT{N0k zw6uKnAd`|xWUP9lKA6h7BD!*f&@SP#wH&JIUrox=%FVJKip4xlQvWHns7_ei+x)esXLEOHNT;GW*&F>ha~F<7ngU=R`f~3X6JDEq>gX zYIcMd`n7)O-bV*?Nal2Gi#lSpxtAI$Oq7>#WDw8yMPk`$b<1sd+9_luTnWM^R`mI` zZ1w>t-$Y617%P`h?=OIWNJ?3vET(K%oJuXjzwCS$`$#O#_ukga(zw`w^)n|r-ikBi zDc0Oh^O&iJ4y)d7Wvy{sa^}05aYH+4go{@x;!bBh+2hktrN8Da=_rBgKA%HO37yJX z6PV95Bf>Q6*V&CRB&H^P22z>0Gz3c$XJ3l^lyLN_gh=7#`WoZ@zzum#iM7GHI`+q2 z{+{y0_!qP@{SO;B(nMt~hhL&>6#Tp6ImbC*XVNn*GXXCA z($H4#m?S$QwxPsC&jh(@CYV+$&Ya4(N`9J#qmt}c}eIqV;RpvSgd#9Wg?%( z+>8Q^xfAaIX)rUMF)KzRDbIlm2>y=V&8*~c=Kt7UBjMz5U2tVEusFUGjDKe?S+O%c znjO9RK7JX$6{)W!Pf2nq+)-yT)-O!q<= zcIZxrcIsk|=TL{lQH_3(itJN_0IWU=xQCRSNPHpxz(7-69M>=}&l|mu6MjPr5XzM=o2p@Mv>T*35vr+XZq{&63 zl3(<1!42-jEdG?*q8-!gU|wj(+M2Q0Y}#@yXPmGpN){{$;in?=YNf~$ky&t$d~+eH zUDQucvk?uXF+ny&Gl{q~CVxk?+TzLfy_*g`K2!Ue3{E9Vb}t(~oeys7SI{;aJYibx zT9`Mx+*13d>8ZQ^GiTGil}{b?7tebq9&?pxq|)U@c36tlip8yt-=e*#B^o-y?k&>E z9&L3-SlcZAuAC0{`DcTp&$*p*5jk(}2~uAPT9Kq2J=wh$4fa~k-Z38dsMjtcn<}GP zYf-3m&U#?rLWAGf%yCQIeyOq7>(Oa+>~)cERj!Q29VxP{neZqRXd21zPR9qI*no=0* z<8L$VMx>o!+W68p7MWY^t)R-}Gyx>znLzlpOQMy8g=ieD{t6qYI;GEVUkIgl-! z)Nv$YfACLhD?fid(fUYF!9>nQ6z=~61^5gHx+c*rO-pb{mc@j-F);$MPSN_&BaeIQ zn#R-L>R!gJTBM;}J^UJFsu-7bV`5@ScoTF2t0PZ2q??2b$3n$TMVOny-hK*4MUK<$mIyv>iyU)P6h2-oZ(Wmkrik zvE-_YFG;n>6*&3#FHMc&^%0JHvT((jGLast%siDz#G_2^+3{Zh>9HOd2vC7NVlEi- z-rBD}@4X4W(H%UO6>%y37qBOF@C%U3`1J7dx~i1exm@1tMv;(ZDI4WAE`cwzi%J09 z>h|vEzLuE>Dp&qV*(EZ)|0?$=AQAb(dNRf&ZSC9of3W($c%lcU9T8w#d3~~?SuKUD!FjGW{nqjE@y|ZI z!sFi8&(#{7OqTjA{Cc_G4jHCo5ur6UV(hW#9|IOH_#1P|1C^4Na;=n9`3ISGDJibK z#-~y!j$>LMwPm6ae#lUhxEw{jdnvj|CuHc^QJ-uy&!DIYf2TvoE2P;Lv++{8l5Wg{ z{J9f%GAqp4u>#bE;PPi9jW1o}x+jdD$Z?hPTsL~wa%`$TK)%`wUUi@YTQXqeK^#`dxoKM}yZo8ii=hg}6PPkF~ zQ6MC7VYfIwG1Xl%MS9Y@?!?N8fv2t;wd6%qvRgCrs~C>s=M{x4F1I}5I4&A~Jm($V z%So#*pS~oDp2Z}-zdqQVVRoCv$^gA__mSukJfkCoI}joS>hr)OF}mg>`KG8i8mf@^ zCnsK{iI@x9S%oA<1hVRha$BeVBvU3pr@YEVznN}ad{vGj zW?ji)mM|Lh*l57jepRN#_3Ku;)L-MN#MTf2ujOY<>(=>8BER{#?GC#h~ zX~dlZY~IIt9k>1k2)Rs-*FWTXImY5;=?iny@9jU6)R3bVh@wkUCE{L{o|+5G2p4{u zH#*Q5xio;+6Lwpu%^ct$0%|IESy6=1%h)Q(5-f{ z=aYm_`V*r@QBi);N2NRuomvq*B)6>XlMxk2+ z0ygxHYuO-iDV$lCE-^?{+|>vbm5K79mA7YLH}Izy;~%n8kZ~Pdhnu}aqp}8KTv%z5 znfR@);y8~^7_$Qb@C$?zX2Ixv#Qev!-%bIu{OS340HNduHd;q6AQYP0 z5nwg(J=i;y3r$~ra6!uV_Fn8E>g|VD^bDh-dzmJdXb5u!w>25Q@dU)t%-oVDu~F~o zfV~SVXO?uIZ4lG)TqO3C?|#U+uqN=*^oxdDRvSGf+ulpocjTOzF=AU>^QTH0reFM6 zr-2Vb^jNr^GzEvHs$b(4eHIza#Hq;a5+3Uv`4&E<2=aBUP5(Peq>Diho$qz|WUU!V zWZc$Tr`W`>kIpiga|#(_e2;@ljxcs=IJO6aJN&09L4`S>VnCr0ko-E7RXWL#`&ZPyMLibXc1CTQ@i3?l0Mxh%QRDx?Mw?@ zhR?Ra(;M8`i(Nq#?Trt<7kh8i8PyRLC&v>udfvR^pv@9;zLWAA`{vdbv~N_#lRvB0 zi#e-cg_++`_FT{YW~83tYdQ~V*0l#&{(`XF*+~l}ySNzV6mqqA4i($^ZD`htd-t6p z4K%%RW%w-P4J}4L+FDQdjs2RU+e6db_ZMC9XWSOUzPjtL-Kj4=hPm3<;`~{ILp`=3 z-X=QEWv0o>EKMmce-O=sSK~+_Uam31SSiUBas<@v6&^{s_0aL`EF|WQI&#%UAjX7M z--)YhZzgRyG_%Lb4-9gqy6SZAt?CR%!$PRFFde56LG_!y+Wo3|o5PLcsv!ohAfLW7Fk=y$w3ai^BC z{(X)lkJGWH>HaLSfYHel#aA!WX)I zWUifKX<{b6bRSmJTmN`2OXAeh6R7GHIsfwtPYC_hM=Rpn>grlfuRpq&Wn+4F_x!>7 z>PFRRL&-Y>$pPD!l@`*(pV^*-PM$iVt;Xs2b4g!sMjNxeQglbBCyl7p*P487`}7F~ z9a>uno}R&thw+AE#po(>&yf{kxqiVyK?F7Z6e^9FG8uaAlSfW+S~YA6Rzqo%>Y6U2 z09a1_m#5l0l0k$OMy#e`ynr<$k!bHR<=(!nrKQoPPE=yjc%@#Km!)2@dGUm3aUR+} z7dLBv&viA;Ha6V$cEJ18Ap+yLv~F=|x<{{cCck)|WEHAWk8mwpNBw(hIe_FUob1di zVVzLdI4)sG3^B}3>om1J!TX{(h(o6PseBLFA;>4av(1-Vkf{`|&B3$Ebo(LN#S9qi z(>e|9s`Yw%h2zL^E;CZC3+(G;iS21>J({t#fkzj@*J)$ zqGlJLn2Yn|S{IuLT29o{%UusW2imCW__Q#uEC+_@k71WK>wcPiEwWd6{c)WX&q7?ElJbi9+1rCW z^A^=F-?(3OxAXaO>UtA&Hbd;X(DfXi?xXsXDORXS)(KB`9^ux@%*|(upjF4w1A0;e zMUJ~B2EEe8oi#hL{g3Tr)GS?>Rjf}dU8HyHx#+rQl;$?a#h)`O<-+pxf_=K#psv+& z;`x=?xYzCM?0j5I+nd@$0$mQsSL;vH+47;+*fookfsE%d8n&I)Y%)OwRji9B8m<@G z56O=&uZa`f>LfK!Z}@O>Xb$(3)y!OeWUZ(-7}Jo1*Y}lF$LGmQT8(FEqIDQD%}*sC z(IW)mjKbqW6YKn}9$$8fu{JFzhbxWy7(<42dl*~NQxOjg4cyK~q)hi%aD0(B>Yp|> zw9=O3IEOr`pd6${yxm1SOIyRdXgZAVo@s9>GBv%(rqyCXMGDkGvAOcPWhpXP>GC#y z@#Q3#5T)xdCr4#3?wIVbStd~8ZcP1*ubcX^l`9)CyFjnr$yj7h4Re3=@V!BAM;gNn z$9A(vR{P}^!TVM(`G+5z7&F2$E@lp>pH2*NjSVpv&CYT{M z%zc_S%9`I*Rm4^`zvCY~-uw>jR8jjB?N?Simbk& z9wn&*S|-hxo27S>-ia25Nfo%~ITsMDglJ67O07(gElIY$Tu?e%im;=wDB>H(7oZnOrVZ5jPJL@{en_q> z9(LqJw-Q$O%$QuzoyIi3$|~JCWOLd5{+zT4E84yfiW_8xoZMhy9u!*ICLFN>HhROa zADuB5ox~5I2};a-3_4%I%o75vM5_jqk?-{_ih)ke5E@`f6GC$x>i}6IACOd7ZnWSi zYxnwdEOnpg5l)3Y!pl?fSu5d)aX|tUl?dSIHiwmVOj>1O^tj@Vb+f|u zLBEvO^Wy>q`~kFBwbKh~X}_0Ql3eMurw*!x#Y6$s(>DhmIMQo%b#Um zFY|hyT49OTH2h?~bRY;DCBry0GfIYV=3YY^6l+8^gAswsqdY_wnkB>ky%@38&qo4S zU-VN9uUMhA7aRz;%ys&(qD7Z6_788w{CPE;tPQr z`u9l1yiIK6j|LSKgcMLCe2{R>dKK~)R>tzAb7eU()kQwKbIZ{>F=}&70jo2q4d=ln zS)CU4%5p}^`oA#4E(+K7V053XOd0e^lck&_*9IL)5QBrf`ODv&c#2R7eh_^ECr_^c z2~fh}bdmt1U$P9(TWMH01QX`~p!E3*ghgHfRn-xy(H-VMx1%N`8P_f*TS(W*bliBA z27A>+7faJsGXje2fa%sbugtRrAliWZK(x$L&e6{!ay<(KD z`(A|1?Qe86xeEAR>8&Pi-TYn|CVKzEhP*S2;+}ET^$V(d&qg^7u`Hw&RJ+2w7X~}y z#UEDxqq^#NhUoSA1DW~fa^7;kfE)!dVWabd_mcj6Rh1kTAL&@ez~3Mf$-$Qd*VCdX zap?vJWQH`Bz*bQtY&(@u+a((vPsWvEj$C7(q@A2bq?do<+^mw~`rU^Gu7aqiGphj1 zByptK<2G`t;3AE>sW5?6I)-G-v3X$*Ow)2V3)L?^`Sg+f0r}+exTpBydqYI|UC}ii z=QOm7G*7D|h2wkzorFQg7eM47>F76cZ|0hW=?-P434qq@YY>?AVqBzVTP*PXUV?v3 zI$-To**=O`6%ow`fL`j5=ry=-#45T-DS)HQc$GRBwoQdVTkJ-c)G((Mp~e*%j5O(1 zrP+KmzhbZ3t3W*vT$9PBeP!C)MiOp$AxE1P$uX|%Fv*MJ?>~od#aHvILHZK-qU(x{ z&)qvlW?Z5=kxTM54bu4B)v6=PYHqT{qsFTswIGlZT~d2d&x8wPc2WKIvn5~#G+6p` zdjM=ogL2>Tf99y=J{WPYo9c;MK0B)F@y@MrZ@(9}o(n}$U5chTV(1tB4dF{Fr(2*R zKpqqunv0l;T-1??n~-KN>`GWlj{0ETEI6q2>s7-D>6!nKLddTcpp~E22;Sj#0$6xk*F%&g zIrCIC?QJ0fU+F(s=*}N>!+&&iJv<#g!=q$&zn~nQ31ObDSh}D&8Zw%^mM2gcV=Lt& z6n+Mp=LfJJ5IrE3g?is28s7H)EVqqE>A!0}b+_#NtsCAOl(n&2`JP{Q+A1ua^i7(# z<0UqZ%-`kvR;>K@H_{HvSgN<@3yh6jY2dMgd3kFVW<@_nW0Laj;+CS26qa5XWQmk0 z7Qlec1}Edj(St=2WXFUB#F=kjXz0NrOd0^I@#rO?_OcH0qM@$KQGVRBqc8;-r^e{p za!Aj$CY%LM3C^aCU5@NEX~>m77wbPGC1fcO;%~-|mLdZPeg`BUxkgD59J!_9r3r}< zs{7|*Y$nnS{rhVr(9uW&n9!arL4FRW2WKWwz%E1xgb~#Jt@`HyEk0Vh5b1?tkc~KO z6<=~*poo+dLR(|%?qloF5y+@`Pr|L*)+^FiAcMt1|P_vKdai~ z#~iLOunq~vh0c20cqu0py813)&iN|uOc>7!6d8cJEjke>iMcqe-79CP!zer_+mz%# z-DKudVK}z-nEi^0ZWN)BvFC$~PiDo73WiHW=M8!1VY&MLeP^g9y9G{e|E4m_Qd_<9AOv`99%&|rSLc?z7(($!R!5Y0k zJ`<#U!byU#k9CikW2GD3F)Niqa-Vh}ho=pp2>Px6BM;t8L86CH!Pi-g&m17Etj zia31fo&4>hlNq6#sv)DeP=^(%Piw)|fnl#1#~4bCF)>*Hs7*zRfJlECLhvQ-ytkzu z$9V1^9d!DM!bIKbD%-W_sP}m5+kNo#S^CR6Q4a3mZ#!I_a$6-nr`ZU0U1YeZy?*P_ z^hn~U@-g*;MTghXy<6L~2TR1#hLhTCQ}wIMTXs1S(m7*n^VMYl-hSbUApaSD zW(4GUgesYMPbHz#Ec^|U6hfk*_txABYZd%pk*p`nfOqb90)3h&GCKI0FkjS;>0b{Q zB>F_)+q+;f`QhAc#k*Ip?rwa1#tN=(2mk|Dw-XS0qTfkUZEej{LekJbp#s3}07#W= z0^Kc+&m}0EO93uYiab5iD;}pD*|_TkU|Bo^AqU-@kl}-r_-g_?2CvzIB=u79i#6jy z?VuI*phz?-njox;^0~C0S^u5IMU}&e^+%NP3OLdGb|2^alc&!=olv;(kz?V)qP&$% z#hrB5#wb<{?&~q8B2cavT2iGe95G+d?-;pQ9fgSS3OLeebmNGt($mi1OXh1%Jtx8C zE$INSiu&W{KeeT-ZRIG<`kvnXxZ3(yGw_*8^`lO|g*wcL9p{1m{o+O*MMDC9u(CKS z4QT_(rqBhzXX|)4#6=3;_~2Gz2^CQyZGv>)kd{)9mDrDEV!cKjj=gtLcM8mS_vH+Ove~ zYw{R0`jQl?)EkfN8!;M7uRA(p^MqAx(jxGlVHruq1Hw*hL5x(wsw678HG9y=JaGNk z_wZum^>%=((*8YtD;FDh3tL@QXK6COzQ4a5F!)HG$isPw@q^X*B7AH|mWA-WnQco9mU00KWyK#vs*$|i!q5TH(y z{BpPm@V%k)x9Do`Fn~t-ZGON%;P0LM+AhE4?d?B*%=FLK{y}F^42T3?$!#&hLc0P3U)6Mu$XQ?I-OWSq(rgm4;%pCesGP}CBbd35$K(+GU87pHRV%hOj|yQUt~ zBg@fWGVY#upqjSN6J*FIj=o=9UQl8TU}C|Gx7zmEb8;O|$S1XY9uiy1sCNKX@1NKQ zAIBEb13r!!ilqnhbAR7HoHO9F&_w?VI)~oFloRmcBYSbJ`G|q{LIIcfuzFEo5yEQy z9qo*O=xV_8U!nAAf$t;$_-CJ-{5XFmWyAAthw$QU?k(Eaoc{ezIR>0ICUCqeJ~e_O z-_Dl^k6uaTUw)0!cVcq`v>S)_k1876=Fy!usM9CISsj>TBL_`L3GH-ByC_}LgsubL zI7Sb?oq*K`n!~@{ZUR~l-n&$ib=Anv!-PAPf_Iprej@Dfz2MZpw(P6ff3_Rw>`5O^ ze8>f$3F)o?pum2xx_BDPI`s<(uUIH-pXsz%)DTU`D4`e|envQ}DpLV=)0AarjZm#E z4;PvU`Nbag*N+)Ug;I{W`l7LjZH?%lk|c~_zaNRjU=5HM^bu5z-$ZWpRkL|9h#GT( zC6NvQL>iVS48A>K$dh({l0e?}-zNiq+cSrWOMhE1cx#D&9(mUEA%WpjtPJ3d2E9Qg zK)wug7EqaxAyIL>5@bGx7(ND)j?Wa`V-|VV57#?vt#j?}$+Lv{IxjaKi`T!C73^Qm1fP-dHPBA=z+1t1>({33`#k%LI^#hO^~HhwF<|MdPrV z+!!x0@hM6E^@rEo?m5Rf<>jPQP^E;MH5C*V>jL5k$OFW;G57ZGNzS55sBZN8`)*^^H4= z=cyGK!dw(C7}TNCH1CpwpUCsdI8~E3(VQYY;q0s?lqF+@ZLIcVXgYr9txEce%)Jo@ zmEH)@ECfxJJZzhAD(=G6HSILrtco6L(ad2Ka=!A>{xXx?NB~8)7c|LKV4XUwZS+uq zS}1p}5}$*bAhR}_P)j$J8&_%JDeAkGTuym&O=NX<#1JXn$q@=6gM`%bU7rvGPiprS zkB{crb?PbQ_Zq=ciIS!fdiXdVTaX%VkdvLs(rL`st)u*or26sv2aHcvv+fa113w9T zr#&^RZs&T!DmcMIxCs%(O4z0-u!Ji>AosUBUot!k9qLmGI=h8_OrQHuS)XZAR6=J8 z60iiAy%x87&gPQ<JTX(sh7m8C=oB&3AHW}^_hP_{-P zuzqy==kHBL2#zuM{%P{t$Ug?&`uO_kYtA5`kRuGjo2|2!MZHji9;p#zF?O)Z__Xdx zQ1`|pH`kHRVXEs9*Mi-myq0W5NxCa3nu7Ng*X`WMWE7~O5=&vtuir|97a#zU`gXZB z{7!~8N27 zNUad~oRAW-mSWaIS^a{=iu{dIF1)R3NZ|ehgpGQ)KkKwx>y^AIHB{M6mD$T29~pyP z4hSnaCc=d|bA#ld6zor^vi#E|?IKnUWq=S)ApnQN7NM}X>y8L;dgd3M2J8AmBOv_c zcEY}!9A0kxACJ8HZu;ZXlT=?AYKHQeip!H_G-wsUldByNNAd&A9x1f)tFU8OP>IN4 z>Z;_0e_b)`9!dGug`_iH?z3zr61IOruNxePSNX&7|Gvzo)Q243j?<5_?kG}>4xPq~ zFBV&%8vNue=gn^F81ZG|`}$dMq}U($?1B0+aK%M>N`B*V*elj~d`gSj?}Pg<0J|^R z_RQA%PyG0@?k%Z}`T~QKQ{ zY0a%)TmFPz|HiU5S*d0b#u%Y-C2TiHzhoBhkw{SpQiS`IO2>Ozoxjoh;luMwCH#W{ zexv9A<7b_IBUlfCg)gChJ7KY(*WLv!`u%r1Z16p~Iu}vJd6zaTf%xI>EAxLNM9l9y z`0dvJbI$(_f&V$j{(?>aGV%I85F1TYunUb%^z*M`$j5HPo#>I~{y>5=CqHj*=WkV4 z^fz+4`IwJ|kY|8z-EbHl@7N;UHS%VFQ7kI5cON0Fn82TMT zfEYjLU#H0ApQlLqpD55W@7+a4;qr5*m-c+AnJyv-Xm8V#-m@YpQCnp{*UmVfC6afp z8y;>kvzz~k$qqfrPUoBdW0jwmg7#C3<6;A22%&&w1`ykxZWr0tFxyp+qh+0rZ-D0= z4*vlk?zfFde$WTil2N$BS%Cl+dlmeU2fK!*wO3zH+nhlmII*)If5aCcn}dCu+vr{I#oK zF;#dN%on3C5v$ao1Ss|c%dcXkxM1z^iD~$Cb@-; zUZ(H>upeWVM&)*XX^G>^2RX_I5Z8Sc(E0C@U%9%*8R8c{yMlUJ9G!`#v#}6)Qip=~tROV)ljgd6^hw z3Y1!-d(0Ye=(0c^X;v!Jq)6oFLB|kMFsQ-9@|QUk{{kL^qN?umVEc^zAFdt@?oh0B zf}A?2(6aT*ZUdP(MknVR(ixz0#}!+OlsHKJD1-!+Y*BDZZf(?T428};E)O4_G8;tD zVPsD8m>D!~HN_<85EckOM#I4&L#S}7$1Lr|z!W1mUj)Rq^g9H7P|=|n21;2TPPXFu z!@B?17TL);q*|J(V{b~~%S`xUoDT6gRD9-U%oQ0W#=NNQ#!!1C8B#B(KX-=eJwvmz zOypSiOLzn)8>gs)3rjWeF9_NNLQrwR1(s{PTrx1lA|Xb?76b&fKM?@qi{BCNA8+N$ zICoeY(ycog`Q0IOHnf5-1A9203N;E+&v@U(^ zJEb;VB{yN}OCDQJ_nj^b?TTCG`gtm6He7^@x^(zgia_629BFM`A%smvqPvB?hZb4( zD~n=6x+^QwP7SoN%W(V71{I+KLFGb7<3Zt5>vli|3;C)fNvQwo{4jkNo>(3Wm%&U23@I0lUTZ9+eYJa4L|kQXs&mm|QnZx@UDh>Y zViNnbg*y;m#Bbo7$=*qiF;7Bo$D#IU(iM2}V_yF2D2wFR@Dg9ji1TdhU5Z?8aQB@7 zyJ{Za+B|fXg^t9hmpnvKc}s;0b8@mT*?O$tqFlbkJ~{p)HgCoZO-Dn{r=B`x)h_Hl zq!2M0R!{Uf9ucO!X^yir?gh<)7ypSd3(sA&D*T2d&Q0gCAgn-+Xczqd=w;6b|7~@_ zcbZ=-+Gftk`!z1zTz&iW>b1!CcR0SY*ofUvKs^AX(`P-)BvxFPD>X&Odujw9RKfIQ#pAm=RQBs3Bwdt{%wIIh~L&Fiak-u(ryEkML0plRq?TfTDx!Hc6VB zYPDnv&`}N6CdsY2Igcy)8fowsg6)>3^b+o%a$!ni)tu;1I4h#8wq(t7rUXDAFD*s} z#Arkn5SD8=5zx%**pvTP^r_~e$lYjYy0o+RNVaK+M#vz=r{*xB+i&6=1_f0f@rMZ} zzD%r=yWhV+h{ln)A=B7~8(M-D1PBaR^Bms_h0@K2OZ|-d1w@uNV4^(1tmGfSBuKPZ z;9&LbO4-)mk>>xVo=X3{162;$!QbZt`t*Myr2p5$xv;&V(+3b%K9@BG-~tBD5p+^B zlBmU?N)rU~lj;Ple~Z#+k5M?o%@5UU<-IdE_w$p_xX+CGd%tRIZM|9fytsKo z?p)jjD8G@a#aWs>V1+t(Dt$_^$R9f;ze3wJnmXzm+F}%WmoM@8K;Mkl8Ca`l%dBU^ z%A{VI#YOH@o6^#ZTSo-c15>$)m-D& z?2n=aGmGj%iXevp?)qcD5z)h#OPSbSd?Y5A1{cA8a)q6xYrhOIpc;3GPDyP>`RlaYT`K-{4hdF-ROy8W)^? z+XPwFZu**#3?`L&YmgzD^ahOVG#<15j#91h*%w(7G#Wkz!CH_3e=v{4Y-A?0wm{P!z5-=4or2$U8mHChwB?SD%Jr>^(g(d8rgHXPkM9<&*+ufcUXZq&`RYro~)FyR)A%HiteaRl^PJuW@1ExYM@uNu6j_#PQ1luP1WKR+izBe|02K+K4+5y|*#<7O9B$)37V7XAEc~0g_zR8J`hcMalAv_z zk&KwYXZ8U_vzAR^>NU{&*{_0q&)%~u_iz5|N~~QFZ6&Y^=hfr(@5HoM|H90F5f@Vb z7{PDTMh0>38>(v*DO+dJvKnImqS2A1Os0J-=W8h2WU}&EqlAu8R|Ddf+4uLK_ z?IeQCQ*tt2`7%6EI66~FpU8&7ok5VmmS~o`G>&sTPe8m1IWhv|9Y)8m=QOk5IA^LQ`|u1dn(K=U_tE(Ys0VPKXG0yYeT#HwaJ*Eml}v|=tJ2ynyuklb-WA9=1CVS#1dyhPN~ zL8Nyt(qFCp!C!lGA@!Krr`G=_TELvnasu5QjyI)LiesB&8lwN@dC`CHynCwoHU)=U zsZ1lc`CRr=F3{08plBuQp;m=~4~Qx0%wn*b&0K5tqFN@DPP2)VLj4XXBRc|^7~B*Z zq;BLLP3ZB6psog3N_Bl0>`U%%FU4Ro0$g>JvrT&s{t<^F(mp@43t~(F_ z8-}^=9TN|lI3`-2hGtTr${i^ZNHQHd*NHHJPq!OW0|3RxZ?akYdA(L;H?Js;o3`I| zph`1(@1oH%W7QF4`Z9Tz7SvmOVH?D@{tE!+A1i!h@o{Wx8V=t01^g_ulrzGOfJ2(U zciG;Me$O+cvjYkSSXHK5RGv?%P}Ejhx({e|uwzn}G7{_sjW981=XfHPdGhCAKvn38 z4NcLofE0r#S^<~QD^)DLYwj6jQFxpfGR@RCev|+a6w-_z=y~;|xv`43U{MHf@VuL4 zl+zeNg-q!fGzZ6aVi(k&ERsOc10#~&6INeKie z8^wTJ0L!IK(VS2*k;p_eE3@3oTv9X47Q-!(Tu?D_X+m65Yt*b1mnk#1tZA~^=``}>`9J$n4da|E8}`F^(d=k?CweRG0gJgq^U35Uah+JL+ljw}cu zh)b;SR#V&PuRQ%S8zWsgD7qFyfYoPqnuB4E=CB*z_mKX+yc1Xa35pOY^xQmig~Vrv z5)DOKtX7e7)G%|Zz`N?`$oD%Quf6$$?FUYL_!iIRg-(|Q?Z@P17>;HvDq}JLnR-ZWhF!qo2}l9VT5!7w zfRF|Ey#x}vM0949Pq@`%f53`d;F&t$B27eU4P%FqNP++LbqXI<8BS0%bqE#hy6kJ^ z3P^45_Q}08SOOOC1?M;IHg)|2i^*<`za7Fa_M^8bo!2bD+6Xb@UMX;F@~Zg zbDr*xW0j`{qPM4cHxz}{5*cT?x##;=^6Vc*`QpWFgUn3fK(#5=gw}8ckV~Y)DW=9$ z-BZ7W!=(y}mlXLjjRe7?S`o3(uwaQ(&++ABuBJbTJFwNR-uHfieHc}OgB!p$6u_V{ zGwoQ6*77dA?DhZ!rsDq%?E|X5Q8xDXD}rLQ8AG+kOX?72T^#@|k9U(ezF5fhH`h_s z_4A$?SygG%kn}WBil%yb1;Hme3wwB+=Y;`fBZV7gk&7J!{NQ` zmWJb%(>AK+St6{?Qaptei6lM@(b}im*Asu()H7BcV2vs`b-N(;{Zk+?BkDh*fPH&< zX3dhsVJcbdAk0uV$OLyTg9&D~)25*I`{(@R87nGCA@>5edk#A>5d@?n29I@lpq&`b zdH-XRMH7K@grvsdo8xxeW_^wN8|p3o%Bfu4pC7Yu z87A#R0=f^Kn|4ullRh@uro*2bJ%R^^8VIhxj+`5ADnN%^jRzOVYdvN9g7e-(&!d^HOw+nSYRg7%+ znvG`>rl_)<+n-#AIuZVqdoOy}-QO|b>n*BwI^E%6Xuj;)0QCyiP{g5IUnlxiCVv+19WzQI700{u(_*0?}$ECE^%cX~w z-Qv8XNDOyKQjMqpDCKxN*t+|3$}A-9!F&DVzYO3p1H-}jtV$m_T??y6*IFkgwyZb+ z)iM!9()PH;o}=U4y)AJGBAdv9iW%iy+`8mN>~x@2j3RJ>OeJi;tIQeO-z2U{JMtvo zI?r20k28XhoB$G-&;pg0<4>L8oCh5x;q`)Xxq7q~<{EUJi$TqNX8T}*3GyRa3OJN0 zydh#jE~jqPUixEiQIGkD>+O2^;cnN*L*e3@>ZWQnp4wCim})KttUks)3MCkod(eRi z5wmIj%)5n-S?YqfHPcYSGRnTRb7PGw`PjF5_)|g;a*yR#8PgU!C1f)Hr$LzjgQ;Nv z$pYdccIrV7O>Aln6aVXQTIx)rP@r`Hn$xqWINf-xoAvj+8iV5q+jp)_K@KU@8D?iO zE5R0vbQAM%@QiZH9tiE#iY9d&?~UnMz28`lmJcNsMC` zVYnwxHlB*e|5W*{x&078a(v+J-&1*mw&kb#2)Bbjv%X_?k(H7+*4p0g&N+P`1}P|M z#x8`@RDhV;T=Mzjsy`Fo61C=kIPcW&0H4*5Wua&W>IEFb77Iqz3%t?Hv<_*NVEOKq zffna3B3Drm4+^ov;uXznhY4GB@qi_v7dG@pt(y_h6b;GI-8bn%2n`Q$XMOq`Y8yYG z;gYi*7)EwM6k;QK3aEqm|Ge1qeBY<7R^lChL^OlYzQg;;hx%=!1z%o#{;~cJdiB~z z+eOJC$GL%+WY{x&HLL}DH?}7r;qIVP=)^@71X_;mPxL?5-Fvn(X^r2qPGf63f|wrL ztjfI^k=rsoKc*EE&Y1)?qVcE0{wInFrI&U4OYWCt+LI-bOwWmnH#!yVvMO%1v2$!1 za-qW$3;SMOAB@w;;SF`WyATAhp&oJ?FmnTqRt6I3@Y>(C!*jzS%PgY)@9?RCkVt!NQnx68BJ%9DkXS}T-B^qZf6d#i67)lcm zTJZotWuSl?b#zp4e0@=$@77<4p71WKHJ;ovH;P0)iX-aO!P2d9WP-V&sGJ>WWx&`p z<$Jri5D=R%;BB%7 zmHOs=&S?b)90WJ?wQI>HC-Z*0#_LGST&d&EqplgQtBX$!6^yiMhNGq{|t0y#Fh1`E-bbW8|^J7Ijo2!_8q>;Uc{L^*2~mj^~cg~qB`P| zl@-%xzAkUme{eH5=-RN?z%?gVSKD5jd&Mkn2zr=j^LY~^A73gmgXv8>pnM0xrvg}5 z9>1OhoADgVc%{kN?W*n^Nz{W*}`Z2m0p^%PaK?16cbygn3GX>Kz$JaDq zXc3g72F49RG9(gmZn-4iHoq*{8@HIfLdWUh9m470^+Ip=L1Bdw`_{5Emb4 ze&keLgU8mIJnV=uDQ{!?dc&LtqfrBzqvA7E!a~qAY( z)5ur5Z12fqHDTNbk)dw$E+$NbVbQ6yL>3w`paFvm=Tq~g^?S~YyBqbG8#v(M ziYBv|>6izH8wn1{`w92M*tfAC4qPrHTaO!N9iqW}4xwS)IwhU4JQv$h$Pz7uY>CSD z!~W{7rkcLVyn7d1V@5QP6<5+teP{%#fg|o%500A2svdF+M5~)K&W5#cn**Nff9ha* zX9|s$HQ#QWousTv3jn#!18^!A#^2BJHXXWLGlS!`O^M4}kY5=0U8?i4KbhJL@MG<| zi~?a)%qZmeOC-a|97PvT6tZ%h5ZGHv%&^??77PaI$&fm{CHor~aDBP4)tSTmHDoYy zvGP#t_Wb=Kz*;f`r+iu^WW8qL?C{k1Gp&;r6L|~RLUhW=S(3g#R@@hP9I+yEeO^iUM@sI#WIR*SpPcQjDzdhi+a^O=lgar%~T`1E(9ua?GnUUBp{e7S-t|Cl2UwiI!(?_tBF%AK>uN zUG;eV<17352I;$XmEu^fXs>Cb!0#uGo7RoG>E@t*U~0)PlUu=Kzdk`@`E4hU@wnpk z%UL^uA>sRLVNb-&)D3#kB2=j;k101ZexA`5y!>R>>PF~rqefgf=k=ANkFrI|YTBx- zI!-l3b3B4nJLoMBcw^(_Y$%SN5ExG#v8VwGloE??vC?nuT4ev9Y5sh&am_ugnD4?{ z-ex|F@ZYv-I_uZPBU=_IM^#>hk1m(N}?c{ z4>8+CDBswn7GP85-*i1BW-+KwK9>Cn*RNDmGjm*q%iqHI~a%J=VbgYi4T1`w7sCDP3(ql(hy+3IN|eb&i__q{Sa-31LFlSg${3>fOh1YlyFMk&GQs1Tz~(R@^Cxm;Exk{N)zyi~Lz z%M7b4)Czz!EaLkczOO9|%Nt&|t1GnF%yc~av29eCFpze9Wk#X5T_;2_-*K45d-hM5 zU&={loAlo6T-DtE$cy@Zr)SECFWSW$Zkc>BcVVZxo0skgwDC4uNC`4HRy}71egE#6OU$?KZe#OtqwBlz zw!1nqxZd8GH4ym|i=ks`9|jIGfNCch()_Ph*L1LWyO2yU`zIU&wNxUz&JE*5byCw( zXECoRh-Wy}TOrjxO#QlG2rqb?X5$Mo^-z>KwX!j)DIFYxr&a=>phXKwBuUwz@-#IkbHKMtuy*&StGsKTfOi;4QC}Cu6C(jmm&{8}f9ll(58L7{Zj$7`P%gT=R zBJ+2>;VJ^>wvI|6d2nVH38u_W`1cGe{6B8J#~=R5!3M3F$WX188V? zut68(B}K&IQL_*fC(0#h#1>yUU@TGGY1&?Z*G{V?pf#;$W3wEuVunjaIk)=tAK#OC zCt~i6Ql31jf(Wr8l)dFfn z?! zvrgo?6bfL_h7v~SHi%>4nP~~rJ7vE2%PdTOc{tv_Ic~giIhJJRlN{1!PMDCmuB(%L z(T7r7sBzG&ZzyF%i(95p6P~hpo?WhJO)G;+YiTFqg^e4?&_NGAA{X^sbCAm(p-}kO zo%qRUjj+O~V=OE*%hx-NgfW##s$3ips0{ z#!91yG;cSeL@}%P{a{i&M*R7(8N9y%t!_iI`cXC7bEcfUtPA=~V|z2)m`Ka=_1*m} zMR=V{Wi489fGT~nq=s^naF+5;tv0y+pkG$W#*ibn(fMXRkGg7t2v8s0;~6E?raj0D z3sqTuB_IOOUN=%ert63CqfFuDt;Z(H7>O)kRz3{cGtvywWROe&2Psp1YkO76nyq@8 zV>8{HJ2S1YK_&yYU+ET#d3o@XFt*<)+8P8uxBkl46=_dNR44Y^p@cU!Xfv{y^nbw* z&`W{W9Ow6dXFm7%rbTu&wGZdqHVp?y22xQ#6al{HyAxR~*4Cxa@t2p?k0qXY+52p> zX)BjKQpRQOTwz#4n==uY_cQ4yV$W?_2ta761b<9Kq|9$j6Jb|vaP2pv(B{0NO>n9t zT52$axurbZI5mLa`0kFD?c1R3h8Wz(SXW!qtTKP_VAq87r)_s1s0=gvs9FG!`W6pB zqOBL}B|8}fK7(P28im|__0BacC&CwVY-SlV!)O03k`c2bWpl-g=||j5Y-Xi%bun6l zjPj(RJavUtRPb%E5WFaw{p=#^^r$CPIm!L3&yLH1uX6v0jDY4}(I4aw2OaNb7*Ufnr4Xd$Sn zPBD2YE^&oRZPmCThoIF1X2fo{=G9GhxOOR4Spr zAzbh8bMk2|V0_U_{$vhW!$4(Zqm@KHt9<`b1QUV@>{4q?2*4j;FKaWv-U321nd5uM zt-oJ?AtJ%*g}XWZ`2oXC?97!HoVj(hyG`W5{pH@+E!U|<$jNIaymiZe|21P{%*p(_$S;R ztPREmLK!F!Dxmga9(7%#n7Mpz*XU92=;EAMpc6~$03=u75&A|w^{{YOOOh9s)l}n7 z+WKb>SIpg4$#0FxLlt+58~W&SpW~#w+JPl-WG^0tdNx8y%1YrFl+?ocG!Hfx%p1?H>CECP*z!7E+#5o zE>A=(pG_BNe|vi2{jx=DecR!$U}NXo{nLvUS9bhs6?6Z1I&J?&n4S?r%Blt(c_!21 zQkv(PTz4$7Fsj$7Yb%T{s^iO8Vyr+$RH6&QyiW}`6DwHjQ5y^oDSxVid*7? zX5-`eT#R$w{#(|Pm%>;K17cNK6Ie9PyKO&jj*sZ8m0$$pnf?63z#}@D*{3QJdDt3_ z5*5;j>YSv7{Ov<+Nl&@C1~q?TM)XJmU}@NBfVUZl*B>wQz89!rck8ZF_mq>EFYN}? zVPH%Ibas3K$UDH*LNbtA`8RfYF#v+NJv*|%R^#N5yh&r!h}~30sg)%R-6`uxDHifE zLjv$ z1t65rBpLiTHojE;Fz&1IIAwbw1uD6}w@eWeJ#-%DTx}?5X(Z*!XyM)5$2-LuenmTCYoPk;{ApMnxU0TJ0i(!&jr0RpdvA^ zJM`t5>5ThgRFY1u2p-()PDqF04dvKjuMBFb*ax)wj1&;uK_HB10rBME<@^a;hzCdu zNw!zC@|H82}snY#-W~t8aVf%&o@UgE?%^#muPI(-HhQ zjCyq4VoIEoV#}50@5b%NH5M-$(SuX!uoXA4-lIZU<*0P~cv?pwZk2o~fl=JJ?ymJW zl)vq7$n`(dz}p8uo1el~(KFX%3NP92?Qku?sj0HkoHurHl2;Ud+@yn0XuN)P_W(TD zq-pDT_ON*)J*6DP^fn&oqffgoYvsa;^>vZQ{SWpX{MP&G*Zf1F+xmlByf5MvF$;JJ zOCEp_&Tx%_X57x*I3ul><^HDFm-aj3;iYN{f6aq5hoizR8s47<2t8vNv;ymBmuUa) xP2c}#mDCs6T4qLHsZlC2*!JKVjS~w&#+!O{{l0Hd_({M literal 0 HcmV?d00001 diff --git a/docs/readme_ZH.md b/docs/readme_ZH.md new file mode 100644 index 000000000..1f704e2f8 --- /dev/null +++ b/docs/readme_ZH.md @@ -0,0 +1,163 @@ +

+ +[![GitHub repository](https://img.shields.io/badge/github-repository-blue?logo=github&style=plastic)](https://github.com/kendryte/nncase) [![Gitee repository](https://img.shields.io/badge/gitee-repository-blue?logo=gitee&style=plastic)](https://gitee.com/kendryte/nncase) [![GitHub release](https://img.shields.io/github/v/release/kendryte/nncase?color=brightgreen&display_name=tag&logo=github&style=plastic)](https://github.com/kendryte/nncase/releases) + +[Switch to English](../README.md) + +`nncase` 是一个为 AI 加速器设计的神经网络编译器。 +技术交流 QQ 群:790699378 答案:人工智能 +Telegram: [nncase community](https://t.me/joinchat/PPcEPZMLaTViNDI1) + +[TOC] + +--- + +## K230 + +- [使用说明](./USAGE_v2.md) +- [常见问题](./FAQ_ZH.md) +- [示例](../examples/user_guide/k230_simulate-ZH.ipynb) +- [Colab 在线示例](https://colab.research.google.com/drive/1m8TTree096m5VHmq-Uc60gXyltVCgnRb?usp=sharing) +- [ *nncase与K230_SDK版本对应关系说明* ](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK_%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E.html#ai-sdkcanmvnncase) + +### 安装 + +- Linux: + + ```shell + pip install nncase nncase-kpu + ``` + +- Windows: + + ```shell + 1. pip install nncase + 2. 在下面release链接中下载`nncase_kpu-2.x.x-py2.py3-none-win_amd64.whl` + 3. pip install nncase_kpu-2.x.x-py2.py3-none-win_amd64.whl + ``` + +已经发布Python包见[Release](https://github.com/kendryte/nncase/releases)页面。 + +### 支持的算子 + +- [TFLite ops](./docs/tflite_ops.md) +- [Caffe ops](./docs/caffe_ops.md) +- [ONNX ops](./docs/onnx_ops.md) + +### benchmark test + + + + + + + + + + + + + + + + + + + + +
kind model shape quant_type(If/W) nncase_fps tflite_onnx_result accuracy info
Image Classificationmobilenetv2 [1,224,224,3] u8/u8 600.24 top-1 = 71.3%
top-5 = 90.1%
top-1 = 71.1%
top-5 = 90.0%
dataset(ImageNet 2012, 50000 images)
tflite
resnet50V2 [1,3,224,224] u8/u8 86.17 top-1 = 75.44%
top-5 = 92.56%
top-1 = 75.11%
top-5 = 92.36%
dataset(ImageNet 2012, 50000 images)
onnx
yolov8s_cls [1,3,224,224] u8/u8 130.497 top-1 = 72.2%
top-5 = 90.9%
top-1 = 72.2%
top-5 = 90.8%
dataset(ImageNet 2012, 50000 images)
yolov8s_cls(v8.0.207)
Object Detectionyolov5s_det [1,3,640,640] u8/u8 23.645 bbox
mAP50-90 = 0.374
mAP50 = 0.567
bbox
mAP50-90 = 0.369
mAP50 = 0.566
dataset(coco val2017, 5000 images)
yolov5s_det(v7.0 tag, rect=False, conf=0.001, iou=0.65)
yolov8s_det [1,3,640,640] u8/u8 9.373 bbox
mAP50-90 = 0.446
mAP50 = 0.612
mAP75 = 0.484
bbox
mAP50-90 = 0.404
mAP50 = 0.593
mAP75 = 0.45
dataset(coco val2017, 5000 images)
yolov8s_det(v8.0.207, rect = False)
Image Segmentationyolov8s_seg [1,3,640,640] u8/u8 7.845 bbox
mAP50-90 = 0.444
mAP50 = 0.606
mAP75 = 0.484
segm
mAP50-90 = 0.371
mAP50 = 0.578
mAP75 = 0.396
bbox
mAP50-90 = 0.444
mAP50 = 0.606
mAP75 = 0.484
segm
mAP50-90 = 0.371
mAP50 = 0.579
mAP75 = 0.397
dataset(coco val2017, 5000 images)
yolov8s_seg(v8.0.207, rect = False, conf_thres = 0.0008)
Pose Estimationyolov8n_pose_320 [1,3,320,320] u8/u8 36.066 bbox
mAP50-90 = 0.6
mAP50 = 0.843
mAP75 = 0.654
keypoints
mAP50-90 = 0.358
mAP50 = 0.646
mAP75 = 0.353
bbox
mAP50-90 = 0.6
mAP50 = 0.841
mAP75 = 0.656
keypoints
mAP50-90 = 0.359
mAP50 = 0.648
mAP75 = 0.357
dataset(coco val2017, 2346 images)
yolov8n_pose(v8.0.207, rect = False)
yolov8n_pose_640 [1,3,640,640] u8/u8 10.88 bbox
mAP50-90 = 0.694
mAP50 = 0.909
mAP75 = 0.776
keypoints
mAP50-90 = 0.509
mAP50 = 0.798
mAP75 = 0.544
bbox
mAP50-90 = 0.694
mAP50 = 0.909
mAP75 = 0.777
keypoints
mAP50-90 = 0.508
mAP50 = 0.798
mAP75 = 0.54
dataset(coco val2017, 2346 images)
yolov8n_pose(v8.0.207, rect = False)
yolov8s_pose [1,3,640,640] u8/u8 5.568 bbox
mAP50-90 = 0.733
mAP50 = 0.925
mAP75 = 0.818
keypoints
mAP50-90 = 0.605
mAP50 = 0.857
mAP75 = 0.666
bbox
mAP50-90 = 0.734
mAP50 = 0.925
mAP75 = 0.819
keypoints
mAP50-90 = 0.604
mAP50 = 0.859
mAP75 = 0.669
dataset(coco val2017, 2346 images)
yolov8s_pose(v8.0.207, rect = False)
+ + +### Demo示例 + +|[eye gaze](https://developer.canaan-creative.com/devAdmin/model/download?mid=be978f1f38b8aa2f2b649185a10c2e9c&filePath=/upload/model/official/k230/yolop_lane_seg/yolop_lane_seg.zip) | [space_resize](https://developer.canaan-creative.com/devAdmin/model/download?mid=7d48cb68a499dd54daf0ced14549b142&filePath=/upload/model/official/k230/space_resize/space_resize.zip) | [face pose](https://developer.canaan-creative.com/devAdmin/model/download?mid=5b87c02b969a9e60d48b08e357c20e31&filePath=/upload/model/official/k230/face_pose/face_pose.zip) | +|---|---|---| +|gif | gif| | + +--- + +## K210/K510 + +- [使用说明](https://github.com/kendryte/nncase/blob/release/1.0/docs/USAGE_ZH.md) +- [常见问题](https://github.com/kendryte/nncase/blob/release/1.0/docs/FAQ_ZH.md) +- [示例程序](https://github.com/kendryte/nncase/blob/release/1.0/examples/user_guide/) + +### 支持的算子 + +- [TFLite ops](https://github.com/kendryte/nncase/blob/release/1.0/docs/tflite_ops.md) +- [Caffe ops](https://github.com/kendryte/nncase/blob/release/1.0/docs/caffe_ops.md) +- [ONNX ops](https://github.com/kendryte/nncase/blob/release/1.0/docs/onnx_ops.md) + +--- + +## 特性 + +- 支持多输入输出网络,支持多分支结构 +- 静态内存分配,不需要堆内存 +- 算子合并和优化 +- 支持 float 和量化 uint8 推理 +- 支持训练后量化,使用浮点模型和量化校准集 +- 平坦模型,支持零拷贝加载 + +--- + +## 架构 + +
+nncase arch +
+ +--- + +## 源码编译 + +**推荐直接通过`pip`安装nncase来使用,目前K510、K230芯片相关的源码并未开源,因此无法直接通过编译源码来使用`nncase-k510`和`nncase-kpu`(K230)。** + +如果你的模型中存在`nncase`尚未支持的算子,可以在issue中提出需求,或者自己实现并提交PR。后续版本将会进行集成,或者联系我们提供临时版本。 +以下为编译 `nncase` 的步骤 + +```shell +git clone https://github.com/kendryte/nncase.git +cd nncase +mkdir build && cd build + +# 使用Ninja编译 +cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./install +ninja && ninja install + +# 使用make编译 +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./install +make && make install +``` + +--- + +## 资源 + +### 嘉楠开发者社区 + +[嘉楠开发者社区](https://developer.canaan-creative.com/resource)中包含所有K210、K510、K230相关的资源,包括: +- 资料下载 --> 三款芯片对应的开发板可使用的预编译镜像。 +- 文档 --> 三款芯片及不同版本对应的文档。 +- 模型库 --> K210、K230上可运行的应用于工业、安防、教育等场景的示例以及代码。 +- 模型训练 --> 针对K210、K230的模型训练平台,支持多种场景的训练。 + +### Bilibili +- [嘉楠 AI教程及应用演示](https://space.bilibili.com/677429436) + +### K210相关仓库 + +- [K210_Yolo_framework](https://github.com/zhen8838/K210_Yolo_framework) +- [Shts!'s Blog (Japanese)](https://www.shtsno24.tokyo/2020/03/nncase-v020.html) +- [示例脚本](https://github.com/kendryte/canmv_examples/tree/main/01-K210) + +### K230相关仓库 + +- C: [K230_SDK](https://github.com/kendryte/k230_sdk) + - [文档](https://github.com/kendryte/k230_docs) + - [K230端到端全流程教程](https://github.com/kendryte/K230_training_scripts) +- MicroPython: [Canmv_k230](https://github.com/kendryte/k230_canmv) + - [文档](https://github.com/kendryte/k230_canmv_docs) + - [示例脚本](https://github.com/kendryte/canmv_examples/tree/main/02-K230) \ No newline at end of file From dbcde6f2285edb70599b1669123e0e3868ebe1b6 Mon Sep 17 00:00:00 2001 From: huochenghai Date: Mon, 11 Mar 2024 16:02:07 +0800 Subject: [PATCH 4/6] Feature/egraph extract constrains (#1175) * add egraph-extract-constrains * reorder SwapBinaryArgs --- src/Nncase.Compiler/Compiler.cs | 2 +- src/Nncase.Core/TIR/TIRUtilities.cs | 17 ++ src/Nncase.Core/Utilities/ShapeExprUtility.cs | 1 - .../CostModel/EGraphCostPrinter.cs | 47 +++- src/Nncase.EGraph/Passes/EGraphExtensions.cs | 50 +++++ .../Passes/EGraphExtractExtensions.cs | 95 --------- .../SatExtractor.cs => EGraphExtractor.cs} | 17 +- .../Passes/EGraphExtractors/Extractor.cs | 200 ------------------ src/Nncase.EGraph/Passes/RewriteProvider.cs | 2 +- .../BufferSchedule/BufferScheduleTypes.cs | 46 ++-- .../BufferSchedule/BufferScheduler.cs | 118 +++++------ .../BufferSchedule/LifeTimeCollector.cs | 73 ++++--- src/Nncase.Passes/DDrBufferSchdeulePass.cs | 3 +- src/Nncase.Passes/EGraphExtractPass.cs | 2 +- .../CostModel/UnitTestEGraphCostModel.cs | 4 +- 15 files changed, 233 insertions(+), 444 deletions(-) create mode 100644 src/Nncase.EGraph/Passes/EGraphExtensions.cs delete mode 100644 src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs rename src/Nncase.EGraph/Passes/{EGraphExtractors/SatExtractor.cs => EGraphExtractor.cs} (94%) delete mode 100644 src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs diff --git a/src/Nncase.Compiler/Compiler.cs b/src/Nncase.Compiler/Compiler.cs index 3d83a6b0b..c21b7247d 100644 --- a/src/Nncase.Compiler/Compiler.cs +++ b/src/Nncase.Compiler/Compiler.cs @@ -100,7 +100,6 @@ public void TargetIndependentPass(IPassManager passManager) p.Add(); p.Add(); p.Add(); - p.Add(); p.Add(); p.Add(); p.Add(); @@ -141,6 +140,7 @@ public void TargetIndependentPass(IPassManager passManager) p.Add(); p.Add(); p.Add(); + p.Add(); p.Add(); }); diff --git a/src/Nncase.Core/TIR/TIRUtilities.cs b/src/Nncase.Core/TIR/TIRUtilities.cs index 6a1142e71..6dcad9ad1 100644 --- a/src/Nncase.Core/TIR/TIRUtilities.cs +++ b/src/Nncase.Core/TIR/TIRUtilities.cs @@ -71,4 +71,21 @@ public static class TIRUtilities IR.F.Math.Max(0, t.First.Start), IR.F.Math.Min(t.Second.FixedValue, t.First.Stop), t.First.Step)).ToArray(); + + public static bool TryGetFixedRegions(TIR.BufferRegion region, out (int Start, int Stop, int Step)[] slice) + { + slice = new (int Start, int Stop, int Step)[region.Region.Length]; + for (int i = 0; i < region.Region.Length; i++) + { + var rg = region.Region[i]; + if (rg is not Range { Start: IR.TensorConst start, Stop: IR.TensorConst stop, Step: IR.TensorConst step }) + { + return false; + } + + slice[i] = (start.Value.ToScalar(), stop.Value.ToScalar(), step.Value.ToScalar()); + } + + return true; + } } diff --git a/src/Nncase.Core/Utilities/ShapeExprUtility.cs b/src/Nncase.Core/Utilities/ShapeExprUtility.cs index c1da04dca..9c73513cf 100644 --- a/src/Nncase.Core/Utilities/ShapeExprUtility.cs +++ b/src/Nncase.Core/Utilities/ShapeExprUtility.cs @@ -1,7 +1,6 @@ // Copyright (c) Canaan Inc. All rights reserved. // Licensed under the Apache license. See LICENSE file in the project root for full license information. -using GiGraph.Dot.Output.Writers.Edges; using Nncase.Diagnostics; using Nncase.IR; using Nncase.IR.Tensors; diff --git a/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs b/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs index c8f3bd5c3..ac2d1c1ca 100644 --- a/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs +++ b/src/Nncase.EGraph/CostModel/EGraphCostPrinter.cs @@ -32,6 +32,25 @@ internal static DotGraph DumpEgraphAsDot(IEGraph eGraph, CostModel.EGraphCostMod return printer.SaveToStream(file); } + /// + /// find the minCostEnode in eclass. + /// + /// the marker first. + /// + /// + internal static ENode MinByWithMarker(EClass eClass, CostModel.EGraphCostModel costModel) + { + return eClass.Nodes.OrderBy(e => e.Expr, ENodeTypeComparer.Instance).MinBy(x => x.Expr is Marker ? CostModel.Cost.Zero : costModel[x])!; + } + + /// + /// find the minCostEnode in eclass skip marker. + /// + internal static ENode MinByWithOutMarker(EClass eClass, CostModel.EGraphCostModel costModel) + { + return eClass.Nodes.Where(e => e.Expr is not Marker).MinBy(x => costModel[x])!; + } + private DotGraph AttachEGraphCost(CostModel.EGraphCostModel costModel, EClass entry) { // 1. display each enode costs. @@ -72,12 +91,12 @@ void Dfs(EClass curclass) continue; } - var minCostEnode = parent.MinByWithMarker(costModel); + var minCostEnode = MinByWithMarker(parent, costModel); // when this marker ecalss has been visited, skip it. if (markerEclassMemo.Contains(parent)) { - minCostEnode = parent.MinByWithOutMarker(costModel); + minCostEnode = MinByWithOutMarker(parent, costModel); } var (minCostDotnode, table) = NodesMap[minCostEnode]; @@ -93,7 +112,7 @@ void Dfs(EClass curclass) if (minCostEnode.Expr is Marker && child == parent) { markerEclassMemo.Add(child); - var otherminCostENode = child.MinByWithOutMarker(costModel); + var otherminCostENode = MinByWithOutMarker(child, costModel); var (childDotNode, _) = NodesMap[otherminCostENode]; _dotGraph.Edges.Add(childDotNode, minCostDotnode, edge => { @@ -103,7 +122,7 @@ void Dfs(EClass curclass) } else { - var childEnode = child.Find().MinByWithMarker(costModel); + var childEnode = MinByWithMarker(child.Find(), costModel); var (childDotNode, _) = NodesMap[childEnode]; _dotGraph.Edges.Add(childDotNode, minCostDotnode, edge => { @@ -126,3 +145,23 @@ void Dfs(EClass curclass) return _dotGraph; } } + +internal sealed class ENodeTypeComparer : IComparer +{ + public static readonly ENodeTypeComparer Instance = new(); + + public int Compare(Expr? x, Expr? y) => (x, y) switch + { + (null, null) => 0, + (Expr, null) => 1, + (null, Expr) => -1, + (Expr, Expr) => GetPriority(x).CompareTo(GetPriority(y)), + }; + + private int GetPriority(Expr x) => x switch + { + Marker => 0, + Const => 1, + _ => 2, + }; +} diff --git a/src/Nncase.EGraph/Passes/EGraphExtensions.cs b/src/Nncase.EGraph/Passes/EGraphExtensions.cs new file mode 100644 index 000000000..5a349cec4 --- /dev/null +++ b/src/Nncase.EGraph/Passes/EGraphExtensions.cs @@ -0,0 +1,50 @@ +// Copyright (c) Canaan Inc. All rights reserved. +// Licensed under the Apache license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Google.OrTools.Sat; +using Nncase.CostModel; +using Nncase.Diagnostics; +using Nncase.IR; +using Nncase.PatternMatch; +using static Nncase.PatternMatch.F.Math; +using static Nncase.PatternMatch.Utility; + +namespace Nncase.Passes; + +/// +/// EGraph extract extensions. +/// +public static class EGraphExtensions +{ + /// + /// Extract egraph. + /// + /// egraph. + /// Root eclass. + /// base func cost evaluator. + /// the cp model constrains. + public static Expr Extract(this IEGraph eGraph, EClass root, Evaluator.IBaseFuncCostEvaluator? basefunc_cost_evaluator, EGraphExtractConstrains[] constrains) + { + // 1. set enode expr with more accuracy type. + foreach (var eclass in eGraph.Classes) + { + foreach (var nodes in eclass.Nodes) + { + if (eclass.CheckedType.CompareTo(nodes.Expr.CheckedType) > 0) + { + nodes.Expr.CheckedType = eclass.CheckedType; + } + } + } + + // 2. start the cost evaluator + var costModel = new CostModel.EGraphCostEvaluator(root.Find(), basefunc_cost_evaluator, false).Evaluate(); + + return new EGraphExtractor(costModel).Extract(root.Find(), eGraph, constrains); + } +} diff --git a/src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs b/src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs deleted file mode 100644 index 7c0cfbdc2..000000000 --- a/src/Nncase.EGraph/Passes/EGraphExtractExtensions.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) Canaan Inc. All rights reserved. -// Licensed under the Apache license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Nncase.CostModel; -using Nncase.Diagnostics; -using Nncase.IR; -using Nncase.PatternMatch; -using static Nncase.PatternMatch.F.Math; -using static Nncase.PatternMatch.Utility; - -namespace Nncase.Passes; - -/// -/// EGraph extract extensions. -/// -public static class EGraphExtractExtensions -{ - /// - /// Extract egraph. - /// - /// eGraph. - /// Root eclass. - /// base func cost evaluator. - /// the picks. - /// Extracted root expression. - public static Expr Extract(this IEGraph eGraph, EClass root, Evaluator.IBaseFuncCostEvaluator? basefunc_cost_evaluator, out IReadOnlyDictionary picks) - { - // 1. set enode expr with more accuracy type. - foreach (var eclass in eGraph.Classes) - { - foreach (var nodes in eclass.Nodes) - { - if (eclass.CheckedType.CompareTo(nodes.Expr.CheckedType) > 0) - { - nodes.Expr.CheckedType = eclass.CheckedType; - } - } - } - - // 2. start the cost evaluator - var costModel = new EGraphCostEvaluator(root.Find(), basefunc_cost_evaluator, false).Evaluate(); - - // if (DumpScope.Current.IsEnabled(DumpFlags.EGraphCost)) - // { - // using var fs = DumpScope.Current.OpenFile(Path.Combine("Costs", $"V{eGraph.Version}.dot")); - // EGraphPrinter.DumpEgraphAsDot(eGraph, costModel, root.Find(), fs); - // } - // return new EGraphExtractor(costModel).Extract(root.Find(), eGraph); - return new EGraphExtractors.SatExtractor(costModel).Extract(root.Find(), eGraph, out picks); - } - - /// - /// find the minCostEnode in eclass. - /// - /// the marker first. - /// - /// - internal static ENode MinByWithMarker(this EClass eClass, CostModel.EGraphCostModel costModel) - { - return eClass.Nodes.OrderBy(e => e.Expr, ENodeTypeComparer.Instance).MinBy(x => x.Expr is Marker ? Cost.Zero : costModel[x])!; - } - - /// - /// find the minCostEnode in eclass skip marker. - /// - internal static ENode MinByWithOutMarker(this EClass eClass, CostModel.EGraphCostModel costModel) - { - return eClass.Nodes.Where(e => e.Expr is not Marker).MinBy(x => costModel[x])!; - } - - internal sealed class ENodeTypeComparer : IComparer - { - public static readonly ENodeTypeComparer Instance = new(); - - public int Compare(Expr? x, Expr? y) => (x, y) switch - { - (null, null) => 0, - (Expr, null) => 1, - (null, Expr) => -1, - (Expr, Expr) => GetPriority(x).CompareTo(GetPriority(y)), - }; - - private int GetPriority(Expr x) => x switch - { - Marker => 0, - Const => 1, - _ => 2, - }; - } -} diff --git a/src/Nncase.EGraph/Passes/EGraphExtractors/SatExtractor.cs b/src/Nncase.EGraph/Passes/EGraphExtractor.cs similarity index 94% rename from src/Nncase.EGraph/Passes/EGraphExtractors/SatExtractor.cs rename to src/Nncase.EGraph/Passes/EGraphExtractor.cs index fab2fc05e..c7eba4570 100644 --- a/src/Nncase.EGraph/Passes/EGraphExtractors/SatExtractor.cs +++ b/src/Nncase.EGraph/Passes/EGraphExtractor.cs @@ -11,18 +11,20 @@ using Nncase.Diagnostics; using Nncase.IR; -namespace Nncase.Passes.EGraphExtractors; +namespace Nncase.Passes; -internal class SatExtractor : IExtractor +public delegate void EGraphExtractConstrains(CpModel model, IReadOnlyDictionary vars); + +internal class EGraphExtractor { private readonly EGraphCostModel _costModel; - public SatExtractor(EGraphCostModel costModel) + public EGraphExtractor(EGraphCostModel costModel) { _costModel = costModel; } - public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary picks) + public Expr Extract(EClass root, IEGraph eGraph, EGraphExtractConstrains[] constrains) { var cpmodel = new CpModel(); @@ -68,6 +70,11 @@ public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary vars[n]), eGraph.Nodes.Select(n => checked((long)_costModel[n].Score)))); @@ -121,7 +128,7 @@ public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary e, e => solver.BooleanValue(vars[e])); + var picks = eGraph.Nodes.ToDictionary(e => e, e => solver.BooleanValue(vars[e])); using (var dumpStream = enableDump ? DumpScope.Current.OpenFile("Costs/Pick.dot") : Stream.Null) { EGraphPrinter.DumpEgraphAsDot(eGraph, _costModel, picks, root.Find(), dumpStream); diff --git a/src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs b/src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs deleted file mode 100644 index fcf2abd72..000000000 --- a/src/Nncase.EGraph/Passes/EGraphExtractors/Extractor.cs +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright (c) Canaan Inc. All rights reserved. -// Licensed under the Apache license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Nncase.CostModel; -using Nncase.Diagnostics; -using Nncase.IR; -using Nncase.PatternMatch; -using static Nncase.PatternMatch.F.Math; -using static Nncase.PatternMatch.Utility; - -namespace Nncase.Passes.EGraphExtractors; - -internal interface IExtractor -{ - Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary picks); -} - -internal class Extractor : IExtractor -{ - private readonly EGraphCostModel _costModel; - private readonly Dictionary _eclassMemo = new(); - private readonly Dictionary _markerEclassMemo = new(); - private readonly Dictionary _picks = new(); - private StreamWriter? _dumpWriter; - - public Extractor(EGraphCostModel costModel) - { - _costModel = costModel; - } - - public Expr Extract(EClass root, IEGraph eGraph, out IReadOnlyDictionary picks) - { - _dumpWriter = DumpScope.Current.IsEnabled(DumpFlags.EGraphCost) - ? new StreamWriter(DumpScope.Current.OpenFile($"{nameof(Extractor)}_Class_{root.Id}.txt")) - : null; - try - { - Visit(root); - } - finally - { - _dumpWriter?.Dispose(); - } - - foreach (var enode in eGraph.Nodes) - { - if (!_picks.ContainsKey(enode)) - { - _picks[enode] = false; - } - } - - picks = _picks; - return _eclassMemo[root]; - } - - private void Visit(EClass eclass) - { - var stack = new Stack<(EClass, ENode)>(); - stack.Push((eclass, eclass.MinByWithMarker(_costModel))); - var markerEclassSet = new HashSet(); - while (stack.Any()) - { - (eclass, var minCostEnode) = stack.Peek(); - if (_eclassMemo.ContainsKey(eclass)) - { - stack.Pop(); - continue; - } - - Expr? expr = null; - switch (minCostEnode.Expr) - { - case Var or TensorConst or TupleConst or Op or Fusion or None: - expr = minCostEnode.Expr; - break; - case Function or Call or IR.Tuple or Marker or IR.If: - var childrenExprs = new List(); - foreach (var child in minCostEnode.Children) - { - if (!_eclassMemo.TryGetValue(child, out var childExpr)) - { - if (minCostEnode.Expr is Marker && child == eclass) - { - if (!_markerEclassMemo.TryGetValue(eclass, out var markerInputExpr)) - { - markerEclassSet.Add(eclass); - stack.Push((eclass, eclass.MinByWithOutMarker(_costModel))); - } - else - { - childrenExprs.Add(markerInputExpr); - } - } - else - { - stack.Push((child, child.MinByWithMarker(_costModel))); - } - } - else - { - childrenExprs.Add(childExpr); - } - } - - if (childrenExprs.Count != minCostEnode.Children.Count) - { - break; - } - - expr = minCostEnode.Expr switch - { - Function function => Visit(minCostEnode, function, new(childrenExprs)), - Call call => Visit(minCostEnode, call, new(childrenExprs)), - IR.Tuple tuple => Visit(minCostEnode, tuple, new(childrenExprs)), - Marker marker => Visit(minCostEnode, marker, new(childrenExprs)), - IR.If @if => Visit(minCostEnode, @if, new(childrenExprs)), - _ => throw new ArgumentException("Unsupported expression type."), - }; - - break; - default: - throw new ArgumentException("Unsupported expression type."); - } - - if (expr is null) - { - continue; - } - - if (markerEclassSet.Contains(eclass) && minCostEnode.Expr is not Marker) - { - _markerEclassMemo.Add(eclass, expr); - } - else - { - _eclassMemo.Add(eclass, expr); - } - - _picks[minCostEnode] = true; - stack.Pop(); - } - } - - private Marker Visit(ENode enode, Marker marker, IRArray children) - { - var target = children[0]; - var attr = children[1]; - return marker.With(target: target, attribute: attr); - } - - private Function Visit(ENode enode, Function func, IRArray children) - { - if (children.Count == 0) - { - return func; - } - - var body = children[0]; - return func.With(body: body); - } - - private IR.Tuple Visit(ENode enode, IR.Tuple tuple, IRArray children) - { - return tuple.With(fields: children.ToArray()); - } - - private IR.If Visit(ENode enode, IR.If @if, IRArray children) - { - return @if.With(condition: children[^3], then: children[^2], @else: children[^1], paramList: children[..^3].ToArray()); - } - - private Call Visit(ENode enode, Call call, IRArray children) - { - var target = children[0]; - var arguments = children.Skip(1); - - // for mix quant debug. - if (call.EnodeQuantConfigWithCosine != null && _dumpWriter != null) - { - _dumpWriter.WriteLine(call + " " + call.CheckedType); - for (int i = 0; i < call.EnodeQuantConfigWithCosine.Count; i++) - { - for (int j = 0; j < call.EnodeQuantConfigWithCosine[i].Item1.Count; j++) - { - _dumpWriter.Write(call.EnodeQuantConfigWithCosine[i].Item1[j] + " "); - } - - _dumpWriter.WriteLine(call.EnodeQuantConfigWithCosine[i].Item3); - } - } - - return call.With(target: target, arguments: arguments.ToArray(), call.Metadata); - } -} diff --git a/src/Nncase.EGraph/Passes/RewriteProvider.cs b/src/Nncase.EGraph/Passes/RewriteProvider.cs index 07d3416ed..ad64c2207 100644 --- a/src/Nncase.EGraph/Passes/RewriteProvider.cs +++ b/src/Nncase.EGraph/Passes/RewriteProvider.cs @@ -36,7 +36,7 @@ public Expr ERewrite(Expr expr, IEnumerable rules, RunPassContext var graph = new EGraph(expr); ERewrite(graph, rules, options); - var post = graph.Extract(graph.Root!, null, out _); + var post = graph.Extract(graph.Root!, null, Array.Empty()); return post; } diff --git a/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs b/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs index 13e8ab86f..3b76f1673 100644 --- a/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs +++ b/src/Nncase.Passes/BufferSchedule/BufferScheduleTypes.cs @@ -3,54 +3,34 @@ namespace Nncase.Passes.BufferSchedule; -internal sealed class TimeInterval +public sealed class Interval { - public TimeInterval(int start, int end) - { - Brith = start; - Death = end; - } - - public int Brith { get; set; } - - public int Death { get; set; } - - public int Size => Death - Brith; - - public override string ToString() - { - return $"TimeInterval({Brith}, {Death})"; - } -} - -internal sealed class MemSpan -{ - public MemSpan(int start, int end) + public Interval(int start, int end) { Start = start; - End = end; + Stop = end; } public int Start { get; set; } - public int End { get; set; } + public int Stop { get; set; } - public int Size => End - Start; + public int Size => Stop - Start; public override string ToString() { - return $"MemSpan({Start}, {End})"; + return $"Interval({Start}, {Stop})"; } } -internal class ScheduleBuffer +public class ScheduleBuffer { - public ScheduleBuffer(string name, int number, TimeInterval interval, MemSpan span, int[] shape, int[] strides, bool inplace) + public ScheduleBuffer(string name, int number, Interval timeInterval, Interval memInterval, int[] shape, int[] strides, bool inplace) { Name = name; Number = number; - Interval = interval; - Span = span; + TimeInterval = timeInterval; + MemInterval = memInterval; Shape = shape; Strides = strides; Inplace = inplace; @@ -60,9 +40,9 @@ public ScheduleBuffer(string name, int number, TimeInterval interval, MemSpan sp public int Number { get; } - public TimeInterval Interval { get; } + public Interval TimeInterval { get; } - public MemSpan Span { get; } + public Interval MemInterval { get; } public int[] Shape { get; } @@ -72,6 +52,6 @@ public ScheduleBuffer(string name, int number, TimeInterval interval, MemSpan sp public override string ToString() { - return $"ScheduledBuffer('{Name}', {Number}, {Interval}, {Span}, ConstraintsMode.No, [{string.Join(",", Shape)}], [{string.Join(",", Strides)}], {Inplace})"; + return $"ScheduledBuffer('{Name}', {Number}, {TimeInterval}, {MemInterval}, ConstraintsMode.No, [{string.Join(",", Shape)}], [{string.Join(",", Strides)}], {Inplace})"; } } diff --git a/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs b/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs index 25f7d6f5b..8d02aff4e 100644 --- a/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs +++ b/src/Nncase.Passes/BufferSchedule/BufferScheduler.cs @@ -13,12 +13,42 @@ namespace Nncase.Passes.BufferSchedule; -internal sealed class BufferScheduler +public class BufferScheduler { - public IReadOnlyDictionary CollectLifeTime(Function func) + public virtual void ExternalConstrains(CpModel model, IReadOnlyDictionary bufferMap, IReadOnlyDictionary boxs) { - var c = new LifeTimeCollector(); - return c.Collect(func); + foreach (var (expr, item) in bufferMap) + { + if (expr is Call { Target: IR.Tensors.Concat } concatCall && concatCall.Arguments[0] is IR.Tuple tuple) + { + // the concat inputs must contiguous + int offset = 0; + for (int i = 0; i < tuple.Fields.Length; i++) + { + model.Add((boxs[concatCall].Y.StartExpr() + offset) == boxs[tuple.Fields[i]].Y.StartExpr()); + offset += bufferMap[tuple.Fields[i]].MemInterval.Size; + } + } + else if (expr is Call { Target: IR.Tensors.Split } splitCall) + { + // the split must equal with input. + model.Add(boxs[splitCall].Y.StartExpr() == boxs[splitCall.Arguments[0]].Y.StartExpr()); + + // the split outputs must contiguous + var users = splitCall.GetUsers(); + int offset = 0; + foreach (var user in users.OrderBy(e => ((Call)e).Arguments[1].Evaluate().AsTensor().ToScalar())) + { + model.Add((boxs[splitCall].Y.StartExpr() + offset) == boxs[user].Y.StartExpr()); + offset += bufferMap[user].MemInterval.Size; + } + } + else if (expr is Call { Target: IR.Tensors.Reshape } reshapCall) + { + // the reshape must equal with it's input. + model.Add(boxs[reshapCall].Y.StartExpr() == boxs[reshapCall.Arguments[0]].Y.StartExpr()); + } + } } public void Schedule(IReadOnlyDictionary bufferMap) @@ -30,21 +60,21 @@ public void Schedule(IReadOnlyDictionary bufferMap) var yStarts = new List(); foreach (var (expr, item) in bufferMap) { - var xInterval = model.NewIntervalVar(model.NewConstant(item.Interval.Brith), model.NewConstant(item.Interval.Size), model.NewConstant(item.Interval.Death), item.Name + $"{item.Number}_x"); + var xInterval = model.NewIntervalVar(model.NewConstant(item.TimeInterval.Start), model.NewConstant(item.TimeInterval.Size), model.NewConstant(item.TimeInterval.Stop), item.Name + $"{item.Number}_x"); - var upbound = 2147483648 - item.Span.End; + var upbound = 2147483648 - item.MemInterval.Stop; if (upbound <= 0) { throw new System.NotSupportedException(); } var memStartVar = model.NewIntVar(0, upbound, $"{item.Name}_{item.Number}_y_start"); - var yInterval = model.NewFixedSizeIntervalVar(memStartVar, item.Span.End, $"{item.Name}_{item.Number}_y"); + var yInterval = model.NewFixedSizeIntervalVar(memStartVar, item.MemInterval.Stop, $"{item.Name}_{item.Number}_y"); noOverlap.AddRectangle(xInterval, yInterval); yStarts.Add(memStartVar); boxs.Add(expr, (xInterval, yInterval)); - for (int time = item.Interval.Brith; time < item.Interval.Death; time++) + for (int time = item.TimeInterval.Start; time < item.TimeInterval.Stop; time++) { if (!timeMap.TryGetValue(time, out var timelist)) { @@ -56,38 +86,7 @@ public void Schedule(IReadOnlyDictionary bufferMap) } } - foreach (var (expr, item) in bufferMap) - { - if (expr is Call { Target: IR.Tensors.Concat } concatCall && concatCall.Arguments[0] is IR.Tuple tuple) - { - // the concat inputs must contiguous - int offset = 0; - for (int i = 0; i < tuple.Fields.Length; i++) - { - model.Add((boxs[concatCall].Y.StartExpr() + offset) == boxs[tuple.Fields[i]].Y.StartExpr()); - offset += bufferMap[tuple.Fields[i]].Span.Size; - } - } - else if (expr is Call { Target: IR.Tensors.Split } splitCall) - { - // the split must equal with input. - model.Add(boxs[splitCall].Y.StartExpr() == boxs[splitCall.Arguments[0]].Y.StartExpr()); - - // the split outputs must contiguous - var users = splitCall.GetUsers(); - int offset = 0; - foreach (var user in users.OrderBy(e => ((Call)e).Arguments[1].Evaluate().AsTensor().ToScalar())) - { - model.Add((boxs[splitCall].Y.StartExpr() + offset) == boxs[user].Y.StartExpr()); - offset += bufferMap[user].Span.Size; - } - } - else if (expr is Call { Target: IR.Tensors.Reshape } reshapCall) - { - // the reshape must equal with it's input. - model.Add(boxs[reshapCall].Y.StartExpr() == boxs[reshapCall.Arguments[0]].Y.StartExpr()); - } - } + ExternalConstrains(model, bufferMap, boxs); model.Minimize(LinearExpr.Sum(yStarts)); @@ -99,10 +98,10 @@ public void Schedule(IReadOnlyDictionary bufferMap) throw new System.NotSupportedException(); } - foreach (var (k, v) in bufferMap) + foreach (var (k, _) in bufferMap) { - bufferMap[k].Span.Start = checked((int)solver.Value(boxs[k].Y.StartExpr())); - bufferMap[k].Span.End = checked((int)solver.Value(boxs[k].Y.EndExpr())); + bufferMap[k].MemInterval.Start = checked((int)solver.Value(boxs[k].Y.StartExpr())); + bufferMap[k].MemInterval.Stop = checked((int)solver.Value(boxs[k].Y.EndExpr())); } } @@ -119,18 +118,11 @@ from enum import Enum from typing import List @dataclass -class TimeInterval(): +class Interval(): start: int end: int def __str__(self) -> str: - return f'(start: {self.start}, end {self.end})' - -@dataclass -class MemSpan(): - depth_start: int - depth_end: int - def __str__(self) -> str: - return f'(start: {self.depth_start}, size {self.depth_end - self.depth_start})' + return f'(start: {self.start}, end {self.end}, size {self.end - self.start})' class ConstraintsMode(Enum): No = 0 @@ -140,8 +132,8 @@ class ConstraintsMode(Enum): class ScheduledBuffer(): name: str number: int - interval: TimeInterval - location: MemSpan + time_interval: Interval + mem_interval: Interval constraints: ConstraintsMode shape: List[int] stride: List[int] @@ -166,8 +158,8 @@ class ScheduledBuffer(): 'height': [], 'alpha': [], 'color': [], - 'location': [], - 'interval': [], + 'mem_interval': [], + 'time_interval': [], 'shape': [], 'stride': [], } @@ -177,10 +169,10 @@ class ScheduledBuffer(): color_dict = {} for buffer in buffers: source['name'].append(buffer.name) - width = buffer.interval.end - buffer.interval.start - x = buffer.interval.start + (width / 2) - height = buffer.location.depth_end - buffer.location.depth_start - y = buffer.location.depth_start + (height / 2) + width = buffer.time_interval.end - buffer.time_interval.start + x = buffer.time_interval.start + (width / 2) + height = buffer.mem_interval.end - buffer.mem_interval.start + y = buffer.mem_interval.start + (height / 2) y_range_max = max(y_range_max, y) x_range_max = max(x_range_max, buffer.interval.end) source['x'].append(x) @@ -193,13 +185,13 @@ class ScheduledBuffer(): color_dict[buffer.name] = color source['color'].append(color) source['alpha'].append(0.2 if buffer.inplace else 1.0) - source['interval'].append(str(buffer.interval)) - source['location'].append(str(buffer.location)) + source['time_interval'].append(str(buffer.time_interval)) + source['mem_interval'].append(str(buffer.mem_interval)) source['shape'].append(','.join([str(s) for s in buffer.shape])) source['stride'].append(','.join([str(s) for s in buffer.stride])) source = ColumnDataSource(source) -hover = HoverTool(tooltips=[('name', '@name'), ('interval', '@interval'), ('location', '@location'), +hover = HoverTool(tooltips=[('name', '@name'), ('time_interval', '@time_interval'), ('mem_interval', '@mem_interval'), ('shape', '@shape'), ('stride', '@stride')]) p = figure(tools=[hover, WheelPanTool(), SaveTool(), WheelZoomTool(), ResetTool()], width=1280, height=720, diff --git a/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs b/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs index 1edcc263d..938317762 100644 --- a/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs +++ b/src/Nncase.Passes/BufferSchedule/LifeTimeCollector.cs @@ -10,16 +10,16 @@ namespace Nncase.Passes.BufferSchedule; -internal sealed class LifeTimeCollector : ExprVisitor +public class LifeTimeCollector : ExprVisitor { public int TimeStamp { get; private set; } - public Dictionary LifenessMap { get; } = new(ReferenceEqualityComparer.Instance); + public Dictionary LifenessMap { get; } = new(ReferenceEqualityComparer.Instance); - public IReadOnlyDictionary Collect(Function entry) + public IReadOnlyDictionary Collect(Expr expr) { - Visit(entry.Body); - Update(entry.Body); // avoid final call time interval size == 1. + Visit(expr); + Update(expr); // avoid final call time interval size == 1. Alias(); var d = new Dictionary(ReferenceEqualityComparer.Instance); @@ -32,8 +32,7 @@ public IReadOnlyDictionary Collect(Function entry) Var va => va.Name, _ => k.GetType().Name, }; - var size = GetSize(k.CheckedType, out var shape, out var stride); - + var size = ComputeBufferSize(k.CheckedType, out var shape, out var stride); d.Add(k, new(name, count++, v, new(0, size), shape, stride, false)); } @@ -62,6 +61,29 @@ protected override Unit VisitLeafCall(Call expr) return Unit.Default; } + protected virtual int ComputeBufferSize(IRType type, out int[] shape, out int[] stride) + { + shape = Array.Empty(); + stride = Array.Empty(); + var size = 0; + if (type is TensorType tensorType) + { + shape = tensorType.Shape.ToValueArray(); + stride = TensorUtilities.GetStrides(shape); + size = TensorUtilities.GetSize(shape, stride, tensorType.DType.SizeInBytes); + } + else if (type is TupleType tupleType) + { + size = 0; + foreach (var item in tupleType) + { + size += ComputeBufferSize(item, out _, out _); + } + } + + return size; + } + private void Update(Expr expr) { if (expr is Const or None) @@ -85,7 +107,7 @@ private void Update(Expr expr) } else { - interval.Death = TimeStamp + 1; + interval.Stop = TimeStamp + 1; } LifenessMap[expr] = interval; @@ -123,12 +145,12 @@ private void Alias() } while (changed); } - private bool AliasTime(Call call, TimeInterval interval) + private bool AliasTime(Call call, Interval interval) { - var brith = call.GetArguments().Select(arg => LifenessMap[arg].Death).Concat(new[] { interval.Brith }).Max(); - var death = call.GetUsers().Select(usr => LifenessMap[usr].Brith).Concat(new[] { interval.Death }).Min(); + var brith = call.GetArguments().Select(arg => LifenessMap[arg].Stop).Concat(new[] { interval.Start }).Max(); + var death = call.GetUsers().Select(usr => LifenessMap[usr].Start).Concat(new[] { interval.Stop }).Min(); - if (brith == interval.Brith && death == interval.Death) + if (brith == interval.Start && death == interval.Stop) { return false; } @@ -138,31 +160,8 @@ private bool AliasTime(Call call, TimeInterval interval) throw new InvalidOperationException(); } - interval.Brith = brith; - interval.Death = death; + interval.Start = brith; + interval.Stop = death; return true; } - - private int GetSize(IRType type, out int[] shape, out int[] stride) - { - shape = Array.Empty(); - stride = Array.Empty(); - var size = 0; - if (type is TensorType tensorType) - { - shape = tensorType.Shape.ToValueArray(); - stride = TensorUtilities.GetStrides(shape); - size = TensorUtilities.GetSize(shape, stride, tensorType.DType.SizeInBytes); - } - else if (type is TupleType tupleType) - { - size = 0; - foreach (var item in tupleType) - { - size += GetSize(item, out _, out _); - } - } - - return size; - } } diff --git a/src/Nncase.Passes/DDrBufferSchdeulePass.cs b/src/Nncase.Passes/DDrBufferSchdeulePass.cs index 15a650568..2103b7b04 100644 --- a/src/Nncase.Passes/DDrBufferSchdeulePass.cs +++ b/src/Nncase.Passes/DDrBufferSchdeulePass.cs @@ -46,7 +46,8 @@ protected override async Task RunCoreAsync(IRModule module, RunPassCon if (module.Entry is Function { ModuleKind: Callable.StackVMModuleKind, Body: Expr body } func && IsFixedType(body.CheckedType)) { var sch = new BufferSchedule.BufferScheduler(); - var buffers = sch.CollectLifeTime(func); + var c = new BufferSchedule.LifeTimeCollector(); + var buffers = c.Collect(func.Body); sch.Schedule(buffers); using (var fs = Diagnostics.DumpScope.Current.OpenFile("draw_buffers.py")) { diff --git a/src/Nncase.Passes/EGraphExtractPass.cs b/src/Nncase.Passes/EGraphExtractPass.cs index 2c2baa12b..ba028ea76 100644 --- a/src/Nncase.Passes/EGraphExtractPass.cs +++ b/src/Nncase.Passes/EGraphExtractPass.cs @@ -24,7 +24,7 @@ public EGraphExtractPass(IBaseFuncCostEvaluator? costEvaluator = null) protected override Task RunCoreAsync(IEGraph input, RunPassContext context) { - var post = (BaseFunction)input.Extract(input.Root!, _costEvaluator, out _); + var post = (BaseFunction)input.Extract(input.Root!, _costEvaluator, Array.Empty()); IRHelpers.DCE(post); return Task.FromResult(post); } diff --git a/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs b/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs index c14174bde..2fe2ba6d3 100644 --- a/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs +++ b/src/Nncase.Tests/CostModel/UnitTestEGraphCostModel.cs @@ -47,10 +47,10 @@ public void TestEGraphExtractMinBy() }, }; - Assert.IsType(list.OrderBy(e => e, EGraphExtractExtensions.ENodeTypeComparer.Instance).First()); + Assert.IsType(list.OrderBy(e => e, ENodeTypeComparer.Instance).First()); Assert.True(cost[b] < cost[c]); - Assert.IsType(list.OrderBy(e => e, EGraphExtractExtensions.ENodeTypeComparer.Instance).MinBy(e => cost[e])); + Assert.IsType(list.OrderBy(e => e, ENodeTypeComparer.Instance).MinBy(e => cost[e])); } } From a13d43d0f4bd450844c7163f347c9f29073a8ce7 Mon Sep 17 00:00:00 2001 From: Curio Yang <39184746+curioyang@users.noreply.github.com> Date: Wed, 13 Mar 2024 16:16:47 +0800 Subject: [PATCH 5/6] Feature/update docs (#1176) * update faq * update Homepage * update link * update gif link * update gif link * update FAQ * update FAQ --- README.md | 14 +++++++++----- docs/FAQ_EN.md | 13 +++++++++++++ docs/FAQ_ZH.md | 10 ++++++++++ docs/readme_ZH.md | 4 +++- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 33d7ae948..7ec32fbf7 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ Technical Discussion QQ Group: 790699378 . Answer: 人工智能 - [FAQ](./docs/FAQ_EN.md) - [Example](./examples/user_guide/k230_simulate-EN.ipynb) - [Colab run](https://colab.research.google.com/drive/1m8TTree096m5VHmq-Uc60gXyltVCgnRb?usp=sharing) -- [ *Version relationship between `nncase` and `K230_SDK`* ](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK_%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E.html#ai-sdkcanmvnncase) - +- [ *Version relationship between `nncase` and `K230_SDK`* ](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK_nncase%E7%89%88%E6%9C%AC%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB.html#k230sdknncase) +- [update nncase runtime library in SDK](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK%E6%9B%B4%E6%96%B0nncase%E8%BF%90%E8%A1%8C%E6%97%B6%E5%BA%93%E6%8C%87%E5%8D%97.html) ### Install @@ -42,6 +42,7 @@ Technical Discussion QQ Group: 790699378 . Answer: 人工智能 All version of `nncase` and `nncase-kpu` in [Release](https://github.com/kendryte/nncase/releases). + ### Supported operators - [TFLite ops](./docs/tflite_ops.md) @@ -140,16 +141,19 @@ make && make install ## Resources -### Kendryte developer community +### Canaan developer community + +[Canaan developer community](https://developer.canaan-creative.com/resource) contains all resources related to K210, K510, and K230. -[Kendryte developer community](https://developer.canaan-creative.com/resource) contains all resources related to K210, K510, and K230. - 资料下载 --> Pre-compiled images available for the development boards corresponding to the three chips. - 文档 --> Documents corresponding to the three chips. - 模型库 --> Examples and code for industrial, security, educational and other scenarios that can be run on the K210 and K230. - 模型训练 --> The model training platform for K210 and K230 supports the training of various scenarios. ### Bilibili -- [Kendryte AI tutorial and application demonstration](https://space.bilibili.com/677429436) + +- [Canaan AI tutorial and application demonstration](https://space.bilibili.com/677429436) + ### K210 related repo diff --git a/docs/FAQ_EN.md b/docs/FAQ_EN.md index c808d8728..10d477a62 100644 --- a/docs/FAQ_EN.md +++ b/docs/FAQ_EN.md @@ -29,6 +29,7 @@ A: Use `sudo gedit /proc/sys/fs/inotify/max_user_instances` to change 128 to a l ### 2.3 `RuntimeError: Failed to initialize hostfxr` A:Need to install dotnet-sdk-7.0. + - Linux: ```shell @@ -60,6 +61,7 @@ A: Need to install `nncase-kpu`. ### 3.1 When inferring, the error `nncase.simulator.k230.sc: not found` occurs. Or these situations: + - `"nncase.simulator.k230.sc: Permision denied."` - `"Input/output error."` @@ -87,3 +89,14 @@ A: Usually it is caused by memory allocation failure, you can do the following t - Check whether the generated `kmodel` exceeds the currently available system memory. - Check App for memory leaks. + +### 4.3 throw error when load model + +The exception `terminate: Invalid kmodel` is thrown when attempting to load a `kmodel` as bellow. + +```CPP +interp.load_model(ifs).expect("Invalid kmodel"); +``` + +A:The issue arises due to a mismatch between the nncase version used when compiling the kmodel and the current SDK version. Please refer to the [SDK-nncase Version Correspondence](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK_nncase%E7%89%88%E6%9C%AC%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB.html) for a lookup, and follow the [Update the nncase Runtime Library Guide](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK%E6%9B%B4%E6%96%B0nncase%E8%BF%90%E8%A1%8C%E6%97%B6%E5%BA%93%E6%8C%87%E5%8D%97.html) to resolve the problem. + diff --git a/docs/FAQ_ZH.md b/docs/FAQ_ZH.md index ca9a21e21..fb7888612 100644 --- a/docs/FAQ_ZH.md +++ b/docs/FAQ_ZH.md @@ -85,3 +85,13 @@ A:通常是因为内存分配失败导致的,可做如下排查。 - 检查生成的kmodel是否超过当前系统可用内存 - 检查App是否存在内存泄露 + +### 4.3 加载模型时抛出异常 + +加载`kmodel`代码如下时,抛出异常 `terminate:Invalid kmodel`。 + +```CPP +interp.load_model(ifs).expect("Invalid kmodel"); +``` + +A:是由于编译`kmodel`时的nncase版本与当前SDK版本不匹配导致,请按照[SDK、nncase版本对应关系](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK_nncase%E7%89%88%E6%9C%AC%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB.html)查询,并按照[更新nncase运行时库教程](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK%E6%9B%B4%E6%96%B0nncase%E8%BF%90%E8%A1%8C%E6%97%B6%E5%BA%93%E6%8C%87%E5%8D%97.html)解决。 \ No newline at end of file diff --git a/docs/readme_ZH.md b/docs/readme_ZH.md index 1f704e2f8..e0d81d3c4 100644 --- a/docs/readme_ZH.md +++ b/docs/readme_ZH.md @@ -20,7 +20,9 @@ Telegram: [nncase community](https://t.me/joinchat/PPcEPZMLaTViNDI1) - [常见问题](./FAQ_ZH.md) - [示例](../examples/user_guide/k230_simulate-ZH.ipynb) - [Colab 在线示例](https://colab.research.google.com/drive/1m8TTree096m5VHmq-Uc60gXyltVCgnRb?usp=sharing) -- [ *nncase与K230_SDK版本对应关系说明* ](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK_%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E.html#ai-sdkcanmvnncase) +- [ *nncase与K230_SDK版本对应关系说明* ](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK_nncase%E7%89%88%E6%9C%AC%E5%AF%B9%E5%BA%94%E5%85%B3%E7%B3%BB.html#k230sdknncase) +- [SDK中更新nncase运行时库](https://developer.canaan-creative.com/k230/dev/zh/03_other/K230_SDK%E6%9B%B4%E6%96%B0nncase%E8%BF%90%E8%A1%8C%E6%97%B6%E5%BA%93%E6%8C%87%E5%8D%97.html) + ### 安装 From 91ea4df975e49f4a678b666853378f4997080081 Mon Sep 17 00:00:00 2001 From: huochenghai Date: Fri, 12 Apr 2024 12:26:50 +0800 Subject: [PATCH 6/6] fix fold binary (#1182) --- src/Nncase.Passes/Rules/Neutral/FoldBinary.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Nncase.Passes/Rules/Neutral/FoldBinary.cs b/src/Nncase.Passes/Rules/Neutral/FoldBinary.cs index c844136f1..6d1561490 100644 --- a/src/Nncase.Passes/Rules/Neutral/FoldBinary.cs +++ b/src/Nncase.Passes/Rules/Neutral/FoldBinary.cs @@ -23,13 +23,14 @@ public sealed partial class FoldNopBinary : IRewriteRule /// public IPattern Pattern { get; } = IsBinary( "binary", + "call", x => x.BinaryOp is BinaryOp.Add or BinaryOp.Sub or BinaryOp.Mul or BinaryOp.Div or BinaryOp.Mod or BinaryOp.Pow, IsWildcard("lhs"), IsTensorConst("rhs")); - private Expr? GetReplace(Binary binary, Expr lhs, TensorConst rhs) + private Expr? GetReplace(Binary binary, Call call, Expr lhs, TensorConst rhs) { - if (lhs.CheckedType is Nncase.IR.AnyType || lhs.CheckedShape == rhs.CheckedShape) + if ((lhs.CheckedType is Nncase.IR.AnyType && rhs.CheckedShape.IsScalar) || (lhs.CheckedShape == call.CheckedShape)) { return binary.BinaryOp switch {

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%0D^I|?Ls%;2 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 ^rFkLhXBYD( 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