From a26ca47d7f29b75384746205eb6e09858a5132a6 Mon Sep 17 00:00:00 2001 From: IX-BOT <137874481+IX-BOT@users.noreply.github.com> Date: Tue, 15 Aug 2023 10:06:44 +0200 Subject: [PATCH] [NEW-FEATURE] Analogue and digital inspectors (#139) * Create draft PR for #138 * added initial inspectors libraries * wip on implementing AxoInspector * added first implementation of analogue. digital inspectors, added comprehensive result, wip on data inspectors * experiments with timers, AX sharp inheritance and interface bug * rollback ax timers for inspectors, wip * wip on inspector dialog * wip on inspectors * wip on inspectors * experimenting with inspectors, trying to implement correct restore * refactoring, added terminate with step * added inspector documentation, some UI tweaks and code refactoring * refactoring, fix some typos in doc * remove logger * moves process data to context * added inspector view template and shadow views * fix overinspection inconsistencies --------- Co-authored-by: Specter-13 Co-authored-by: Specter-13 <56168909+Specter-13@users.noreply.github.com> Co-authored-by: PTKu <61538034+PTKu@users.noreply.github.com> --- build_docu.ps1 | 2 +- cake/BuildContext.cs | 1 + .../inspectors/AXOANALOGUEINSPECTOR.md | 16 ++ docfx/articles/inspectors/AXODATAINSPECTOR.md | 16 ++ .../inspectors/AXODIGITALINSPECTOR.md | 13 + docfx/articles/inspectors/README.md | 114 ++++++++ docfx/articles/toc.yml | 10 + docfx/images/analog-inspector.png | Bin 0 -> 30703 bytes docfx/images/data-inspector.png | Bin 0 -> 33031 bytes docfx/images/digital-inspector.png | Bin 0 -> 29896 bytes docfx/images/inspection-failure-dialog.png | Bin 0 -> 48962 bytes docfx/images/overinspected.png | Bin 0 -> 34294 bytes docs/articles/timers/OFFDELAYTIMER.html | 165 ++++++++++++ docs/articles/timers/ONDELAYTIMER.html | 165 ++++++++++++ docs/articles/timers/PULSETIMER.html | 165 ++++++++++++ docs/articles/timers/README.html | 244 ++++++++++++++++++ src/AXOpen.sln | 22 ++ .../AxoSequencer/AxoSequencer.st | 2 + .../AxoCoordination/IAxoCoordinator.st | 12 + .../AxoDialogs/AxoDialogBaseView.cs | 5 +- .../AxoDialogDialogView.razor | 1 - .../AxoDialogDialogView.razor.cs | 3 +- .../AxoDialogs/AxoDialogLocator.razor.cs | 7 +- .../axopen_core_blazor.csproj | 1 - .../axopen_data_blazor.csproj | 2 - src/inspectors/ctrl/.gitignore | 8 + src/inspectors/ctrl/.npmrc | 1 + src/inspectors/ctrl/AXSharp.config.json | 1 + src/inspectors/ctrl/apax.yml | 17 ++ src/inspectors/ctrl/dw.ps1 | 3 + .../AxoAnalogueInspector.st | 123 +++++++++ .../AxoAnalogueInspectorData.st | 24 ++ .../IAxoAnalogueInspector.st | 13 + .../ctrl/src/AxoComprehensiveResult.st | 49 ++++ .../src/AxoDataInspector/AxoDataInspector.st | 180 +++++++++++++ .../AxoDataInspector/AxoDataInspectorData.st | 24 ++ .../src/AxoDataInspector/IAxoDataInspector.st | 13 + .../AxoDigitalInspector.st | 110 ++++++++ .../AxoDigitalInspectorData.st | 22 ++ .../IAxoDigitalInspector.st | 13 + src/inspectors/ctrl/src/AxoInspector.st | 240 +++++++++++++++++ src/inspectors/ctrl/src/AxoInspectorData.st | 46 ++++ src/inspectors/ctrl/src/AxoInspectorDialog.st | 124 +++++++++ src/inspectors/ctrl/src/AxoInspectorTask.st | 119 +++++++++ .../ctrl/src/enums/eInspectorResult.st | 13 + .../ctrl/src/enums/eOverallResult.st | 10 + .../src/interfaces/IAxoComprehensiveResult.st | 33 +++ .../ctrl/src/interfaces/IInspector.st | 48 ++++ src/inspectors/ctrl/src/interfaces/IOnFail.st | 34 +++ .../ctrl/test/AxoDigitalInspectorTests.st | 129 +++++++++ .../AxOpen.Inspectors.Blazor.csproj | 25 ++ .../AxoAnalogueInspectorCommandView.razor | 25 ++ .../AxoAnalogueInspectorStatusView.razor | 27 ++ ...xoAnalogueInspectorShadowControlView.razor | 25 ++ ...xoAnalogueInspectorShadowDisplayView.razor | 25 ++ .../Online/AxoDataInspectorCommandView.razor | 27 ++ .../Online/AxoDataInspectorStatusView.razor | 27 ++ .../AxoDataInspectorShadowControlView.razor | 25 ++ .../AxoDataInspectorShadowDisplayView.razor | 25 ++ .../AxoDigitalInspectorCommandView.razor | 27 ++ .../AxoDigitalInspectorStatusView.razor | 58 +++++ ...AxoDigitalInspectorShadowControlView.razor | 25 ++ ...AxoDigitalInspectorShadowDisplayView.razor | 25 ++ .../AxoInspectorDialogDialogView.razor | 39 +++ .../AxoInspectorDialogDialogView.razor.cs | 100 +++++++ .../GenericIconView.razor | 76 ++++++ .../GenericInspectorDataView.razor | 28 ++ .../GenericInspectorDataView.razor.css | 6 + .../InspectorViewTemplate.razor | 108 ++++++++ .../Properties/AssemblyInfo.cs | 3 + .../AxOpen.Inspectors.Blazor/_Imports.razor | 2 + .../wwwroot/background.png | Bin 0 -> 378 bytes .../wwwroot/exampleJsInterop.js | 6 + .../ix_ax_axopen_inspectors.csproj | 20 ++ .../axosimple.app/Components/UnitsData.razor | 4 +- .../Pages/UI/ManipulatorExample.razor | 27 +- .../axosimple.app/Pages/UI/ProcessData.razor | 2 +- src/templates.simple/axosimple.app/Program.cs | 3 +- .../axosimple.app/axosimple.hmi.csproj | 1 + src/templates.simple/axosimple.twin/Entry.cs | 2 +- .../Resources/PlcStringResources.resx | 6 +- .../axosimple.twin/axosimple.csproj | 4 + src/templates.simple/ctrl/apax.yml | 1 + src/templates.simple/ctrl/monitor.mon | 13 +- src/templates.simple/ctrl/src/Context.st | 4 + .../ctrl/src/Examples/PneumaticManipulator.st | 138 ++++++---- src/ws.code-workspace | 41 +++ 87 files changed, 3276 insertions(+), 87 deletions(-) create mode 100644 docfx/articles/inspectors/AXOANALOGUEINSPECTOR.md create mode 100644 docfx/articles/inspectors/AXODATAINSPECTOR.md create mode 100644 docfx/articles/inspectors/AXODIGITALINSPECTOR.md create mode 100644 docfx/articles/inspectors/README.md create mode 100644 docfx/images/analog-inspector.png create mode 100644 docfx/images/data-inspector.png create mode 100644 docfx/images/digital-inspector.png create mode 100644 docfx/images/inspection-failure-dialog.png create mode 100644 docfx/images/overinspected.png create mode 100644 docs/articles/timers/OFFDELAYTIMER.html create mode 100644 docs/articles/timers/ONDELAYTIMER.html create mode 100644 docs/articles/timers/PULSETIMER.html create mode 100644 docs/articles/timers/README.html create mode 100644 src/inspectors/ctrl/.gitignore create mode 100644 src/inspectors/ctrl/.npmrc create mode 100644 src/inspectors/ctrl/AXSharp.config.json create mode 100644 src/inspectors/ctrl/apax.yml create mode 100644 src/inspectors/ctrl/dw.ps1 create mode 100644 src/inspectors/ctrl/src/AxoAnalogueInspector/AxoAnalogueInspector.st create mode 100644 src/inspectors/ctrl/src/AxoAnalogueInspector/AxoAnalogueInspectorData.st create mode 100644 src/inspectors/ctrl/src/AxoAnalogueInspector/IAxoAnalogueInspector.st create mode 100644 src/inspectors/ctrl/src/AxoComprehensiveResult.st create mode 100644 src/inspectors/ctrl/src/AxoDataInspector/AxoDataInspector.st create mode 100644 src/inspectors/ctrl/src/AxoDataInspector/AxoDataInspectorData.st create mode 100644 src/inspectors/ctrl/src/AxoDataInspector/IAxoDataInspector.st create mode 100644 src/inspectors/ctrl/src/AxoDigitalInspector/AxoDigitalInspector.st create mode 100644 src/inspectors/ctrl/src/AxoDigitalInspector/AxoDigitalInspectorData.st create mode 100644 src/inspectors/ctrl/src/AxoDigitalInspector/IAxoDigitalInspector.st create mode 100644 src/inspectors/ctrl/src/AxoInspector.st create mode 100644 src/inspectors/ctrl/src/AxoInspectorData.st create mode 100644 src/inspectors/ctrl/src/AxoInspectorDialog.st create mode 100644 src/inspectors/ctrl/src/AxoInspectorTask.st create mode 100644 src/inspectors/ctrl/src/enums/eInspectorResult.st create mode 100644 src/inspectors/ctrl/src/enums/eOverallResult.st create mode 100644 src/inspectors/ctrl/src/interfaces/IAxoComprehensiveResult.st create mode 100644 src/inspectors/ctrl/src/interfaces/IInspector.st create mode 100644 src/inspectors/ctrl/src/interfaces/IOnFail.st create mode 100644 src/inspectors/ctrl/test/AxoDigitalInspectorTests.st create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxOpen.Inspectors.Blazor.csproj create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Online/AxoAnalogueInspectorCommandView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Online/AxoAnalogueInspectorStatusView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Shadow/AxoAnalogueInspectorShadowControlView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Shadow/AxoAnalogueInspectorShadowDisplayView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Online/AxoDataInspectorCommandView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Online/AxoDataInspectorStatusView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Shadow/AxoDataInspectorShadowControlView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Shadow/AxoDataInspectorShadowDisplayView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Online/AxoDigitalInspectorCommandView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Online/AxoDigitalInspectorStatusView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Shadow/AxoDigitalInspectorShadowControlView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Shadow/AxoDigitalInspectorShadowDisplayView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoInspectorDialog/AxoInspectorDialogDialogView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/AxoInspectorDialog/AxoInspectorDialogDialogView.razor.cs create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/GenericIconView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/GenericInspectorDataView.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/GenericInspectorDataView.razor.css create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/InspectorViewTemplate.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/Properties/AssemblyInfo.cs create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/_Imports.razor create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/wwwroot/background.png create mode 100644 src/inspectors/src/AxOpen.Inspectors.Blazor/wwwroot/exampleJsInterop.js create mode 100644 src/inspectors/src/AxOpen.Inspectors/ix_ax_axopen_inspectors.csproj create mode 100644 src/ws.code-workspace diff --git a/build_docu.ps1 b/build_docu.ps1 index d98c25c63..e280b5f18 100644 --- a/build_docu.ps1 +++ b/build_docu.ps1 @@ -1,4 +1,4 @@ # dotnet run --project ..\ix\src\ix.compiler\src\ixd\Ix.ixd.csproj --framework net7.0 -x .\src\core\ctrl\ -o .\docfx\apictrl\ -dotnet ixd -x .\src\abstractions\ctrl .\src\data\ctrl\ .\src\core\ctrl -o .\docfx\apictrl\ +dotnet ixd -x .\src\abstractions\ctrl .\src\data\ctrl\ .\src\core\ctrl .\src\inspectors\ctrl -o .\docfx\apictrl\ dotnet docfx .\docfx\docfx.json --debug dotnet docfx serve .\docs\ diff --git a/cake/BuildContext.cs b/cake/BuildContext.cs index 205548e30..0e00672c1 100644 --- a/cake/BuildContext.cs +++ b/cake/BuildContext.cs @@ -144,6 +144,7 @@ public BuildContext(ICakeContext context, BuildParameters buildParameters) ("core", "axopen.core"), ("data", "axopen.data"), ("probers", "axopen.probers"), + ("inspectors", "axopen.inspectors"), ("components.abstractions", "axopen.components.abstractions"), ("components.cognex.vision", "axopen.cognex.vision"), }; diff --git a/docfx/articles/inspectors/AXOANALOGUEINSPECTOR.md b/docfx/articles/inspectors/AXOANALOGUEINSPECTOR.md new file mode 100644 index 000000000..233501ebf --- /dev/null +++ b/docfx/articles/inspectors/AXOANALOGUEINSPECTOR.md @@ -0,0 +1,16 @@ +## AxoAnalogueInspector + +Provides evaluation of *continuous* values. The inspector checks that the input value falls within the limit of *Min* and *Max*. The inspection passes when the input value is within the required limit without interruption for the duration of stabilization time. + +![Analog inspector](~/images/analog-inspector.png) + + +Common inspector data are extended with following analogue inspector data: + +```C# +RequiredMin : LREAL; // min required value for inspection + +DetectedStatus : LREAL; // detected value + +RequiredMax: LREAL; // max required value for inspection +``` \ No newline at end of file diff --git a/docfx/articles/inspectors/AXODATAINSPECTOR.md b/docfx/articles/inspectors/AXODATAINSPECTOR.md new file mode 100644 index 000000000..60c05428b --- /dev/null +++ b/docfx/articles/inspectors/AXODATAINSPECTOR.md @@ -0,0 +1,16 @@ +## AxoDataInspector + +Provides evaluation of alphanumerical values. The input value compares against the Required value. The inspection passes when the input value matches the required value without interruption for the duration of stabilization time. In addition to exact comparison, data inspector allows for simple pattern matching where # = any number and * = any character. + +![Data inspector](~/images/data-inspector.png) + +Common inspector data are extended with following data inspector data: + +```C# +RequiredStatus : STRING; //required value for inspection + +DetectedStatus : STRING; //detected value for inspection + +StarNotationEnabled: BOOL; //star notation enable/disable + +``` \ No newline at end of file diff --git a/docfx/articles/inspectors/AXODIGITALINSPECTOR.md b/docfx/articles/inspectors/AXODIGITALINSPECTOR.md new file mode 100644 index 000000000..031a27595 --- /dev/null +++ b/docfx/articles/inspectors/AXODIGITALINSPECTOR.md @@ -0,0 +1,13 @@ +## AxoDigitalInspector + +Inspector provides evaluation of *discrete* value. The input value compares against the *Required* value. The inspection passes when the input value matches the required value without interruption for the duration of stabilization time. + +![Digital inspector](~/images/digital-inspector.png) + +Common inspector data are extended with following digital inspector data: + +```C# +RequiredStatus : BOOL; //required value for inspection + +DetectedStatus : BOOL; //detected value for inspection +``` \ No newline at end of file diff --git a/docfx/articles/inspectors/README.md b/docfx/articles/inspectors/README.md new file mode 100644 index 000000000..070728221 --- /dev/null +++ b/docfx/articles/inspectors/README.md @@ -0,0 +1,114 @@ +# **AXOpen.Inspectors** + +**AXOpen.Inspectors** provides mechanism of inspection of different types of data. The input value is compared to required value. If input value is the same as required value for a *stabilization* time period, the inspection will succeed. If values are different, *timeout* will occur and inspection will fail. + +Inspectors can integrate with coordination primitives like [AxoSequencer](../core/AXOSEQUENCER.md). In consequence, inspectors offer extended capabilities in decision flow for failed checks. + +Each inspector contains: + +1. `Inspect` method, which input is current parent and inspection variable +2. `OnFail` method, which provides methods for making a decision after a failed inspection (see Handling failure section) +3. `UpdateComprehensiveResult` method, which input is object of type `AxoComprehesiveResult`, which can be used to gather results of all inspections. + +4. `Common data` about inspection inputs and result. See below. + +## Example inspection +Example of inspection within a sequencer in PLC: +``` + _presenceInspector.WithCoordinator(THIS).Inspect(THIS,_inspectionResult) + .UpdateComprehensiveResult(_comprehensiveResult) + .OnFail().CarryOn(); +``` + +1. A _presenceInspector is created instance of `AxoDigitalInspector` + +2. A coordinator is passed to this inspector with `WithCoordinator(THIS)` method, in this case it is a sequencer, a parent object. +3. `Inspect` methods takes parent and inspection variable, on which inspection is performing. +4. If inspection fails, the result is updated to `_comprehensiveResult` object with `UpdateComprehensiveResult` method. +5. If inspection fails, `OnFail` method provides `CarryOn` method, which tells the coordinator to continue in execution. + +## Common inspector data + +Inspectors contain common data, which are used to store data about inspection. Each inspector contain following data: + +```C# +Timestamp: LDATE_AND_TIME; // timestamp of inspection + +PassTime : TIME; // stabilization time, inspection must be success for this period of time + +FailTime : TIME; // timeout, after which inspection fails + +Result : eInspectorResult; // result of inspection + +IsExcluded: BOOL; // inspection will be performed, however result will be omitted in overall result + +IsByPassed : BOOL; // inspection will be skipped + +NumberOfAllowedRetries : UINT; // maximum number of retries of inspection, from which overinspection will occur + +RetryAttemptsCount : UINT; // actual number of retries, if RetryAttemptsCount > NumberOfAllowedRetries, overinspection occurs + +``` + + + +[!INCLUDE [AxoDigitalInspector](AXODIGITALINSPECTOR.md)] + +[!INCLUDE [AxoAnalogueInspector](AXOANALOGUEINSPECTOR.md)] + +[!INCLUDE [AxoDataInspector](AXODATAINSPECTOR.md)] + + + +## Handling failure + +When an inspector fails, OnFail() provides a series of methods for making decisions about the process. In order for this is feature to work the inspector needs to be aware of the coordinator of `IAxoCoordinator`. The coordinator must be passed to the inspector by `WithCoordinator(coordinator)` method. + + +| Syntax | Description | +| ----------- | ----------- | +| Dialog(inRetryStep, inTerminateStep) | Opens dialog for the user to take a decision. Parameter `inRetryStep` represent state from which the inspection should start again. Parameter `inTerminateStep` represent terminate state of coordinator. | +| Retry(inRetryStep) | Retries the inspector. Retry state parameter tells from which state the inspection should start again. | +| Override() | Marks the inspection as failed but continues with the following states of the coordinator. | +| Terminate(inTerminateStep) | Marks the inspection as failed and aborts the execution of the coordinator. | + +The following example specify, that when inspection fails, dialog is shown and is requesting user decision. + +``` + _valueInspector.WithCoordinator(THIS).Inspect(THIS,_inspectionValue).OnFail().Dialog(Steps[20], Steps[145]); +``` + +![Inspection failure](~/images/inspection-failure-dialog.png) + +## Over-inspection +When `RetryAttemptsCount` is same as `NumberOfAllowedRetries`, no more inspection are allowed, as data are overinspected. + +![Overinspected](~/images/overinspected.png) + + +## Preserving overall result + +Overall result of a series of inspections can be preserved in `AxoComprehensiveResult`. Each inspector has `UpdateComprehensiveResult` method that provides the update function. Once the `UpdateComprehensiveResult` marks the overall result as Failed, successive inspection will not overwrite the result. + +``` + +IF (Steps[30].Execute(THIS, TRUE, 'Example Digital inspection')) THEN + + _presenceInspector.WithCoordinator(THIS).Inspect(THIS,_inspectionResult) + .UpdateComprehensiveResult(_comprehensiveResult) + .OnFail().CarryOn(); + + END_IF; + + IF (Steps[40].Execute(THIS, TRUE, 'Example Analog inspection')) THEN + + _valueInspector.WithCoordinator(THIS).Inspect(THIS,_inspectionValue) + .UpdateComprehensiveResult(_comprehensiveResult) + .OnFail().CarryOn(); + + END_IF; + + +END_IF; +``` + diff --git a/docfx/articles/toc.yml b/docfx/articles/toc.yml index e0f379480..5d2ebe8dc 100644 --- a/docfx/articles/toc.yml +++ b/docfx/articles/toc.yml @@ -36,6 +36,16 @@ href: ~/articles/data/AxoDataExchange.md - name: Data fragmets exchange href: ~/articles/data/AxoDataFragmentExchange.md + +- name: AXOpen.Inspectors + href: ~/articles/inspectors/README.md + items: + - name: AxoDigitalInspector + href: ~/articles/inspectors/AXODIGITALINSPECTOR.md + - name: AxoAnalogueInspector + href: ~/articles/inspectors/AXOANALOGUEINSPECTOR.md + - name: AxoDataInspector + href: ~/articles/inspectors/AXODATAINSPECTOR.md - name: AXOpen.Messaging href: ~/articles/messaging/README.md items: diff --git a/docfx/images/analog-inspector.png b/docfx/images/analog-inspector.png new file mode 100644 index 0000000000000000000000000000000000000000..64ff0e65d87b4623c170c0246f5ad67c2f97d1f0 GIT binary patch literal 30703 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∓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 O&KsBx@$NvHN$LJ&g literal 0 HcmV?d00001 diff --git a/docfx/images/data-inspector.png b/docfx/images/data-inspector.png new file mode 100644 index 0000000000000000000000000000000000000000..1d599e30b16e7f3edee6e66b1b832b318d5c8132 GIT binary patch literal 33031 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

0Wgv_hJG`7P%(MSsy7S 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 Wt&kG`PFFYj6g4ch^JSym`ML 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 literal 0 HcmV?d00001 diff --git a/docfx/images/inspection-failure-dialog.png b/docfx/images/inspection-failure-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..db45c7b488634292d77fc064d3d400262aed5b58 GIT binary patch literal 48962 zcmeEtXHZj78z!PyKt!bp2(i;aK|rZCK&97637|CTHG~#Iu^~;RDOCaKy@i^9iU1YH8|rd%3Ujitv2j1R zf6tVSjYFM{?EvQJVb&*a?Nhs0e+~qg>fT|i95}nmdUMG2w!v*Swwffay~iA^_s4wi zTLrMOo%s6ab)eg)*oln|fq8K6wt2AK`t*@-KJ;Yw<`MR1!l7&&t02CUCDE@UxwSj} z(Q&V%Kdy8U%YfQdqS8`FqoebRCC01IUx+sU%ypmCe&n9@?DT$*{`j*?mz+k@aOtQw z*%K2Jb&9SK*Bt1;&1Ty6YQQM#0$9!e<1*}qJ5R&K`UA7?r)KQ`eaiM@^Jp;pzy48? zL+S_qb)Rvw=ltgjUk)EI`cL<9Or-d~Ze;cC4&Hy=TjS?ukNxYO^E|n6=wJ7w^8Y_A z+yA|T@B>|Bl$$@}b#7!Ghs2#Yd&A-73DMe%x{1Mhe7{2>E#DmR>6-o;ITKjwR3aVAjOTr#w0*C>>Ez6STGexl z64QyUgOTO8I(UT)^J`SxhQDS0yN6$uZX<_#UeBQeYGKR?(sWFGH7OV7Ier8%*_&F{cDXy8vilTr_PRmt zW-I){DpF z(B>d(}|RkqMn z!>H|#1;Q3y!LRR0jNhCk+#aLP9Pu1mzZtZ%@faQs(T~rLm~w{PRi`8wFBgGbsf-`dHaah0LSv$44)uSFI`SWHn-5!m)+ zA1r@edaNYc?B@*BPWDby^U|7OyNXrKpqX>TsYr-5ws}!Jo++Pa@PD-`w=#_Th^bYW_MA{ zgN?BL+kJo!sMi9LPF;DNiq}4ezLv5bEPHT^!Y3jkf{SOwbMjBIwuh6du33KTbfq0- z*3mjQ9(R~^4oo!%*!;S~!TR@6*HfoX&B(I8CPlk_4OnSg>9hXsvR>$)^+Q4D^(lQN z$D{;}CvSIuhw4SH%Lf;@C438A_;HHPNcs>2AV4DFKtp0g?vhoBhHFdtq%89`8%5lnSF)HhGroXwy^b(#bHVeHO8J9MLO=c zg;(*crlfz(#zeILzVHDY&b}r49g<22AYH2{LuT*@ zyjJ}@-{9DN!e@2U(B+;h)K!zbT}Qkosv1;lkf{!#%u| z^a^H}ETHU4REMwQeZD`Mt`lilKC?R^0hbwPGU$XNzj;C$);kGiPjePxECR*J6KN^N zZFZ^J&YW^(%r(W!pGn^wtab5+VJAvtFw=uwngFu)yDAkWvK>}*Ynn<_atpJzuOc@@ z_)Io>VcQ!_1xiU+2cg~OH&axD(3$*}{qEfF%_uu$<a!Aa<>N zA7tHPE-4MHEKijK^*&6KAf|DQ1igT6d@AE&UK`yiMSNavpG`-}$HB6AbJI%<*VKOB zTXv2R9n<^`faOuk*E;b&ZHr^*?d>{LtMh|hA{{V~|8kH=V{V{R)jo`IjLMpZ_a(X_ zmpfx#mODh<_c`$+gvq4)ge^4-PW5cTar?76)2#Kcv6=T?HXCwcpD=Hz3RWop_;XQI ztu-!7Yv1-HZow*v;kRxSG` zr=I@SQ}B)a%r6bJPPg$6NM1ACs2OBqZ#f!5CabK^=~elH#gz`Ej}F(MuZ`6h+5#Gk zEL02wkHdX%-uune2s*VNJ~`ge<+%}dyIUt85y6_O;-V`z-_l%j`Ek@4pX8!~;5JMp z$Rl9sCm1f@zHmX>eB%-P%%^g*Pif*8zL58&O5@@L<-u^?%$puTdz+amFoc)Ug^f~F zW%JgYoTrHL4J>P?T=aHr5JK)h7FGMar)k^b*=&>ZNMg;exbYL&e3^`?x*H0R-YNRn z6~m*o7JW&`pd0D9>`~F34Vn1%0NI6^&i70%wMlLN^MM#LBbmX{y$ z!A&pgO$fPWJ>K0C++gi*$oYNh&j4a0>^Qlt)Tb08Zl-ctjc;7=?u^J%V!+&%0{Q_| zSCbZ;>xAm7H!??AylhC?>pp^XO_nNJ>y%Z2)TAvp_-=hYh=V7yS4m&v=G*P{U`$;r zvngtvhWU^>8XkRtvWg2+aaR0(`dV|{Q8%%WH^Q0Ac90fMcUU<|hpt_sdwoGsHe#r) z`UkU(Peee94RSTVhTY5J;1Zk&KvBWs9m~q9-7_JrNRb+wix3#4M>hyuR3>ATqpl2| z-0p~771ToI8Q;UtL$47?5KWH&DTev zJ?N%@W#{T zT7`h{owr_7O+6L7?u)&tbz3$K{_rCG4=x^KR{(rM`+Zg3xgOv4>ekR(X)hWLom1S= zr7azmy&q?9%~1;!U`!f*Jm~~yWVsC_eC++}js=Q_iKo z6_w#5-{8XzZVtLGaz)X8`Q+m~s$8qPX3F32wsz(;-biWqF<7O;0tnVqIgkfZM<=>&o@Y9LNj-;WI2{UIpw%geBRD z%arvN11@db8R#dqQ<*QP?V*-4z6`K3tG_)AsUqd>=`PQX+@pN z(_bec=$+Fi8vPfg@MH6aK$Hb$yPX6}cei)Tb;EIB$PQiX^wmx}sX<|As8Vj_#v$19 z+WVF6meev!tD$0vu!UborgzgRq}G@tIllYsY?04Q<6R0Dolg8n9Ni{Vs)bEreaLlN z*4H88*rII9foyf;_FRBvvGMuzYuAX&o5$qh$ zfZ~v=ZN&wZ*-)1^k>hih^`;2llznDAU-F2a$TCNICoyp`md*Z`fiJdfvX|w=0?%K$ zs09$c5oLHLkm3BLN_j0#e%h;|C~j9z4)G)PZnC$>2jWOwF}E^=*w&#vLnl%e zqj;ZyZ0-C)j=*`$6N9|4;~fWlz9&^PCyM25&po7TS1G}mO7mYpE|!G^&Noc=Mx*XM2b1 zA2^21lYw*aYazXS>8r`sOuUS3Q#JhCl$Y$tg8duDw%P0#k1-iY)Cl#t>-4M62KTW* z{0jN$e*4DMNDvA}^vB~bxc>U`oEQ|^pSxeg9Rev<`yQHe3UEAtKA`ntvS<=M*`3FD zf5XFRPo8%!=9#q-UH`w6QWVW$sWbGvc}6#6YY8maF!Ju$%nG};)zI)#^jHvWwWt~U zsnSeHTdA7;`bUW!Vhvv(eKXXv)=V~_}2eVW9MQUb(!wIs059cG{ySI3nHbcx{%$^T6P;aEdz*m^)MES5v^noZ znsMxY0Dg2k0BwN&?3%MSkDxM0rUYq%Vs_EWnc_-(n~dKUOv}RzJLnF6qxu_JfbK!Va+Auy~7zt+pinR0K7?G(65*2BS=jePm7$DFdKZ!eD0; zvo@vk7q#Z|Is2&SZk5Z!$BHs0Eh|jBvg5lC$>}7IEaFtgIRvv{wr`B18fGB4MZ#YXZ6!27undIXxuy4zRd9?tYMEW< z!=B{0#s6wBNwhao&s~JSH=QTEGRWxKtu#BcgWVWZaa$1;RQbWfG*_DQD6R7phxI#m z_RM$2Z8M`O7F+$9Dgii%0;MRI_t5C*Gi$B3ALwkg%e&ddyL#-nGQkE9ydA{JNs|iA zI_(TuYhD=ElM526kF~k7s#q}3FFNH4F+B~#Y5I~h+?WWBx2ymk47;v`OKojm*S~o( zI0qVq>d8=YZz4t29bDFZVB%n)mGW8>X%rZ4+DE$E;_xwE`!$~*Jf_6E-W{ByIbuI?8UoH^y9`zSWS(LAMmrcB*?GJYu%yEf$(Tf1z$6a&7pGNH4#!Bvh zP3S?Jw==(`w2zfKPxXL(b3rX#N4>%cy&ZftEj#p zK0>jwV5i$;>{+p7vl028kRvYqW-kGddiiFl+U~`>>29BBv($ryj>T+Y{;b4aDEG6H zE72BPFIo9vDy`pU4*!k?`aCcZ^}hz}VcKE)TDCgI!S2dT#Omy}jcWb0F6Q}**Ekku)~Tg^qr@N&%#P*Z9;;T$ zIK(;5#h}9Bw3hK}P5C`k&No)9UE$}WT&6-Zg+FXIze%I6&_1HHHHZ^Mx%H&(aJQs= z>RYFzBnb&2ccoHb0E|Biwu{Et*3rHlJd!GF_8nZYg013GkpUDk3)fl)k!J+Wi5Fm1!UKqtLOm6(F#CYg8_Mw8Jt^W3msN) zhPaEevAxkeq<(5Fa4y4KU_7>-+xE<=lf@{`jFpDi;JM`eFIKpBq>j48O9m{}^U37| zepx>P<}*h>e4in)su54CAR*Jj8!OX%*wCxBIpv`>P~2X1XVC$z-^WmH zW0Tz1oKliU7fJaGD*+cvXdUzn4VR!G*p#G`*%bU7JJEAN^&-7)a_?tu7o`~PWT$`ffakaN*0L-`3qYatpGTe`Z>dGsP zlFrymN~hhPoNAu0JrvlvsB)0o`$R<)-+tnn({d9*zkj-Q%hg~_Y%_XT*2t0XY(ewv#K=RI? z8J+;5oqFnOyP>AqQs4K((9pLKSS;yK(($?A%1$1jY!5JC9?_mSdbA6lkf3pPzrEnp zrhMDV@Fgl->kk~g8B_h#K}b}^fO$?al(ZIb#eA>u7wxAp?1kh|z>)n|b6j0iFZYFK zC=QJz+Fc8Wt#>DY)(NVvR_%wECpo-W69}}n7VXr=p?4o;ZjcX987lTIi3Iu9g(sM|u&W%dDNtX>berMp#)dk>9Pf0n0t|Gx zVY12X7u&{lcM{aYC-{NQ9fcXOYZvTNvOisUrV$nhkElYVJPG*mGX<2?u25+Mf9+9Q zLLHoH_UlhcB^0c?IfqM~EA4n%?4+G-y5GU+d&t#|Mcs@#vtdfi`Z#1>^GUAL@{^ml z_5+2!_WGkEPLX#Z3PNkYF0m?2@rV;wbUVKk&{78y`P9|?7m70j)us-?aD|pZOk3lP zou$g@bs7w}&Ysz;N@f*fY0_tQXBpJ-IF!bG+VhNvr_852S4EV5JGL@gJd)_2EEk9F z6M?p1gYXR%@xi3Sy1Ys#YK3jhaD=eROr|28(h8VMQe=U2TI@NuI7eacb(j{pPmo5r zp2&Fm5KVKxT%^K0O74T2529UVo3X?8=&F(=(5yJ+n^2cG^`3;3Bo2k1xT^5?@jP+!4D5aNefqyNs7*3TEe(d%4+cJZ0Dhv z>rQ-1_M;r_a)ta0qneg=NJ+D~!wXGK(AIgm6~$J=lAFGv=B4ICH|M zonBsNJ9t;CJj)8+$l}Z<6tJRoSdQC#$A`i&0QAiwJtGYSC1Zf-$0{+{aZK0pT#9iUGe!S1O@uJ4wZWJ_WZo`!AnZr#CSw-_{BK%uZd< zG;|MTq$1?hly2O$AWgU16?#iZh?trtdzE02`yHFp2cFH*l^bgD%h5WgVU%V;5OOhZ zc4-U6L`CdTJTkYs18r{jq(N1mG))i9Qw~jReJUj0=i{@4<(a`U9n7vI!kIp8OKUl~ zpUP)__u)sL*MFeLE(~N#BT$Ci#Y&34n(xh__uWll^_|cn+Njd-$4=6B9;rgMDr@y( zTrg7P#J>$J%6z!TyQ?FX`KM@LRsUGf(Uot&6t7to08gPNBCzJ&SA2Wur6!RmV+pe>st6+k!bL(^ zz3F}=lcSV&R8M`!@+!FOWbbcrUFTt*V+!EO>*?*+)qFRrxU2{mRq&h~CFXgHp=5O# zn~#4zz;qHQo)_=Sed|KNa(_VoIrQb|om>&q_E50kH{+{!8K(@hu1|2>O;O4M)jl7Q z{)_7v&tg$$?HWSC;k>&A#S^z=H%K)vcj8JmRid9_b;63^`{Aq2H6%5vE$QeB#fN z=ZrydaQhaY>e9Y#;B0LN=|{`q6{JdEaebjFl*OHd!qd331VR3r+H%2~tLc8;C-0k7 z2ct{T#2^>r>V}7@P1JV^j~Re-hG_^J1cO4~0hj_{+xzQ(P$;k!h_h|KQ&*fU#M-q^ zUzk01DeqRdBQ(dKpK0_+e$|RF1e| z#=>FPgV()Uzc8`l$90}X%jIBgeGyy=5*=3qmOL}nmE>CMpsifVXTM!G2lt|uOjS6- zp1hlR5&el-+#}vc61a;hV(yx&Tt8iJclSA`pOstQm2&sq(ojXW-+Uv*b9twVzB;GO zY>&=g)|+4RlW6?(@j1YJcsaXvD|rhucUjrl-L}!Dc(q#*&291q_B*Ai^6b0(E0q!F z4Cx;oqDGb6c)IWwxE$IPZ|bjmEJX0bMp^bqQ!{mbtRQlzDV@k#w;=eGdiC?cP5ftUsJzh}U3z9nXC?g^ES`#OUf6$uzUF zo!-h^F3!Vr9EinuCZJqcsjJ^)yyNoq)&6IK=vbf~-ZkBRVj??CRQ>&SQr+i=srAYg zCHG za-mN|B|pvnh`+gQ`#_1qGH9p+a=10_h%=_7xrXF)q}t@BDrjP8T1<_& z+|fffhI~qSFDGNqZM#y;V-8{qYTNt0qo28cp-Iwf<3~$p;Mr}}mxt_%IO5cOZv(On7Pu_3OF?CY^s=9&q==o(rjEG8#dLe9qkZ^p z1AJitU2Zjj(B*rYDt{j8c+2y3Rqo?ho*k%1Yl(55+Dw03olD)yzMfS!5Kc>G*?$6Qyxq zNwA%vgtMvvV>0lZF(dBtqy z;0Ag7C5_C3zm)%c!(u$V_Nln;>7E+77yHn8@-YQPVHHh`H$JqkwPJZVfQB91?uX-= zhn5;-+Y`m6ed2snWtblia1sr7$Uy2D=jlt}cL4nZWro?6@g&@O#est$<#;(u^B}^@ zDx}c7jv7#?V9Ns7f-tEQaTcKE7nU|7Db$}#SwS;)sgMkiet5r*H4!txs^V(vdB<6c+Q9TsMroU zMlxt6P}B?`MYJ=el-8O`NPShIdPa%SZ)9!0afDwnr1iHO1zsx&%}OywOCtA;hv>AP zeU15uH-m^#KL%140I||pdvc+@lWH18P10Jcu5DjjuUl)@8qCTug14Kiq|x@W0G;7Uq$b7&K1Y2e$P9X zsp(^JBDI0VD7I2l>;?JXkJ3#K{wU7s9c!DX5G!p`>sb{A8uH~U&x|0FJ9V`y-7Z$X zO!MyOaYpX|i*#RJl2d6pS7Zc60B6T7D$ON(Fl9*9pd`(i?)D>m$BBc#Oi4pMBlM-U zf$TY?G%na9avDt4*vuV@g=c0NhyTf+Ss2xF-u?uZ)X$_$amjZ9M9`_%a8RH9mdz{p ztx-iuVmB|EUhotU)Rq@h=2|Kex_=lWPk=!O_Lp<$^IF)dmfycG*|0lZf)>qS=)@h> zDZCbS{A-fBfIX%@cUv@Y*8#fTn5Y;8xhlXCXI z<-!mezP`}_39~wwMNtZxyi-Tin(`@fK=JoX7P3)QHi&Yed`EUM(jGnEq>k8fq)puui%!_*qr?sys z0JWoTbJ$u05sqZ*}!1J`@ZoSp0|j@usR5xd^O zO*^TNT?q+O!Kh@eMb$oU32L1dh#w=2 z?Szud99$jtRcw9bHPg4CKo> zt!`dDJe3fsVs8|%F_A8+B{)!QJOf3o+TQA(o&NN7E-7K{b#%g{IBlJ=)Mv7Z<1J$c zi|-s6937<>NR(}U*eCmeulr38GBL|-nk2AiC~msXdj|vVMpylu#XLqIAc#Zlcfbbp zp8XT1H_;gC#VFOH^}t+(Oq?hU(MnKpHri9&ZeLOH!tkW@hLWk9Jw%qG$i2BhGQf4vk7hc%c&+e_*?qCljw^}#J={a#^8gGyp-L%nldV+_Zc#@DYv+oKOy(t_5Q)vCZ>4@lgd&3wBiO z!nzWOr6yk)r@#zoF|-W&@!SiYZ>Y*Zzpbw2+!p9(=+X#&2tWJ-A-r&#e6N4TY3Zj` z%$k?p&*GRsM4p3nQy)&>@g zkCp6~ocq#P*toWC`iVA7X)BiVX>s^3iGMuwa#jX#e}e!d2B?>)ZXh+2Y=-juaxvn1 zx4$9e)ici(SIJ!E2n?6X?=4j*TW3P<&0+Ge;v%!hSj($2Ux8j}c`PnW5?UnbP=M-- zsA>&er?7G( zk-lj|M}Z($j$Uw4Mzi7z&4E6)-)g=G{j6HR7UrwR1>W5lmab~9ycnHXD_%%V#MOgR zRx6g6h~x<*8(UVXKY4XTe4??W^$EqgMuPVGHmz8`>cGLn!2v~wmC$CmY}FD`8c}UC zrh@Hew%iyoY~wNHaZ&u>w((M3MrLWro)^fc<|Uv-YvR@)F?D2Ck#16sfas`~@EfZi zEKzmAWFtY%bE202SgoF6+F^l=8=ETW?SU-1=xESi`SzV?mZbEY#dX>`i|2mS8O<@L zTc%;vOWX_n3Gu!qW?c7f!xL|tv1;VW zj@vPyeb}1X^%BI-zen5<`XdW3$?FupKK_cC6MyG9XUh--jU@cxqZPR23QXMoDqD}T z6t--U`ltB$omsrCFC2ZOSSQ1xBN@R0xmfMfHwnVy$GNgQp~VSx%43YzlWEh!FLGYz z*Z&pU`j$GT1Ud05{I3+~I*Ct*5k5m_MAR#rz=(=>UT3w&T*{|hEt|^GUZDu3GK<~| z0nH6_8Q}DF2h0-vD)eAQITf`3dco9xJd7yB&6 zOu|SuDkBlQUO5$$!f?ZFAy=zD%jHMAvmoE?k6sLq42FUiOT`g3{`*j`33mi#RGnjm9alx7;r!0WbZ_s(p*6+PNcF@}D*I?siWsfcaY}=X<)*>&q!Oa9^ zm^AKyH2UD(w|-o$F8pzy*Go_Q+|9-(yPP&bO)o&ckMEWlm)2Xz*o>c$+wGj$_sEL=WCRTi0t)9ujxhI~&wjIJuxjvDrP$ zFWbBLg;>|674g*mr-oBe?#NH;+<-I-iPMhKuKJB7nQ@OQ);@za$d5t$Yi-)UWLx~3i+~&p7Ta+=Uye?-nHd?yoxSSGkom?pCBRuU= zwfy93o9FBAoUQ2^r}5iZ9?k-;SnY;VypZB|PJXF{{sSMxk0`m}+$@{(LD<3^i&EpE zwH(Yur53WB@c!C_z&ge9?OmnyIq8f?1{G$l<=WpX;X?E2HnC}#NwOfCM@DP97gOvb zXb-6X8T&UFylY(Zb~cQaXcL-#H?BMt6b1b(KYH}80>cq?~8uyT_vM6bqy83pU=Iu+bBs{;Ra-`r%}S!Qe4=GS*^zlA?j|4ASlS9#NeYTlk`|S$-92k3`I;^VFyaU6{vWnM42Ty(65o`n2lX1SOFiS!{`_2%CgVLNJbQ)1R?>ft4# zVZE<|)hw!%AlH5M0iCiwy5H#VC0%)~@7YMfXKTlzu64z@QZS-H{VqPC_R~Q+wu1** z3viLGsgUC}rA!b-X?24U59+f`>#*qp)&|?+KHlD&T}_*oOb3q% z!&U!X?VDfz#(*4-a_?kCnH#Hvo>dheYJN0Y7CR>N>5Ac!oNrAz##v!2_Z$0clp6~T zP8%ter&uNqe!Rm?m{PSUzgIIQ&6A&#wDQ(P`xM#NbCa0E-+^F{Qd4A6nL~){T=s%&yrt1p8rCgP3 z4=WkMpX~Br5ndi%n_oCs(kOwdBx4^e2maBB;%V)y>BdH@=Pe24>&%5d>xPH?t?RXY zZAboYN0DX+purc)7Cs(FK^x`$#(vFY7Z&uDUQS*9Q2!&^-4Zd`=xx*t*R#L(*3`1j zPP%p79#jFOo*298UeuofpG^2@_ruG*ECdu(G55gY3yIL$LUJD6P7v*|QX)ewE6GBIlOVsZl)!=8EI)boQ?*j7=Wo;x-I>aT`| zyc!*r-0Rl(E5e<6=^+#HfG`#}^QYbV-h2CiQJuxS?&L~OoF{q`tt{^wwotEOS>hE? zCIm>)zw>Q%Y-8_rnkzY2gt;oO?6VkZ19w6g?1UC1*npbzb^dP+7|gKD`p->Dnyq=-?q-X48+>mF`{K^HrkIwNaU!`fn0Zfxu^Mb+(bm{d z{#jGjOuBb12Z(#mM{Jj-X-iL zQO)qP-*@2pZCUT4q!%LH>n=iF1+r$uS_k4-`PQmLW-UCg!OP?;Av2{{)ywfqXXd|K zj*Nd7L)(yX@v3t7)D<*p>_N&`lVA2tGz;24_9~?@9$pzr`Yc`>$gQ@u9p30VZ?EjS z6mC-;o-8V5{ngrbaz;2c)<)5%MA%ZA7U^Xt@W|EBA^Wn27cik$Y!E=v02XKi zs~i`%hz;bpE5+IyQEF&-oB{} z>pvlFp8pvHegKUd;HADFO<^q1H-36)8& zm{6?T*mu?3ux|neA6yifQw}wYb7Lg}^@N4qP|Lc2iaskv1J-a{K_@t>3jCLd9y-2p15VeYIXw(IcmGqe5w zIo0hXF%4N&)k&6<$|%u&_}>=F#wOX5cic$c!?!^t^WBT=im+I%9~(avoc?(gBkM1I z<+Zxpmr>s>cH`;GWa!elQ@b)jLI#s{C;sDBd=qp?{jEi9`Gc@~PMUE)b6-nVS#?f| zmQ$w>snzM+E(_C^$3x$B8vc8j=M;xt{-3cnF0cj>WkRC({TsyR?Kfu^{tS^=_=2C$ zzro1jvFaJRe&tX5-{3p^k3otD__` zQoNSaVDjJE#`b^GRr=%Jf4yuhYnihegt(oSW6d%ZJq5s2hb=2@7iEuW5NrtZEO7GD z&1_s@yT;y%qp}Y(oW*j#q82;u&5u$Sf$f*wRG{BU#OC2T?!UMAC(I5wmBJ4nuRq{} zbgX%BNcgTSOFeH{r^BsAFAv=`Yga_ozkh#*zP>dSL{Z%rc+5&v44Z&uga>L z6wtrEzHGMp$UuQLE|-6S!xn6u@7 z9A6sS9nhK6|1QRis%2z%zn)9O|d zS!L#-FOC%o1eT+xCE`37nKO?}(sJ_{t0a%zxTaKPnfq2RU9RpJulNKSGwq#5f4UkdoiVh3CW8J+Kj2GNv%y%ce?fRf=xUI}OQ7F8p<`Xum{*|ldd@GTy;A=_sW3$%^xKFBmT$acbz66^ue_+FJX={gDNA=p$@ zIevC5#FRkun7R!-+rebPe|7TQ$&GuD%s%>$uEE(f()Nfp@=8P|y4Yk| zQ)u_YbZD57P5aWLTV8!*6+u)DYICGh%wh8MmfiHO6dhmH^#_7izErK=6x&!_KH1nf zLKw3tUks6DMVkpXAwb2*&#B3+{5`Pj@IJ7WcMgEvE({)E)sujE3TH0SRxV8BOGIgkB4`2j5hkKLg~{y$^m1ZA{$G1Z;%FQ#7Oh8eWLIx`|CIX`5KL|IlE+|i}`R5?3HSO zrXSRd5=L+ax;V>9y)VN^?eEoTZG_?){}^@5jMSHUKh~~<%s`jDsG+$b%&r|W|IzRU zT&8!(zKR{32M0q{RC#Gpx6K-Zrd35W=NzR?+M2>-6GXBdyIu=4WHO=onHWtBQ;bEn z(U-8Kb(SxoB|_OkN3`mieL`cOeCw!a(jVde@;2*<;siv4_o}Hget6_2P1>@~g_|@p zIy8?i2i<0+t(bRbod=}um#}?C8eLx{Yi^kXY?|Fu4YC4d^sY;Wp5SqyHO0@xP1;msD77~?m5*4;+B9J~i+3Bnr`=hi9|3;;McG)hN?R-XUUE`7 zu1ubTC_N{ekU!MZI^&j{W)(|&_veRc^;L-7?;JN{K!Yu*Tp2ExoFkaK%j{)lt!dz<_2EPG zdsTH$x)i6pMAK9DZUkkiC2IJPTpB#kztg^Z-K86L-ywTb)^B?6=5h&qbFMl}X{NLr z(RJyPO`3mU!N?nbgrIWnn6U`j<9HBD#Vsgd*0?Co8^Kz^DR81jSTjO{m&<#S*^6hC z?_*=ip;#`$cM&E(;AgTnOg0FXsqB_@j%~?o3&L^EXw+Qwz0MJyh!c`lwFP~*jt5aD zT${aSLV!M)qT-A)fNJ26Ruwmc%&aimLExhIOnI!xO%Nljw~a+pL%|VcTjjo=?s$JN zayH}jtT$af*v z@#X~KNfzh`+PMB`@gYBJztrtq)D?>ubk4LavF&ko7}(!35@Fd+DLcvgbuXDD3e32^?$W~ zjG)pFt$b3C1{ntWLNV^vvf7-2jcTDY-rBFv_PsavH97cGBG`iEQ1x-Uqs=m5uYc1B zqc*WUcFzj3zDcs|O@U6(iFN{Yu1Oxh%QYXO+{ed5r$W*VcEC@f<1Or2uCPR|j0d-U z06P=0EbL(f2I(CAHp1fw^N-R83w~T8MJ&0w_vP?u6j4n4oy~RfGoqxcTUgHfw$Fa` z>Kch+H|JT$moOly!Y^s*Kea%Av%v7S8eN$N5}A(kt2TDajPUzccdwt4Q%L843&DYm@zH zvNlAT-PzsEmz3^$oF_9&%X6cH*>gCaZz@B>HIZw@?W(Br^DAOk#TzbcX&0WkuO`%c zcr^0nA0=2-`xJ)UFDZOdH-_8ISCr#twDy9gCYRD>dzj*P4l`aOK*aW@Uw^M+9DDBW z?ZO=p=f-j_BbTv5z$h;#ttxx{uA;C+g`plV zUf8)-b|A--%l~DiS-rJ4W}64DXpmDhQWv&glVSTFncEm;EU6;fdCb7yIir3c6Lm7o zi|HDL(YSUu_mbNTUM*tHl@vkAW*|J%Kg(%dI~E3|X(c8o$ag{`50BisX*%gaB<`af)TPs8 z^n-@kR9SX5xZ=Po5q{9bD{(#42XP}Yn`VEsUw&U-6oc+HU-&<$d+%^I+y8%9DOxS= zR&kdqT@*#DR&BSU%idzO_K29VcbBSaYZbL>ix?pZiP=GG&ma-BY9>LE7!jUJdw;&a z&+j>&u1Nwu zz6GSJMtp^3_5AK#eThr*;&0yU*k&*jP>>Vkjhv~W$Ec&ZdQ@Hg#S?tjW@Mj_LB?m; zzTSI4ze_*ydjnifRg+Z}wD(jbMwotF!YEiY&)gF{@Q9|n<3%Al&P50}WIc_77tYSI zL^TokCW3{jbz9N)p(e2lL3Qdi;)FWU`+(<08x=6-Gj>_2{6Qb!L7o_L>27Xx8X<4@ z?nAKckt@Js*=Gnaenqz6kw4h@vlJqA-%jKSgy^=zB+MnSOcrJCw|AZiNA^@<3lhQj zrU{Th2DLmET!p21j;Y$V*Es@0x@2Jnq13-WOKnWv*s{$~?s{_Ei>_Dt65H>rsGg&f zvu^!4;geAVdw?(mVtGK)1))@T+JZA>2QA8foUMAfEFp3uX;U3Cl?T;*!f{t&Royxo zP(5>|7tOfLb}WS5Peuo?PWud8Nn&!Sw7LQDI7cbea1}i%Ev6Hs8KkA^Bg@faWltms}oD1)FL97Cz!A~*2G z!(*uskI3E4+Vr{Ro$KaJVNPDSrit2eA}@4UsF{p9(M7;a>k@)b0GoaOWa!2m^2e7K zn3Ijxb*^H^{uW={T!&Q)kI8|wN>2eL{;=Dgk797+;4-e9a%jFKF0fPO{y{On{G@U2 zp=rqj{hCPD`ll@#szw=-6FL+^*nMs7b{*FJr~{{xq=Pxj!%inSxzUwuT51qXy84{| z0V(};% zxU{A!l_igawCvCt82S0DTN*Ee81E%OgQaaSW^@aXztT9^FMn}oEm`;SV!Rn34pj54 z0TWt?RpgKzzry~!la!mBn7{+=12;l2xn>0o48)*aO{5&HBncDHzN z{r7>d`Ohgh2pu(qjeO5w=d#)V8Zl+7`@B}ZwGWk+CTK%?VLXL!+>w%nCh8w}wVH#? z#=5re`U5A!$f_P;(Xh2vI6B9xJ6IUOTx@_IV&&<8Y*p_NJ6`Qf>PGx3?6o`ZbgI-G zSy-2g8ndw6$TieocBoq_7O*BR&WvTcH)ch&D)d~eK%yF+c|>8-D&G=HlDFH`GnELa zGnJ2my7}Z(5MvewjCS4VorK7ZPt_}-+`QL3N;4$hiC~(dd(G%88-uiOim?c|hWnNN zt8UK#5=Q4q3W5LZRo5hja(HoC)v)Sd)N55f^Ivj_wyL8gRpO730_HUzr_{uS+2seL zr*zABxBGZ$KU2P0)SXOG3HFgR%8y~}ZOHiK3%PJt9A6W=q=6R8-OI}fvQUEoQhpGw z#SSEC{o!#pE@I_Li}csc8I~=Z*u9-z;d8nZfwMrle#zSsAo@9JrU2H;zqaf9x$`&* z5b#wu#3tn~Z!`c+X)NI>dAxDBWp`Il(yS~$sHrJlG7m6;e(hkWPF1Z0rln~x0?|DS z8YQkt%eW7rH_>pQSHbUT@HaTZ;_QK#Amm}a)gsgEXq;2PONw+6;9C%83AX`j9LTokMy}`x z(ubAM(P3=4+Og*7s3d`v{m*nQt+~@*5(#w&;lKS;sOpl{X~tS1+!~8Z>a)MFwr6Z? z3~cmW1-6x8g%SRxr<{V`dygF`(fz7!H{E(sKIo}Oc0NrPTJDD5qkA9hGiX%BX^iWh za!H|X^us*1u0p_B2cQFrO6D2TilU29kzeZl!b%37Pxpr#@+d%y+Zd&h zb_6!Kj}*r4(b+P3Vak3{u=I3A$azp}l=e($YasEeyWj_{N&^*&+}P+xpx0kU*dN$5 zjRT20J%AH+yenONcKPLUaapeW^)i{(UA#KOI~5e&{_zQI9>n6kw|(5A!uc+LQ}g_? z!7uvn5&)5S!>OZzq$^VAl6=l$75k3+cf6@_n=ENh*Tc%wj@zYaz4bm;bJ&gM;b^F?#_^zwf z-myU?QSwviuAy$l-^9I;{cvxT2OLb~MgRQVd7;(Z$1lYWf8DpPX}?>5qlYtmRVYKg zwC(4iAn#QB^zv3k^XA7os83;lEn69awpT*-ck3tE9lTSQFI*X9C}ddkPuAPD_Z#Y+ z3_haE`LakWvcw?AHK&T~?hyGaQ}Dr6WTa}zlij$84XPzkvL_Zr2RL!=!9)W=# zg0k*0L|&`hhP)vlUf|Ixw-7mNfm>j&O0d~}Zhw(c;M11tm^J24Z1o|Ap(9x>0qdn} zWL`9GYUSXmWW3=-(SFnbl)(Ue^<(3D!c7?>gnF=JUSM-$VsDmOC+qD|WX#pSw}%q@ zty?V}{A1NwkE9uc;GX8;2hHuY0hX;sMCp?(nv6Z-GwVZ!2Ot}j)(rC+%Leyk6i%wE z8s}AES{Eq9N=SZR8Mjs1{dh(38OCVYo0T9-n8g(%_VkIBcaMo|M@{XFa*T*ZLWAl< zEhfZ4g?euD(l~htZbUa~{S6WlUcgYIiJ=|Lgf#@zd!$!=%VDKYPIMle{C%{xiOX2# zsYjlMp5%A7?6H^ROMAmV)KwHQ*5TlrP4!4CyS4P4fm*8mMWd8WgDp3*D}%9J>7CFC za`NuP_M%{=C3YElZPRbuVt=GxeSD}RYAE zx8N7iEe#9P<2zAU8Xye<&Q@9FX(0&MXCn(4zL6$Fa#56*;N5y1V;7)n)tYyIg0mS9 zqUJaBeCKt7Pp^S-^DBatS_usZ{e%@~v|XCXgzTHGFi&B$@GIljv@glgTQn`tWNpV` zo;*bGSUs|^JL(09HPgU4)((OtvUZ-4yB)F(RHwABPKFI4q}Rby(20V>BI7tmjIUf3vA)lIIx!@Mc;uQFSjRn1K!B@i~GeB!K5j{<83 zxEM~%>%2!W0bw3OA|{q|>{PV7`8;<{uu-$$;b)md>_&1lQ|961LxJpoVujDaey1>v zRLx_jTZZ|AWHR|7^xAHQq|!*zNVYVN>@S*T?O^g}L<_q95_e=&fnhg3ph>|w8+jtj^r8W#x z=kV0@>}w7!FUekK4_7tj{gv>es_}Xr)j?HuevBYoM+yFGfde6;y8o-Arv==2I5}?x zon9I$c|~llYIn#`e<Z>wLyQ|(l20zz1oKK;KztZ}FG<-W zOPwB3zvV9CX5x^u457u+S88)qf*V`RQBQSI)D#XHX^=i6;>OkPm^Mo5QbN&AXAt z0ebjF$O6KtdY@y`%gO^3EF|bC-e*rhe#2%`yb);uEKgt-M2V|2nfTei{t>wCwp|lE zEGG}fkB4uT>s!aAh`ua5=sQ;t^6LjQ91WsiAuTn4y$N#{jeM~6Z##={YcqW@TBpE2 zTKAFEK}f!-@FmID{sUqZ=89V1vhIw_?|TT^>J|x~qx?ddbSIi$=j33}CyS5ACuj3b zoRn8d&gfiE<-9i4G#sa0h_&cJ?@UofBwf=;=8B*jpIqU0|Lz%yxgBr61evuwnx0YS zi0sbR&uP4>HNjP#4XLvTxjE4l1ycM462z9*``H)p28me zCwEdaJ<*+rp{7g$WP^t9z`CBRvkK{N&<4pHWZhVRtonPz0-vIRdCxncOf2ai_YU=X z@4}mSrhe$kMen&H2g=wJ&^3g+mP(UX4nuxNjQ$WW4U72Yf@^xeOX-0W-)F_qf2m|+ zem&^A|0<6bVCII6>xLWA?e66;M;sgds`ccyA zN*G^NM?3I;vD!I-v08X~rRi9x<3Y)?(mM*FVcd1Ur8_rb-CpqzXlB6a)bX+wP-2A! zXwHAb9Wi9Zb-lMALOsayX@!V8A_XjJ%F13qahWdHAU*!{*@e3bk^43Tp-_zcN=Op2 z+Rt0CG10yGEei7GLALV43aKgkkv`12EUY=WL`oupyu*=E?KHYhLA1^@9;KARk!oL- z$LE9uLG5Y7V9-)MtE$w+E{WXGlC*EwvGo4^2~quQh}RZh&9I=|!?Aj}hjHT%i*BJ1 z&Yo;oBDkD%x%%U=OlWcN) zD3&T<5^#=#U)mF^(1*<3QvV_KdtWn^G6Ou9#Gh1Cpmevp5e~O9dkB#}M@H`CH9sos zo^*}08JxUT_y0yR(kP$))tfL40Z7N;u>u?{{~c(m^o2S134BUEaHjn(^}iW4FCcg?Jm4&VD38_bn1B*vy zPRaU5hd?d0!$PfdRYNNQ>>3E+R0lA6U7=@EAk=uw5tgPuft9`zA~Ok#WGG4P` z1PeP?L)4|iqjpIh&La`l_dzES1I}AUtSkNdqJmVH$dHQTR2qd~x8Y$dqOXNay{)Tj z)963f)Ck1J_zaimTOgdjnL+Qv}-3qd@T^TNoHehT&xd7%B11tKJMt~a|A^oK7RS{^9)go<=~IoF%fd5`aeU6T%gDZ-qs zQ)mqO7FIKR55Uz|Af81o#1W&LK527iX?Cx)J;lc}fuOW5-3*cO-yyo1%1d~gv2hFz zC$IPy7vkE?Ss;^9gCoR-jf;aSqRl}ozgAj7_CIH$-8-H(VO@Xc0_0El?lD$7FH#n0 zY)aE0qd1<=g*^&-386uqD0e0Q`QV#@y>KsxNNG1B#_jg)+k5WQJL|m`_Ju+G5QKz z1rY6Odyokj`~x-s#NXh?cnQ7U;ObJNIosjt2)+6f!U_aTS}VI7C!D@QUTr;qo_)%J z0m#rkDN`dUfK&Q|AQhZ*ywlr2oy611r6rU9^SXQ10&62}ii3lLs7N}Lfb_}$m6Qx| zRG3#<4FbU3^89dE6%aLoUFdt!9*oGYRQ^|cpjqbP(PlbQWYaF^VhcE^`&`cM#xFj8 z!6rJSz}qt%u!zdtF!SlkwQ@c8FX1jyIQM_2@f%-m^=lk7l#FuJf9dGJ4;FsolhPl# zta9<<$D}(|T4BcmORkM{K3wR_p^aKPga(K~=I}`tjsM*Gm-K&ZbG5oTd~=%98x^)S80jrc( z&G3VfGXl=x`jZ;OkP*<#-HIhFYPuDTgnR&x)$a0dp%ywSYf?9aSzJz5hLg&8QQjjr zp+PXVU&#~=a5nmt8!3=94Xcwc7dE4P(;{uV*dRXYs)xppj(K?xwXZB{5K$drq-_&x z9LxQV@qlLK&tRA?kJmJ;I+7x*jGp-F6GUFV5X+GL<>&Ro{!=Z&J4bb7rLiS#6gRt! zM!Ip92;$hjLV)wgQ;k}g?<1RqvDn)78qQZc8X0=XzIodas`+s-<5E`|qK zv?47c6m4ZE_^|bX;hC!Jn>h8!U<{xig*wj1=!al(h}$@S$w=xfZE&D~HnoAa`oy9! zA*mQFuOS*X#MM)~pTkTz5b3bdkh@;Ph^4t_|1B8mz>aNNea~}Ltv8)}KiN(wg#0Cp z4CA&TeNCWs=^xa7hc)vu6QWn}RW#fyWgIE9AQo65Vz&(15`(H!Pl-pje0;iBTBn8v z(ghu6B~Onf|TN711ybgEeW{G37VfU1Fi zhM`}$VW>;D2G*zdF_D`O46)@NypZ2dEazA1k-Otk=*hS9`K7|-5ho-klb9~Bc@iby zWc;q{r%pq|zpUOjWAZSsxs^inI3|g3?(egXV?`|L7!M%n5=*+42q)k&Ky8Q-kJ^V6CE(HIF= zkRVSQ7`5k4g&})u9ro9{s0&tth?WF3>iRG=1?Mr?j%oh&R4vR^J$twFL;hHEAI>7I zr{(bL39g-Mo9faAX=2tQSWbbI^5*cJ(%99$DlSHPsNWl)?Mcz~{vlZT|lYVo8 zGW?4K|A!%pTia}_xKe>(Oss9*smpO9H|mMn1dbKZ^be}4PQq0*oP`;31DNsKqz(JE z8_JHOVXY7Qr$eF~35w%7pMUG{on!0S)Z*iFw4ZTN)0ve{0l5lUsc4)fPEqj2V9D-a z{rD}~r{^rV{DAwglAR$6xm>t}5T0|t5j$&M>BM<015D(fl~OuO@?Pc+=n*(m%d$~Q z82Q#&Vtr$WxnG#S;lapN^#a-gs4i{_EDjn?3;(ztcwp3(3hO6TQ7-z ze%ylon`Kht?{Z@n6hI16Yi{cz*g`K$?2Ql%_d1p7(qN z(p7UBtM{7Oop1WpUO=PfCEPU4wvuVWznq7)A0iJvk`6l2|EHKTX-;GAnPEyssb_^e9+pH#gLkKTl$ zHXUD>lWmh}E5@NyRRc~yoJLo1o;OzQl6Zf1`zE+RDiQSB?_xKI$fY=L%FvtG%p9gP zSIvPZUY}C9psp441g!sF>nye}o$=73K+9Y*2am`#?z90(gHRHFY)cAsj2n;F!QSor z5@HGnN3)rO36w(n%xyoE_mDd55%0au-op|=6Pl{DSnlYStpEl*GE2AHc$AJC!ADj#kn&sMDp-Vm`F3R&JkgC{(_kjhfjYHm9y?=t#-nwx)|VQ%Ez8uD4G~ zIw<%!Z#v;7zRHvmq96vSD213!Mt_C!mA$rNm=fuoymv=Oc3fqsExH9gty#xP8$dBQWo?#mBiK_ylbP0 z;lD<4PmHQPn@BHdhJz9>E_n{w7kEfYM$d?aZ>K*a^QL_Qx1xzVdlz9i5}TLMnMhle z`ck`qX(M{rdLSJWZRr&}{Woj?UL9oW>K4-#1{$S`r<=2A+0h4jEx>&@p*yW~{2fZ& zjd*g0K{Da7gc`Yu%P%rqmrn|!;FrpI{wC2CuHk6W6tA`$AxV&}huKX@R-NS0r6L6h z)cWtZu3QYv?rkhEsRQ^X`RwH{q!_B-t>HO#ggLkEt~hWHo7#z(A3rvD*l?a(HOcCW zU^w?nq`I2CX1^xA*oZxR^%;cnMWL~0-^$&q*_`Kj8Myf=HJr6~ag74!X)$91&Mf~Xb{mq!55#=p*cp>7|?)+nyB-Mor zbk_$CB$G!U)Jh|1<9fhtEd`Sor*H!VD-wVw+{Z+3ygPNcBF>f^VV=ydqZ*kZCC;GMl@}9#8q&6J69|_? z&cCm>Wvhfrj``Gg@pgp6ZPU`qTp`ucywv4m~uf z{r>q&!Q^Dfd{*7aFG|EE5W@fQCQ<2I#w3c5J( z5W;oLlp0PTdklm7HhJ`AtUHh9c>IBfM6h>n%w)vTF zALZa*P<56}ABg_b#(#}E{M`x9Yk(w;L)D53v!~b3o=G+6ah9l5= zA114J=VTWd6&=b+yxU@qOig|>ZM$hEjQRcQnUI1enkaxj_l`WZg|!2m61UU0@44hyx&kTWMD9zulgu!RtqDrYvU$U;cK$0mr|=n@4gf zgX4dYBc`91iy(hC)c-Mp^ZzjC=FT%Urw)AjL9@5uO2~jkF!@opAUgOkX165TwGa78 zP!Y&?eEsG>El<Ã~+5;f(HrSm-O@3(+fix8 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%0Do04i|XBxUEmnzS|#!k7)sf%PBg-xtcM$ z!X?SdmrIo2WL`2g<$iN!`2r%or|KC%cZrp9N8B=v%MIgF%NQJDyQBCY9n7~imN%gW z-3@#ho*lW?vF0;on*WN}MOZm*TkNf~NWMK1e;ja1Oz1Df`T`ox!_t#Ug!e;Uh=_Ch zT|h5!T+QJCc)pl{OF-iF;m>Q`sF`8zC{O#8xcn#) zvuNZ4Ed!Tlo_35Y1IL{!ZGj+$TgycCzN&Z47S}3j6xrV&B2B+tGJn)AFx!Inz%a== z{%c6KAXs=n+l@?sVR?3ki~85Zksub$nnO_rZH4H?&ULQl(=+by`@=Fo798K%vmQWr z0g9QGBjo-kVLH#m-Tz%X1sFv>0sGZJH~;v=kw5Phb5#TlGz>8g4MBT3Lsvnpa|-J;T}_BHFm?IX9qhOw=HoB~4# zQ&)p1J&I=5>;Smh$8A8|M`akY0;-oxplAdW&uRd9Mkc^vnTO_keT%EJ17EZCj8HT! z8h-y(rZO0FIDj0>*oDbVWHWv+f3PW`#~2x{MeM$urT`<_12QEO;P!PmACliQxE;FB zK4Qfqd@Yvly`EYQodyz-0X;}Fl8I>|LA_rQGDT)~9w2ZKvYvf~1m4hUPW{@mNq}EXpSgHVwlS{c2oMhqDxQ=BkC0DO&NA zbb=3>8hZly`OHb74N7pjqVM<7gQPLai*A*1&I1gNjT$|StF-o-KDdqp@c@?LtDtF! zf8^r81^$-+;?B+;=JgH>cflBv9>?Vx#$tTEFwdtef|Ux)olCC2AJ!!|4yE;zvI@5KEw1{sO)(C zZtS5ODtj6e^2S@Mnma(J^{9bMz|`TNiWe^? zqt7Vax^nLfI+%@y))S5zcyV;u>=8#(HITy~VXk_qJ^3~;${Ps?O(we1VBXU$t-onp z&BA9SRjrZF%JK^hHe#v0wbVTcJtfCzR~g~R%{MAycYP`xT3e*-o5n%(&!UF8c&||m^Q9X7I=xqy{cstewF8AL@dMxGHn$ARjgv8 z21-IH7ymVTh*!rm&!BU`jl-U4`?48@*>1NieHnQ6l=CGE;(&ZgKPa0S-z{JMX^RC7 z5U-^DuCDi<{CcSU*k#eshSW-P-;xD$xy$E`7c!quy4^@g5StC$Nq$5#$S*St70q@BHolEZ@ZW^MGz8C@JLE;#w&R z5|zwK*BKG+pz?&|Q5ZA*cW^SG_i!FxbVRUfPy*%NAi4#PB0W&04ZgH?O{({>l|_9z zE2r>KV-DD0yD5;`WDk@oov2}7=C|388&bPrWHnIIXz+GcvurYz2k_Q3Z7iDXFK-Yg zIC{qe%d)MJ_>Ey%CgqM?wy&z8?%96XI{CvS5Q`DBC%5?f;@D)Bn!s9X4zyexTYHld z6BmLNc=A97T(%068%P%CXzC>bsv9WMHKPC%3rZ*MYXAO5VR0I9P6CC^P-lZ;>@%G1 z9yQ%~OQ|KXUcIZ;Eg#B$sf)7yT{8P?;e&QbVuI{GOcT~y1e8H_1`Fu$xMBZ1U@2z1 z8s{#7hY}VJ6P7ERKuN9NB*MU|U3{lX%AI>^klZ-?^FS&0EfsG#aKnYZX&I_+tdbB~ z-y#FG_xA-PtCP*s`>8T|z2cYFg=lylifov*B^zzD@U{1Wjocc%LWPDNTXox;OEy3* z6b%SZJ*I6jv#2OueJ02G-qv-7?O)76eV|H|t(m2D$lGz74AUN)uLsBpT-(4U1?jOp zdsu&k_2;MT0X)43aNA0DNRkivdz7?te`0r-@_{L!+w-(xgrH3x1)b2LWD;P~)SKfA z^C*}$tl!TLIt>*AwY$E_2>rRKqQG<&U5BEMX-^e``{r%~qq}#DvT+V57-2{XwNM6B zab!2QN6lxuOtgOcpVRUZA%pbG8yhE+&pl0e^l@Og`)M}OxuRIG2*H=WZVP zdrMIu;#vsm3BzztP|@$r(HGr}iQeCyziXoaQ9JA-^C3O80!{ivVO8%hX|-6sHPlrS z-{mxXV6G~inEi6Z;|8-PyWx-?zfJfHOMLQ|Fdlupvg97WP_Dz3=i4jIxkMm$T9_8= zJb)Q=^_xs!k~Yr2C4CMWQa_Eal?$=LrnU~L*(DXIY{T;fB+%ce?>wsp&7i+1-^;G` zj&Nr*@^_0Q(9cK%ol~n=Y#w-B0Q{#1I7muL4Ik1*I(xV@Gbi4M2@N?XAvQBS+X01e zyyRqL@&Wk7?grp+Va~UYNNoaOc0Rh~#Dn{Q zfFV+3Gu&(0lWDOjzWklS-LqtmcU0SL=76#2$5N%4)7p%+nFjk3ip&@V0Gs|1P@(SU zHGu=wh2BHAsckx&I+Z1gog2wXo}_Y}bv1R@itK1s2Hl2cF$ULvH$DY^GuB*&`}Uhr z;PMR4U11-Imb4)hx3c#e#IY{s&$V+SPu4ze|A&SAKg4B06e6Ko;AKanhiR;mWIZiB zmk4Ilf+7vBgPk=39KChoZ*tap0}9Vh+Hpj#0ojf|i^(SZ;|l}R;qC`DLA}5<3qz30 z0E&`19B+S*)m5=N~j>?O839#BqC$Ozh=1^W>Ge4Zbu< zOsWw0I%sSP0_Qy-x>pTIw=?g#JxoVHATk(~vOhC=u7!h+J2dKZlQW^vB82?uM|CPI zaK{o%C+=3P1-q{_vRPkDm`JDd0t76AQIPnN0_kZATAkKtfk8ux2lilzDV`zzJtQfBuxg@|nix!eW%C5_O%7@ z$lvHISyU(8lJ+fu-#+C3l>xYAP-LzOo7SQN&jQ>;V8}!jFDH5!osW258BsNj&p#>P z<+puj?aVOQDU%Khw{uMvI~de7Ic|i0htEva&W@te8E`NgmL8wt={Yd7lr`7(QfJPG z8E+f{#86r@K(}?AiZa8buFTynd|C4e;5l(DGjA+Gq$LOlfrr!Sn2)U{-5M`2;!7&o z^h{$DETX7$jmhyb#ZDjqL%WNsln9lXdQQ<>R_2^<236<|3WMb8WEmyxdQ-jAUZCCk zgMdX>ZBFSFEly;fxx7Rz|<4dxlimVv+N zGiA|!pD{exjzH<;-O@bam8n1imwkr?ms$G5uX{irkQCle1U2O-K3k{AR2&35$%j4#1_+(M;oVk#;wU8!{tSZq-Yvxxd-lx#o4~=vuRnk|OtFUmSRa$qh1iRFJXLWqAktx?!aYw zvG2Hl<@F<={-9f?4Cg9;Rf!rH<$n4CiP{|m=~vTG`ITZ<+*+OluABV78;7~3z!VO9 z?wrzU=XQJNmn&`xw{1flZ9K+A2vw$;?t9jfIK}-iv}|9WB$~#k`S?uI zJ}q2YZqfgdDa3_%Qm|1|?6_rBV8;dh*d1y=8?@1>4MRDHC=gTWM0Lm2pzyi$P52n+ zqu9gQ4uMo>+(4|2Mm02P2{$*fTK9T5qfjwMy(RKn)wCJkb3O|!zCjg<6<{=TwA%Fy zu>JTeL$Huus}-%kUx!?5%a^O>i?=cn&9eGwO7y{@3j04IpzA9`@2N6037l6}twrmy z`)J-tBAj?;!NTTG3Be?-U=hmsKi4_WEXt)+XUS=@vi}|1>w9Pb zX>9m+-JQ{*VtaXA(JcAQ8szcsRkrQt9GMk@85WvGFc=hcr-q9+b5bq+>micw=Ng$6 zfEi+5WV9Mc^fbjHKTZ9WUI4~(F8z0o{&NHAo;I}*cJ`&w1lv+5@jR3Lv;qhn^h_%D}%3IqWp#0Id z-Cfsa{QDOZTk%rdzZU$nEXTSI0C#9$S1XAp2KK{bgIE!v=Z}U{exFn1 z@K-DX=xNh4dm2k{>D;S=_gDJG|Lw}TnFzD`FS!Yj@d?W}zETCues2_^r03PfqTQa~ z(MVo}Sb?G(ltTat2G_ScG3xcu@9XFz0dv*wKy?uxTkW$Vd4^KQYT=R%$I<7XqCS5f z$Y}>fx%SU3%BQ&>Y26(8az5hHKTn4WfRbo6UL|S&;6q8M^xQbJ&zR3FJA=4Cu+UdI zc&JYHU(zT??hj%k8I`v{vxND_b63Cr`c;1Q8^T(;hJxnrOpI|oQs}U-SN+k}*Qdj! znIB1g=OSnmJUSPM6vkNBTlGk0BisB^^Cb6ir;*nh5U)tvUeMrk1Wcp9$0HVUKCug> z5`V4E063)qG&3?f`(_LN4aR=S_IRfJe|Bg1+q#!fWHC?41;uy^Ib9Z1Lhr}zz4WQ* zH{#SIM?`Fvxt54IFNGS1pSW$EUo$mNab!o0|IOt#0 z3{uU((r{YL$;uF}RT(H?(^VVI5;><^`qbvIN#^iK3#F%B_Rj-JvS*?nRO8<|1NoIe z(w^jI)gV$JFHPC^o-D~~1hI!2{(5PHxHJzp%oh(nUQf}fG0U^@lsTF{z6BysGMK=#{@zFKH$*?D|I zY=6^lL5takHcEd_4w4p3PqXaLj;qDkm;KNS_gfCH{gSOw)7AtlwyKfwTMs|(5PRS- z(ecoaG}y8@HY+}io$3!=K|5vbvGNdDKpMZ1v_1m^@MVyhwqVi7)h_ z&G9PZr7jzI-dQG2wSB*;LX;#o6SE_}-z;|d(T$t_Wa^P;KAeAV{)`3~>+KSi&Dvoc1Jk2Krw{rz$rNA@K=kmFO?d_a5JX8O66#Kuc&M zc1oHh#n=C=lS1pf&c0lojBII2mIgGju+GME3y?$*Z$nt?PiH)E%hG~Nrhcwg62!&ITF*^_N;6^=3&6i&7}}1~TI|aWp;mi_en=~9 z8=QLEp1Hrjtx)>sDsuCxh20z9%*?(#CaDJMD_7FLd>QB8TofIMo|4W!IYObwdpNf9 zhww#pgL7mmh16Ba$;oMhxNGV5`!$RUyG%(eq2b!>Vs~n}-6F#D>*WGctA!yu{k za%^R#M5eGEcs_rBSX~4w@HTrP<&~K!W_`R0KyvgEEMkuzzt_|M;ppnlv-L^UgUXA3AgzqvFjY=>#H!}l+)6ZY(XpP>MbtFyy^ud=g&3sT=(CZ z!(Zg8Xiph~KGxLKbe*n{#>bS`pez_J47o*EM@FVoAVSvb%a+QDS{vSO1cb1ePexPV zG2%TaX|r`7!+i}237n(DZ^?c4N+MmnT~y=)Eg>ajwn5%~N10dd2g_0$H@WqHN99va zmT(gSg&Rtph7*1!Ufx>}YR42^%e09IvwPyX+pJ*C{Vc6?J5>ACPHCHZLt(vD|8d1);abjKAKDeap=O-olGjJId(EFvJ6o7>ta) ztpcP2Bd;7bXTE65V9UhX7KLaE3)3{4Z(-haj&0)P97rl}_+x9-&4=-Mn|r_URQ#&z z$dIt>a%EX}uFBoXYcYjFDr(q`%(*p-0Q&IwgZ+TqxhXofG874fsE-I-&UV79qgH(7 zr~8xm%t}J$;L5QN5}bxy2f2&x$Z(IU&B;ocFt$|AAQvr!6uXh=_GbOV){GWj`HZzrFrt_b^j1!fT(Fa=zjtltlO038IpHvY)&#Ks;Cf*t)TdEIr zEW8$>;C%Yjso68bNVAB3bLUR0)GUPP_9gwfvC)h!UbyX$o9Ayemh+71K1&Drc8cEa z?N8gq;#;9;f^sU2QV)yRbJf9HaJGKQYQs}(%5y@VyIDv*y`@f{Da(cQQN7|f0ocy{ zZqzAS=Fu-)4jJCl%icdQBPNB`bJF$hoVpCXl7a1WAMKF~XpI@q*>3EEAz! z%u~LMLxo;a3sIb6zU<|^J~PzHn%?rXM@14kE!JCR#x*G57S8%yNM>~O<;GG}yP&Oo zqi>JkRRo=Ko_Nw=Z@y>yTQe%`l6~d0_k2C)?c052RD>S_V-sFI)DbaiF47-^off)={1x4@FX3`?iG_=O zMNk@L*_GPHM-KCN&2gC^aQY5~JL^QaBr_ZcBVL6>4^NPNah>?#*27htMrq8DuP#XL z=PU54@1pzOkJ5n4KAqwiE?(ZB^|>d`T*w%Cl7I@b<7sM@w%e{ef%m)zeW^T9PVBwy zKD!YmNNKI2R3O)p@c4B9c50-K$W7a9Qqo=I0}RwBh*3Ra`CjW&OlNG6?Ir`dpWM-q z?ex+B(%NXD@#if!>nYZ7;h^q8w}mSnRA_bVMqmE#fZVnoC3V*RiTA>36*N1<(ji;I z`N3H+NcD9=p(%U3zG3enDHmy@umilJ3iRfNpN z0Y>*33Aci#+j^}5?yCb;HcakBuFaT$GRO!w*af_5vIm8C$kCi)cQhJSR*FQ$v5vbk z0Z%)~rpLCot{LLUbIUE5syr8gu!iv4nHOnEbSWR1Jglx23ONnq;P}kRtX@nUXINOo ze1){a8d`g}xFNde(TNi$_?@L<2#GmKgGCA@Z-OR^{OXoToO2s-hGw$scMP^OsG9e4 zB8J~;OYW=}Y>)~IruygymBh;3@K~8O6Z8;2=$dbn-XMb->Z=cFEofQH57 z@_8n1T~niU3$uM|j~`@oxkj!}W|M*J7FcQeW9tAkq}`$$FBMC0D?GE%?2NYu}gl z37QbZ|FUkX{q1;iKbisoFLz%@ecW*A!3S)_u(8I9UV|*320OI9$m25?3b7ApB^X^s z4AvcaS_BqZhJ~uv=1dy5wrgsQcTzQZbz9+H#gM^LULdF zV1Mmyp$8U-A}Kyf{9aNUYXjmxC?WDoo~e%s-`-vu!7O$!)<`DcyTeqXWTl}YTEMIA zPNG7D%$FajkplSnvFIT8NC{*q3IC17=Z3GP-g-jKtX~_#TLf$iJv7W7E7gs;nr4>8 zVS^NhBU}Vyqjju$X$0JLYSx5XLtX8xP5EIpcJ~#0V=_>haRzzC+z@AS5ZH(yKa~|C zC^Jg!tb0XxVQ->~1mBd;<}6yEKC z6li^(j#w3d1$#_GgJvW>cdHiIIjQ0hB8GMkZGy>6L(OWIEErk)Edq&*J*{wxc)qOk z?C(O4cp7S{3LcuczvbI|%Ewvgq35<|zcDs;nUDs{iF6ZYb+PQ#lo(yRODCeKXDKws zujq-5QF!(uzCMt)bLM%yKfSeVLiCbpCG+t`Gw`iOD32p;y~zA zf@-^uu!>YNX!DGupcvBolR%hjioE^f-NIu>J-4?9m5vN7*naU~w-#l0Qm=4R8HoO! z)F_~gyTgXo+)ObP)c!uyX!oCD-%?hs z-k6AA0(qK4U&~>$6nlQigr(t8^Wpk^E zicD%#6W4-$)5G7kjvAr5F^mvBH5ZcV8eC9J={l1M}LBo5i{2z0Y&2 z#ldU6Mc^zP$s8@A$O zYJ4b#%jU~;&(+qJczI#G)3yRlLs--qMJ-F*tA;?N*kR+jPqo)>z>CTl!RJb-yG}=$9}&yD7n2)CHTcTvrrKc zqCOA~zneRfti%(^k$SLEYvgDbuq3`uAteUdUNKn>jc*(zNE})*dryC=n!{8Jtw0hBs%&g5SD)I(p$J7M$KCljmEVIUHF|>#n@1zdzPvO>P9^1iN z_+h@$MgH?qRhrM=H1VXZB`tXpVw*#Tx586Z5Q&y5Ma8UX7;chk(XW8Agadm*STWn< zeGiXlkQ5-5x8?{3-Aw{?3$99!ea`1QHMednHHtdU7C8-x5;6u$-EtX}jPZ(3tz1Pk z#QC<<%M*Vpe|S}K8-g++)^l$+obd~D6Kgl1H}o95zV5%6QzL7)UN1R>7IMXt7rYx7 zQ<2d0_#x+(Llt8uPOrJ zsU2=_bf+rYw@JQ??`=&dL`pq&uZM3j3-%ZQ1+Dwb&2fUX{TnWk0c1+~^pJ8@yLFD- z+W){2AbEjwoNjr_T#y<WUO4*ef|KzJ4R$){rI>vAzUK_+}>#ee6%z>Sz z#zg?N#7!-z8+>tDWz<$w^oNq_wNtZ+y=&+ChYNAfZ$%j3z;XuAg7Sv+OOFMX<}Z|{ z96bb7^brySunI5)+2vSst_WlorTuNRA|f$9UJ88@GW4TXfND6JJnyoXkY$^WT+GRl zfao$6vO=@lVxyWM>52#V&lUR13%wAj2Gg;q|6nKBfg|jMQ268+JDG2(*r8OqF7&Bv z1tKCw)u1TGXNxMm^gjVOQf`wGp`mMqJGADPOiWCofvN}8l7ZQW&0OlaWSFML(Jjr& z8gzoh@A3IHUQoE6yff9(3qt(TqShcCvUp}#z~O0jd@It5TT#2pt(W}$`#to@LPkOE zM}DwYrN8jE)J}D(v^kgJKVRMvf&T|s=7aaK0v03}z&(GTyBF@p=s!>vcDQ^T9sj3c zL1z3(sH9Zysw2>{%}noaL2UfOen&Wt) ze(+=aT7R|0S3}UJkLM~rSAkWmH5zG3dsOBHKeay@q39e<;Tu_hthgMXRAMX`GT7Jo z8~{fH+DBikCVV?11%360RWF8y#mdq0Z+Qgyq4C6@t#6Kx2qVK{g zL|)zv&NF=HVhC6<( zs-Y;|g5D_-#p6$K{;a7fdOi9G%#hN*FJ3i)UMw=jY1kb%MdDTb=qDBG*1dZj68pDRAkN=g9~UN>*vbYycny6_I$$a&WSIyZTFUxuDi*LAaV6ci?$qWGBh-K|v^06Ez? zIW&z=KK|Od%gMzBkT8~@1_1B0l>q)DIBcG&>E(Q0eunPOH_(A*$=aCn7QMSVH9ZY; zG7_S@@@?jc+rRn5pViyKw);vBx&Fwm?2b(x;IA@OJA1j?WS&#hmPot+I6VT6c~{ue%+ zErJ>WYfg84Q;>OczVxPd4n5d(Wz3u^Oef`9$*m+$*}C8RPoX?ij0&;i%`i z6bLlCiD8cX3D-1>Z)VPmKb9c1GI{8qO_Hd_%e6C~_(LzLnHrv2Gk$Ozq zDOv2JJaqL-IFDh1=KNfHmXGWD*|4f0i)T*OHdog=uMfL#<9-Ge+7ktdBF}T;BMp4X zPzUiMny1_fH^!y)%71RfPAySyr^9k}km8y(d&&yocW^63h(fqipmMLH=2G9;Q}ocZ z;i|lc(#iz`gV30zdDZ88OFEkIYf5pm<0|2pX;(GsAA>#UvMq{$Z98H{$vD^AwxqV@ zyhM=ed1CHUPr~0PLK?^Ep`&>ZQ9+I&%+e0mUj!sZoNQE{_ z)%L!K-J2lC#i#1FoA+tyspCg-+A$xOE81qMKtG-nunrEc z4^n+J{7jQx4jV}9U!mjIbAQzO<$2`t+7)B=EveW*Goq^W!V@I~zuMk=zpzRpA2o4z zehHpLo=(gkP44!f-WfS{0T;#huG{pz;p>P{DiK9yx6{ZSt7%CC-7;Tl0bx0zfI04} z0k|IeWtHW)OuAtS!n#E#F=ALHEDg6FEdnpE-|&0(`<;?r!E7YvywWrOtrGm@X`9NN zx(t>%LCfe=(dnKBNtFzQ5SRL%0B2>yw)Dy&B}wc=Ve zPxfcMv6rP;h7yF;eYh&)EQIv<7BP>FPGp98>?ULDRW9YZcQ+f$K2Gdzx4>rk#c9N% zvTHnitF|Zy!z1G>mECuj<)YoEmF7|&F|<| zY}L`Cn71IMHkn{wv;1Is6)7k*l+w?)^RqJ&?rohvGK=w83DSsOh-Bg?hVJaxXx zxheI9->UFaPb)N+sza7J*Uyn$<^s#mK{{hBZI(<()gFcegI-<8$p2F9ca9-FIaeZ8 zxQ2MI%?=}z6|t(ZNbhFhE>Pm>y@OH4rAxFOT%9w{SiN#NA%{e5E>)?C^Nx1F;O$>3 zztL?VcT#+o#5|sZ{bN8;`A$WMf{~hyp;;@Zv24oJ!iP;m)nig5#%^L@{B>z2ayU(* zG1|#KDD#Ajh513f`e;)9KvF}Mi01EWt;$!~Vdzz8ki-(&@riKN!3zd;J;wy-_-8*& z#Tt&a!>b0xixfGPU?fB&iSp}mwwi716)Nh^2j6DTk`t#YE#r%2G*dn{wKi($t%z{z z{wdZn5nX4QY-7{^BwSn~H+XnC(bNMJ{C z{?T++c-HMIy*Y-IoCuLza*eF~iLt7p_smwWHdd-m9iDi+z;m8i5XMWH_1sJ?6snVq z|9!76xFyVWb!&QUz|Up|nKB=WSqgoB#=rB|b@am!%h0&pcdvZ&?%Q?nPwBe+cZ2l@ar?yUpB5| zv(hcEfq|BmQ!~yMaTE`gYpMUeg9YFYo>#+N=U6gsJf+^{=ND9(OCLs~xBA;!lcG#N z$YY1heJStEdi5TfgTppHae!5+NuhJh!KVj?-*ep+RhjuBJ3aSKm`?!y#PDOOQuIfa z_(Y)GMZq^cGioD|;}bHb;r=?SOQmFqF6CO_6YjgbNg`)BQxU5$?`Yfb{wB%JiIeWK z>4~n}3bHDhe|C-M@|0W`>n?=iUzlzS@0;G3miC14tzolo;_t5P{!TlZ0LAtmT_MJ7 zUTrxiZi|&=EPb`^YD41PnozuA4WZ%q7udv~Z%ss0KAgUw@uX&}k1f9lw@BYzxI$IR zDLDU{axNkMw0d7W{cZ1xg&`#yypnpr#c>&30GDf89*NqO;?Q}71M!`=V#GgKln3h!`3+hbH;18R^S zqYqmjZ8{%zswbV*%B%iDKzP4V8n2|js1vo^AcphaJw?@rCU`Uq-4ztd@!-z0*e;`{ zfpU32H2t^SI6JHMOVI<81HxTNyK7e%I!fDD4!0yP{$4PppEZ>Ki%9)=2jcu2D3*m6v?a zHDhy#9P;8bu{IvX!8rFs3ZGm2j=lC2^JDY;^Qqr=_3_^=;*?LGG|GZACli5zJ>>cTxYeeL&!ee5YzpD4CthFzh7VlQ8=WVNVI)l+XfyT#t3GJ{QZ zyxuaH_#2=WqW=7G2HSrBG!Qc?ErKTrtdha_QZhaO;>XkNgQkklDc22iIS!|hoV4?)meMv&P66Yt1#Y)|~I0^IgyLyzh)PG1BGc z6y#)MW8>C)c;AeT?If6u?O4R0f3QkAOk;lCI0iA(y~lDv9gp z2|Mfh)U$_H5H>cR&R@S{-M*zy+1R4v_3qyVhS-y5xott9cIHoc&10)h?kA9jrGXr1 zAr**u#;~+-#dFdhD>Hw$Nbi;2R&+EHS2A=|lrS_jvq-)z5OTYthvS+^RrN>s*{zB^ zC`#qYUH3Ts1a zfB*ynUqCrZcE1Z6VxBwH+rU5^EAv$~JSYT@--65U+Rxw~ORg~o!Y24R4bC6FWsv4T zzj1|)(jI{<%PD9nVmj!%lv?@ksxNNq5R^tbBEs?QxR($3u5k}EImR3ZS&05!b^LdQ z0Tre5j*!br%8rn$x}%T%y9TOQ72aDO`+e8-au#1z)0wO*s_;KjWP`S+wIj(0@&7zI z370S_+%v3@VOs@eciguAUHnXF3x~|QgPDCL&D*C$@=Ohco|9=qJ#GV(c{Nf zm}HxTgMzlXkY(HGx{9&l;2>#l+_5(Ay#pol!U-$y07_os;p_*@w)!X!VXDlyat%H9 z1VOUGSQsC4v`yEBHHh}9mIm+XX#g_3nf(qam0C6kLKqsTwbj!HAoVdfH|3`4tM6+; zYZB}YJSr*Bvazx*IdAVP^zHd0%14~WnDUUFA$k%iUb%@c6XKPIGT+x53y0D=({s%+PDR2 z4yxO%q}k*OgVQtoPM7b-kfN{f5autahMJOzyu-v@Fo&qwbk<7Pb29HhN+P()g5g|( zu?l@iWL&!=pGDR>x~=7H4bCrPw%T=ZAUwF$O1l}h`4rdSA+dglxtwRAVKhiEtEw~9 zc*S}X|-WqQMCsHn{MMEz`)a3ws*%V5|s7K;IIfZW~Z? z?}|4a-CQ96pv)Am!1rSf=#0*BE|Yt_>Gq+8w!9cQFjn>i>~Jfx*wH39%b~sc70n&Q zq_#<@+n~TQ)8B)gvXwT}@?s%D-EIh!-WqZ)E#=?ksW7#L_}p8@ z7ykVxlZ3&x)|Kc`AG~Qy*=BB=xeO?iv zEJLY7ursc*+vysC%+x!x&U3S6S#7x?8)!|LiO#Ob!_HX^%6D#})QA^!lKXDhfwD+I zk1{As16yUKXG^+>2ce7z517Hm8lg?K9gyj;#>IhU#kwp5Kzl{>rmQF*|iXuq}X2sIZ7ysRJ(r zJGjzWRL%kXv3A#cedqzBWlu^T+WnrugDOG&oN>*O)93aqEbDBG5ven;eB46dMNRIh ztc^d2z%3RC%&(K7^gNm1tzpSrG4Ve>OZu?G^e@LI>$W^yKY`ynAxUSJLvX~;PCT~(WND&lVK7H!YIpj{l z=T|%y?t^=?y@T`l;_>Zxv6SF7zpU1M#=Asl0~p;nHbVxKayX!dt}FV`cAG1z$$8<4 z>4j?6$@$vnXG834sDI@Wa^yylSf+Ku(SgnNp7{!mx;Mf)C&O_Si>p^Xctl3NcpG}J zYkF5xq6p0?+J+WuW-pJ%h`NeqmOh9Ug1wxa_xy_0FG#@l%`#Nd!Yc_jZS5b0T#*Ei z>4A0XVT|0{3STdt4G3foiHSevT9DWR`v z*UMj=%dh&ZUzY}d?9SdJfP#dC&xU-@+h$ab+`jsi$6a;Ms>w4w$L6_73*)*;Qxfx` z17l6S?I`B)EL8hWiiGK`wS{bW6+KT$jTgB`3QcUHZN5-CR0=d$n$AVGpV3IYA#KSe zM$XT^|Yif;ejHmf!JDTC@$gd)NR-I54Ii{SXZ~t3n`>UNgax|p^GSoUhnP~&yf>8h=OUU7JT>3@ zygjWxVzcbPF{5oCc~B!qn(FZ6d5?pIt(SHJr%Sc-fIle5M4BW9j|ng#*fbS`WbC2t z2xIP2fFv)^*G8*n32n`8kzg~=v(u$uXyw76nz>P9+xaQV79yxY37HFq)w2-2=rF( zW^u6M8@>bGfDt-TPZmrbxejS)TCcFRK*t(`)+%bI-5qO_z@JW$^ST8%DP5C#SEA4kau1A42JW*O7~}ptDAF zY}rVqp-@_RjrYD0@4&SQvEU5i>|}J`^%K9WkvLVw8eWj3rFE1=vh8~{-tT!QX?e!s zI$?vz5sL6Ev;lioP0VasNT6A~?OuFP?J%7h045pZ4$0iyDefg7CNb6_IznW*@)7S! z;CIkYt0Z*73cJfd)RT*bvFpXrrr!7`eVV~-v7Wqo^drh@1X1ep5GuG;Envcqia_dy z8>~-QG)v~y5wxhTFT<8{taqAhMN31|n`^HUS_hFFKu`;JLTw#Xx5Pd#6vqLOrrdI$ z^#Ck*Bki?@ETmHg#_iHW=AILC*}wC4jM!{tP%6QVF@GH}X{zwx;1^&15FN=q58qba z^K_aB3iFE#ox^f8=5qY%{T*}qDoL&zW{Gm)yA~vb!wovCBza27$eBI{e+jKU&HBbJ zw}owQCmwENZ5~+g{Q3_I_Wlp#;1Tv8L|%IzHv~c28i+RRgsa5sY8!KNXt0O~>u{4x zpxC;tI$h$N-?y*0p8DP6Z~ed~noaaBPf!|3&EvnII_oU@35$9C zIy6;024RKH&i`HwoJ?4G`2GKP)c)gtAn6gnq}9JP!VP{xeBNWQ8iuxHLN{09l9&?_ z^K$#To3uS5yYvSpR`%n}acEdmOS!n`HQjsv>09<+0Eg!~fPS*&w48nVrjnlek%y_upkfi zkIBr58pZJO_cn`pcLd~eiq2db*0*jNMFn5mPCcigv!0}-3;`l#llhs%TZkfDA?%70 z%V~Ub^E&=n;vSl4u4=jwgl&h!@jM?58&Jv8XgUjVdK+coEah5gZlayzp96d2AVj`q zb2rZBd$Q+~?9h|7S1$?r1s9y%0{CaqM?3`hS7kyU=eRJaSDk-~Mb@6}7R_QUh-VU2 zr&xSb)oSKcTFWM2AvP-oc@U0y8;38-6Lv0_HY4{q$V^VBGMvpmTekP%Z`aTV zIlXfR!>_+;Zf$@aP;$G6l7c)oODr+TMsRHwq? zCUC_&*rGYc^}ckEdVd@jM)hd%4$40#Bd;`Gy;J${zR^&B7e#n$CAt@G3TxVm*! zu1{UxEHxrxM;VBl#jFduO+10g*xt~&B3I+hWnpQH-tI$y+~|p_O5woB9AxHFjMTMB zNPknz7ek!M6G~OprLKrpigI@r^(UN3l&ZVgP3uqkXPPy3*Aa%#C-d(}WE>Qwt+S$D#v)llwRRh?i+~b0sJzue` zm|a@P{%6wgtTsIrTmR$7jrfr+zARLT@3G&ATgX)9qgF#0i76~0%)R`N?PxehZ7$(F%uzqW2ZcY~;(clpg1 zSx3;Daj#vqSC##sf#>ccLl4ahPmQyCj-VeIwzxMIR3?npMz87f$l&{_Ml(Rf$Diw% zZ;`7$e(y`VLC%S*Gl=3LS4iz)bZlIcjP>w@@mOoNEiV46$s(63`t+Y>pFwm1M|3b( zg4r(U4Ck$RK>WF@?)pz!)0m^GbCrUa#GZcRLYE*Tk%)3FrSPdF7OZJ1F)Uz5_Yku5Rcz0e9*ahMY2Xk)gl*8>X3Fc`vwv zP3K4suL1PwedR8r_O3FurC4ffIy8(DOrKR`8Ewd)Y*oLV%8Rc$b&l42-6}p~$YNnQ zj(5=X3qiNosJy?=)Ov`YTkJc(!s?-=j{SG_ATHCde?zFTJI?3aEM~`M!;|xp{1s{x zfceM7d#zHI0%gsdOIp%?cvBy$bT{HCo5Jd( zTb0pg(91+!NSlv&-P`53%lsne^A#&A{oXtR$^>^kV(-?;QZyVJVB`w8q4YtEiZ|Wd ztLS2p`DR~uhu?jNH|WVv3$n|glw~c^1zoF~6lp=z^-%3E{lG*kSPSy=(KXWr8A!0z z*PDh%Gh;z8?*=I94Ck72U+c*L@UzC93ned?;&Cu%q>OEP;RZWOzd8JMfh2+PNJoYO zZ;<@v8mk|A)l$`Sn}27-s|)`y@dVqDpbA85TJ?*^?BV?{9wWCyb1qf6RgbV&Q8ot! z8!mxp>ba?6L+oAG}$eydP^AHA&kc4)`c^I8G?10e_AsR|=0gCd<~- zLT&d2ohz=JtxS6%Uw6yGnJ<PkjZqPx`={NF{rfw$DL zCp^E%ZCctUW3AD-sPB*jp8tAvWenmhwiP5o);gXOb|8aB=u}?Y-p%M(E9|LidSsRK z)}(hJd*-BVcf*`iymE0MlpW&Av*iu9b?EH=Ub2OBSa z^@R*Sgh*Pzr)9gwJyEC9(o$@zW(R%aO!n5N^le}T|JWoxdHB~*GHk_t)y}+@q06T@ zd~oB>3ktTQQAMfeYdpmD;%4kl(cT(CB$(ybKOZ4Zr&}Op$Zhc0%wB5pn3l>TJy|j( zYU62R@!a~F^`@e5kB=6Sa$11G1G1DX`D&05gx@c=sj)l8JW~;SS5-fvX>}za{#=Rl zZ0Orj9djp0J|{7&#k5LruFrD>b|Sjh-ixC=bSk4*uYo1=^gK0ejVwsceGA+pr=+ev z`f{4>&ieVhce#^0?fRhU6lAZkI6F`L7f`TQ44B(D-!o~9j~H&O&<7V%u>e=SYwpnJvAYyb^l3mL}X+KXM9dx zs^WF6E5Q1IWLjId+z%hm%<3(kG>2!cx8lnNWqVVp{Z|tj`%?k59XIWIK|u+iL+Dhv zbn|s|lIuKAZo$U&m`Z|`_EgD5_^s&!yUZQRncxyQOAW7v(}ER0?S$V5T+HpMJZSMc z28WM5leFAy9*mebiRwaF9?<$WyYaEGVjrwOovE5+opvtu*N83gS2-q2O!*MO@2&58 znis7M7E7(fUTKhCDjX{bPfZ@z@pv%KC+H)O^kTm+yU?S;-X>aE`dwPz=6zvymplBH z%Rh?_Nx)C9eh$2@ImY>CdbPct`8fPJ4F0E(zf*ED$ExRQ-iWSh}mtnP8-ps=7_XY>LbHakimDkPpsuy3C4GP^i)kP?@3H z%|d$b^mB123bM_tsm!d%@26m7h+NBxzOX>yM&5no$~ADWl(dH2qfRlvwsXt(F3aey zB6lK4ub72W2H+(bIZgVp@#CpTy!$IN=eNoZBNIX3{wsZT(_XR%Xnkt^A`y_=2n&U) zD(KfV=t}*xszGD}4O>6lF)z51T3d{asH;Q~O0Oalxy{CxpE?6#a;?WnmA$ga#z@m$W$c_jNx_Rbd|w zo7i~P#IH$ES1Y)B<%@V%<4F9h0cKao5Fs>*D?CgqQv~v4hcqSaPmP5jY=)4-nAfz` zCJW_fe{I?Vx)uF^rG3xE6)D=b@0BH*N3^Ea$|;krSBDi_bM3^I^%*7RjU^vp2M?oU zN9;CR2g>o7Wct9Nha!o+>7H&T`MiaSY=XwR9mL1q9_qEafE6HM^b%_OWO_2m`WG%N z`e=XscyeN+E)(Ov>W9O6*2;8?WN|}Uk@Lzk0)orJzTix!%i%Sit_&~mYpa|z^M&c7 z>IkFPp3~NqOGBlWncq40ZdcN_T}n=}y+|84XkXBDKof&T<1x57vETvX6aSnVFHm`q zIK26kRnE?}LDw?d_esmmt+~wy(F?`T8$IXJgL<;D+}suB-9Dah`e~&Vp8?my+B&(3 zOUALL3)T#wor@ZBvn!0xI0GeuV(yC0CM@xIO$3CY+&48K4Wu)Yg379xakuUKRy8T^3-c6p46erg}odE@irqHs!t<_Fz=jPzMm!r1K$%wC^xTj!BOGTS)g-a80M#{~r z*>m(gVjXP>z#SzT0?MEq16xl+NUk|6ok}gMcAh!R7bO*dnzOc%k?&XA@cR{j?(~T! zi`#@-hb|Lem>0qxDbup)^Qq0bzFWVj6s-!>W;?%=7*s>>;$iXPqYYljyKz&XZNa;_ zJ?t-z!1e;Z0ecc9z;w*fTf%WJfMCa+sDM4w=r${szT8HQnpmtuD}& zX7xZ1d2pGj&mQ5gn)%BX7T;s@kJLq6M9z^N|G8_4 z3Th6tk!D|rb0^$nK^E4f>VW%4nO6-3MJhf|82(H%8+?8_sFBJQ%Sm%h ze()v`{Pab)j#i-o! zt}^Q*@kM>5d=2AnEFof4{tzi6qp;=lj*3?^en&?3n%3UaZsn7;2xbqLjEp01wVOzv z!j8QAeo4_M#lBXN6KG~#Yz9!5Qomn^t>@T1?PI$0PSn`33vE;sLio8T+pTev{Ih=P z>3>3{l9ml+j{IVBD-}2`bxFI=Lm@h;E;7Ndtfcxt^$4-$X{o@Savz`xz<4mZfMuMk zDkih9I{5>`t4Gq(WFEUkEs{avZLiT)9%z6gSvH?5X-N2-s?p%ob0o@f9iyB8rf44VqVf%WL0& zET;Q8|3KdXR#{y)r4K4_d^2uTk?Q7Jp=VlG_b|v~bkab(h-?K{Rnq}<%YpTx526^( z7>mm6k|}JgpWHtt1}#3EZ8Ao&gDx`EK2GmQ=?BQlev352A3!b^&!e1z|JEtC#z<>t zdc&pcRO<-Ci$EFT`w(OXJ)`M{Y1n0Zy)yJ|nY)|`Hyq|B&fyU^n1z`nh*kLr=Q`q2 zXDJOJHI=-sek<&xw6&_tHFSXSNyz=!xYj+-2GRP#M`_z!Nogx<#eW0Ve!jW9vjLZh z=fsuO3X_wrTwK(6UDC`E-`21~)S`a&6ZiThKJAn`U;0-qleAn3x6)U3sJ(Jodlu}z z`={xyVJ9s2eZ^QEiZkqSV*%+ABpF?cR2)5az_prD`TbN};)aCxH6UDCNHeT4sx_Au zT3>CUnp6=eE$DBRYSx+}#cA?v=zWKz4wr-!so+%acKfwwECccQ=+VUmEt+KXei~1f zoe-B^{c;sKD~_B=F3R>FJREv?ic$UTD~)=4O?s6VqTyIw_G^`JeJ)^|P|_;?>lQZ#D;G#wr4F_dmzy<7%{#@vhT1vG$Ls?V-q z5oj8eR=a1Liymvahi{=BTPd2W9BXLkt<(m9e3)jT@rGa%!~k$fn@(@2OY-Kv`TGah-PX;fqLj#ISeFlHMMcZ!in)&wzi!O) zuZLgXlxi%FQM4DQA5jSsuFCw^lR2Xj9 z!t!FE?)Bqx_b(BlsOTOja2l{mqco9$d+v#5%o}&j?RoL3Sfo@j7{G4JkN$>(4!0#$ zj#)4ViV@Mhhjd&sq{E`7%B0JPQ75`p}kJWi8$DSA_3{McIPEO%6LjvVO?bQP8)h zPyW|)`hLi`!94?UvL^xQv;;q7rQIeAgpxRK5jZbqe1jv*7sq~-N`R-R^ z*N2^1vt~ZMk0Wo|Zoz}WZ)K}{e456?0+&n|&4&5judi9wtK=-i zrv<5>xYM`L^wfXRSy!&dwxYw}=85Z{m4jy|zJnsYk^~44WKa_9Foc)8nnGU55gMg- z!UhV>%c_L+Y9zq*X+EQv*_A`nq#8VO$BHz>00yabt~t&#PE5BEIU-sjVw!{2itO)d zAQVf^b>DuDH%oMmU%J@tq1SzztyW5CRAI3Is6(s-J2slH{@oOnHZYKBMyu|fL&uy@ z6t6O?Q0s71Ok?E;T_pMV;PSg9z#Fl&_6S;FerSSHWT52Pkes@698X`K# zHdL^24M-Z}UvWq+#}AGhma|p7WXT$HS9Breu>xh%gR0bg>4CyDlvNnUYswmJBys}3 zw1F`?^=#2=zRF-FTsGiIrTNbLuAgsHR)AuCEDIT>t*Yc4WBVBE%6G|7WE)a&lCkTL zpw93OnC-abYk>EfyMLUJe5FypaWe@0OnvF8D!#k=*Z+~KiLNYReQ|0|w*GuqyntVi&cNAci-=yQw@Vi#M^T#X zDmi|){GK0EnT=r5sfU{_TeY4Oav%^0^|I2s`}5$SF@wP%P1ltTXi#ktkO9>J_^23- z@4B9o>e*yjmFxe_lkCV-HM&_!-e%6u$f&5Ou?ibyD*65gLV3IQRJG2rW5-B@hDx>I z&5bb?`UkDyvx;d~+>xD8=-QjNt&~qEn&ifJ@<-w{!W3M~YIxkbc+Rmz!5fs!x(;a- z$KWT$j2k{hpKv$liHm=7H%eP^aZyz~U#8`gxFFec3YPhMDk3+`f^lJBR*n&jjV=3) z*H#>5eWC?>#4D^~a^5~<;grEi%e_AAY>wfr*D*0IVuXpB%5XJDXhEF^tOqujlZ5}k zk=6@+nrsi(GD!JUPl5q--H+xQ0E#chOZC^yi)EZ^YQ7^$OIFPb&1+%WuPEPU4)k-g ziq=z6w8|E}q)6M9vEy*7g&je~5#f?!S17uWY|TKMjCz+D)DymR_bhXEwilzZ~@(T?=4nYig~8{4>=2flB$Ks}11@e~X7;Mp(vSs7MLpgsyx40mynk zGT;0-+sCyIo-0*5K}XAyT7L59`T2$Gh_CEi*R!R9EaM~Sqs}T^G`U>T(jzXsj5XU&A)%MxSsvKyuzirH-&ph%;JyC06TWm{~3yf)7J_wkskT3^nC zS3oYu)J{$`kX1xJXxXH-UX0w7l~sJ6g;Fo^F;A8IM{zI~^d=lV#u9ISnrB^X+6-*( z8+|ldJjsq6@ZWKZV66po(aQ+@sFiv@HlD`iGIws(?(X{bR4X8mnFgQ`KR;tvaW*ui z{Di=3?vbE`KkXJ%kKtAy!_W$OK8u9=t8yZ^+2;Rh+saGwdH;3G_IJ5o<+p-V;=Q}q zUeKq`a!-7=s!?p2vw2O*-a{-{&wt2kTh-+d8BI6ILss+Q8JkV^Vd`WayG4!Vk~1KO zr{6KJv1paBH;kk8X$|Wa=9Q$Fh}9Bo!0GOrY-|-)AP|h!*9fw=-)#4db3zd=WWD|H zuLTOEy5?B|aF}nWz~Y!kTwd0#6@O=$O$7#Ngp@41$$SBa?CTF+9ttBzfRiMynN+Un z37Wf}CA=ZqQ)_)Lq?EV5)U!T(>V*rneBrVPwcywp&3^lAiWMg}$|U88s@$B+?RF2( zG22Q6jp+=$%l~$R`(kc^dgWbl#Ta(QJO$lfN@KUiMrl&PmqFk-u?~9xMnCJ|PiVY0 zIdfSUmj>YXgPRUOpi~{4yXy<+OQ4 zSz=dHdbjJi@Tx_2Xwo0^+pTC!gte^s(%7Jc(95*E3hWW(rPBCClJ&}(pXK~BBQ`ec zo6w!M&qgmi0!d>%5%c`rW(_xyNaSWvHqT^k1u!(R*!CQ9d9Xz`a-5~|Sz&g2Owk!y zI;MqYsartLM=QG0f@g2uN3C2*&GxQOL6o0aagXCp81E0%J$vo{D~hOGVv%mU7W~s> z2LhSp+s8$R5oYZC@5 >c2Qw(f1Jm(}YG=5Uv?Ej+M9WX;Qa~ULrJL_J^-BRC8D5Cq@u#v4=5NjHb4p?-bY&0G3vn&JIU^2&mn!-|3&UY(VT+>O znBvmM8~zmzD!(FjWLu#UcP_5lFw!}3jbtB>3xt|fHC5yHNl)DmQcel_ICzE?r}0(* z)4~C`G72}Bpvu?mkJz&4G9`ex1#Fvp+kGLIlse@n|rQ@-Othzdx-tt#W)+x6Taen!K%x;Sy@x9C!J+rJ-fD*)4XCU`Spe@2hx@GIxFMA>{~ z{(a%|Ej}RbY97m;?3>wt;rwHUxRy& zqxsjJJyeaha84{f$zy8zAoi9odbDKqwfi;Q5zg@6F!fH~W9&QX*8Kb|?a6F&;HLd~ zJYP-DpFzo>7LBZv9|#ReH!>>8*`-bo4|`tj|?Tg=p% z4b-^zmibw&=&#ThN;uoE>8Td0f72>ZyeXxNk|$;=>hfPV8ok*%t*1RGkez0Y=fm+3r>{OhxAYF;=2a*iD^G2RKY9UI8Vo0e;)d$`=yJENYFs3D@u}xO`k6 zhE*}Fakyp@@BlO7yS?isZT(keX`^uTY+6yQaKg zzobUZgPJ3jE&lCub$6P^7b5`{+q+hB_>0r}RV#G=Jk4T4Xaxg*q%IY67)0X{K{I8B zKKj*kr~Xgk0MjmN^kK^kMB)z5O7EX#vzST(ExcNUDG7Mk; z{rCb!;(s1bcwOHX6^7Q1*^@c)kFVdF?79FIRu12obowf4u$NKYJ&s~c625$K;orpW zb(+6AE4eD0Gg7WI)K=TnFZNy-2f#qm_V_7RU!$qtxZhX-k+x(YKwlg^o_jr z^shI6i~r((6_@jGULl)X&o9PG`0)2{8^0L+zbt+5|CH8vH~t|8=+!ek!8>1p>wM!r zDzK`wfd%gV;F6&i*v4e5mGr++-Bj|z1*@`G*c@=km+n`Xx%OO>Z<}bvhJ&^d=0jde zZe>%0ItEF#6?!~rp2QK|U0lh)_NkyBExdJGqfd#vYY2F zkleB&ZI|)a>cEAm1rhO@Tp*qR=r`jyuyeOxN+bx3HKfp_bDl_>*D*VuvPbSVMp`x* z3qC6w(38Sb8|2?JcYH(7UJJ79CJW*HI2D85=cS zfJ3NpOnruTAi&1^&1V#0wh-S|W9NWQ4)-0NYwzKVo6hrwS~^a<#dSjS6U`;obk7H) z->;$f9b@YU8D)FkQt8KW&1DbDc6@y(VH!){c)SNg%);#ndD`=t6YA9Cb+kHn^BDoP zb(*-0plY|Qv_Ns90keESjA1lC@J>w*ko;J+*0r#mw$3%(67b5_x%k_sXMqnJ?KCPk zOW1-Fti72j?ky2Xs}!}FCz0n1(d&wzr<4b?BAn)T@`T3d@1K#|dN-JB^0H5X?@Hhz z+bJ5l&YNL%bH+9`bMzL=Mbx^I^{i(0RjQn-C7KM4Fl)iJmoha%fIea7gdAmB-GHCz zW@u7VPMAd&sa|m$;}NcmUcN}YU@BRMc)T~^ta>;ts%1|T`n5)fniW_oL4A%aO*71x zCQ}sD2_3%U*rjHp;oJBCy>9{&OE06rl)nzj>xOIHa(LDze7LLu0tF;9|2B4Xo-dLA z?w~A@SuHzuQ{2kV+y_jH6Q(~KJ?UN7!zmxbIQnPrup8BPJB5EgcY(B+I3Lz|tKA81VreQrSw3tQTl&GS9GInEp3 z%i4-~&9nNroE*M=EqGn1hOA!#&+?|75E=_A_oiJ9{PQNoWv0wqZ0smvtbV7GufILi z7*lFv2#_pWiWc)AYD4jnu5G#~{S<})z~%hct%;PG&Q3MD+CvVaI4Xd2mRzshDcAbI z&eiq`O>TP5bFc6Agw&8`;QSxn^sQ6V6l+TO4Vt4#(~jsiFE*x^8?uWtH1?QRrt{zE zREK`y_Si{KmHU!4vA^ksP`qUIQu|TYkY_;J?3NaQa7`iKZoK1oM8x{+bXJ=&Ins0b zo!1^crg%VB2=RMk=ZjHLjW}2aTf>~?HIIp$voj%iK<3ytABax6wHMj%bFtf!N=|rc zrBWvj5T5f24*&QLS)C^!D{JY4nf}~Z2cm|eRmUrgNz&ayJS~%Hnm*|dqOaiKJ&9bt zLsPtSc{wLA!=c)TiXXIlk)<&KIR~GP3Xg%m>pGN?8>QAxXqdXA_R8hnElR9M z0Ul&|Pvsk~)}=r%MNso)(0rH2&!IX;2T9#k!#P13)biu5#$=PCB+gG8@FqRed`H@;+tW%?!0@o9(Q|3?KB!uV;tjg6uO3MY@c1 zJPqC*XTnJ+R{{fAeRP8AJ|DB%rd-s&vE>^4b#S9*XNER4I*{|~$m29+n%dz&>GY_f zr`wN5J5~De^48D}K4E9kN}diwa#<$p1(nnF?d00-F^HMySsE%O zlwR`+pip7=We$2|2(uYT!&0~QP_8S`A5yg68<3t^yVWoEG8QEmy384_vAMYxY^Qx* z%^Qcmo!d+7@Kdl?Lcl7w-08QB=;o=FWL^*jW#HZaiB~M5lq?3E=L{HPdR4yuXUTPe zw5m~Cc#O`tPC;7KYnwtM?BS-J#?|}l$gqR}Jp^fC#JyX=~6?5pqALN_C;YzKN?DmC5 zCtB;B1B7lHN1QjZFs7Omec>;4)NA4oe>H%@x1b0=gvKl!P`3spI)t_8(F2@&B>ITb zL+>m7^x{gv*5-lsDAo?hzuDh%R#q{aPbURRMxx0BeeVaF?nDyW=4zVA`{NrfJAJ+? zFU`?y%p2ZE)SAH3yj4gaHQ-(Dx-7{125pnZJxxWaeydEv9MCrRx#;^9*P=he=Up}6 ztcygg+LTBP`;iJN& z)7;yqPc`3RfNj6ok2fGUMbE^Hh)!VUui_i&@1DrhT83{=^xWJAcpNW&HISHF9@K_A zfAF~lbQu4BI$#GVAWt`G@sjv#GtULQEwXsk1DJQBYh=#X>sFyH2Lo6`-m|Eh9-k|v z&utmT@e(+r-q!ycFjaEbN0r=23sO`z)iYyUI+SGlQcE`z#mQ!YR6^RMC9hKva=+= z+HQiob`N-yT)Q>Hd4Ok4l81jX%<<^2Sch9h#Cw z@Lkk=zT;r}Vh}w$hn>jyq#^(1rS0I*-_&<`29?8BZ5m}|2iOlI5%}EZ24_+r%6#pl z2cK|-7`FLQ2UiOI<|SM2y-cdo6+MD(7%s&hDAJ!5AUfUSnvS0c3J=%6OWa5)3&SK? zl%*Wa*d?^yHylYKMGUT{-LiI7#gi0+Ea-zZ4S-L$V@qQI(e~OhZ8Grpj@@qoqpYFh z(V|7GorG_-a?N`^dl*aZ_(`|%h0~rLFl!GDNK+(#^CVJv9eAxu zgMBYzK{0!UpA@nnz}bGq>JnEviu#FwFRs2L;2X;Aeh?HRlO2Qaoz*V-glBZSV6&aV zEfmrMIL%^)c+41JG#c^rARtjGq18sbzFVhI?W??{zd*!_5fE=;K^oAlRV~gD4Fq9x z>6;7Y_InXX)|_|R0R&PVdlYG;?@je#*%eCptDA+#r{Yg4mQvX_dm^ak333v1L8Sq` zQr?lIHh2oPS+UNpIEUsPiEPV>>fDRifwfRs=$(b%cUjX`AaFmrnW@?T+%MuTfzft>wzZ9yDo;b?=c@U9R_);R3b2zQB>F2v>K1y+5Z4D0ItratUP`h)MoZK_d&E; zu+pGvcEEP?*#zfGo`9_z-pvv30kK1>N9WDDvSgSa0gBFZOIrR#8c#?jWs=79Py8y) zDXC2l=O;*Z=4ovYIRfj|Y*(H9S6BcuHkP2 zK>%R&Lmlv2ps9;CWY;#Y=7GcC0&*icNuI@PGFp*lS(R^1{V>v6lC~mpiUgbN!dsQ} zu+po#0-j~d6AkTsddhWnB4h3!2iNO6jt1HXpATC7G9FttW?Iwh*A^~<9cI%mOF@?8 zxBhHczGzPjy*M>d>q=&h&h3q~S9>2`f;QDN-HRjlX*>twN2VRhF{oF;X`iqqXa+1l zu4^@({7!{(VQTR9T7?a`j`>p#CU5D}K16iiYSO5yTy`Rd{5)0D=3j?UH|$6cOwQG> zqjiDQLJmw28Xsj}njGc_$1{iw>z`+uM@AZx=j-pobl=sr7@wEZ%-QbgwB6UNN#aY||9lnU z9UM&HTAo;PA{#=@!za$6s$KKYno!+&rgO2(L?DcLB_+_ugrkmovji=lR!WLit^?$y z@Bkx`)#%L2x6Fi8?$K5#B%f(gs8(N{d_-)J_j=w5k^XwE5FJ9w zxiyoaKLgvg1Osca%i0c})V{5?J0Keo64k{FB*Ed=V z*#r2~H-Zovo3{=c{1W49Cu*rn-e}VJ_{PM_p$|#cg;t0U^r%&0qY zs~5IJ&2HD%&;v}HtDkcO4Ga!%2EAORR+$1^#8I~ zi{*dJCwel$VxA7GXF+lUrg$byKRwZcn8~}=>JUBlsJt=IB!+EAoQAtx*Fx8%Y?$wO zMzrL~@?V%W2RRVk=Z{v<)=hUg2yebJ7rFx?1Kx#){DUapeJu`-nnpW)Ry0dWKwH=8 zgSh&=4PV-7-E^4Fg%?8x>x`eBJ=5k3p7_ZDQY9+x*eibx%q&Ty9B~&ZxG;Kk$?aGV zx(7pGw&pG=&*Ylq8 z?VX=;B{MVE9CK!jIsW(WzDJ+zhmrba4r6@r_fipq<7bj-dIp0r?z{46`M2z?Tn%+; zXPDNwaQley9fygHi-~^C7}}}|pZ7;GEt0{9b^KNiR6U2}STies?ap{?%fjNq!>9YI zzSk!?jCaQuX9P99n=G?{RvhUvBRrqNo>n1sHPL%;WjZ}KF!QZ9ofM^X+#suYQ86GPhc;3P{MyF%lA7YOjO#9 zM{O`8qGMTZ>M(t0RP(pCY+l5=l>at!CRVFS20nSq7|X;be-coYt?uM{^{WfH-QLe4 z1-HomsGumY{f8pOP0H^`mM;(g^-BBRKQ!zw$NwR80|IaV@3($6>3_E+x+7Z=Dugw9 ztPQ?`L&W4Y1kkB0_o% z%(3V1)O>%t9mPcq*|xW0pRy>I3KBRdVwS96mQvd& zl%skT3G<_-mrFaG2}x4WKjxXU`hW0~DqV6LRMOFonQfC*?G>S$u#mPOPG&%+iD`$4 zPY5VbbU0P)0~KM7#8g_Bf9WGLE(x~PihQ>^3g}eH7E(JdW<4)z_7}QOj9bY|ZI8#k z8P(Bs8=#Ps?3Wr;qS&?Hazd#~!s;w`vU0!8S05Bq_$Q#i%1-g)1r>_UyDM5vi91&i z?i+EH2=aCNz_{(o8rk)S{hLW`+qEXqwY7$qKz3ZdAJ98?Y2P2~n@x^0diwaJ{O-`) zC$!qA&yeK~*9YMblHQt;Uyu3)8%UDXQvimqU<%p9&*=+Oh_um4m2Vt1EG(3HFI8D6 zAt)~I#D^f2qJT|KP@##6hfarln;N0FBWuuAWr_HXzCwYH&}46L0)PUY&~lps`r?u7 zHmL1OBC9a7X=sOk$TGV=^t6nJ#(lcZ^LAVVj@;bVNiB9~2Yu#?mJ!kq1wsi=@7Vvt zV@Vl;pR99xEu=cLg;dDwwGtlO>iAi6U8e{n{b(p3@+aWSIdO$5BTS}&+xs&n6+mFC zmdLg-^RkY(K*sFifH~@)nxdTW>cG?bN0&|{T!(}Go79Rev5@!!XF+yLQtZ~2CJ;5# zebroB5fb-=|Gq(&%&30v`&4+UFCZlAdN0!JYMhCjWr@BXP~c)F67x`JlXi`*UPLPc zL~-^V{}!0giz-S02@x!hwYuKh&mM4SMvMb>5sJ-+L)`}P)ED@E%> zvfW$$@xK<#p3VZJdKN=ieu__`UT$&G`52SD{FOc5*4e{Jd~c+k5nBw$wDn} zl)WUEvK3WYsQL-k(yai;!zF(1onbToZL>XP76_SNV(f#L{gtAt21!g|r#S!PWIpb#5Z+3O**veWEC z&%NM37AK}yNcL`AvlNcE5K3h)s-@GBs4Yl|3bKRIoapc)EINi1*VJ z4r-%xlnUv-4^weLq>3*~3jzrROB?p08$C`{Z(q2# zg4R!pqmQ^neaBga8{_`yGbgoZv5(lj5|gn`AKd2wE;#205+y>*h%Yf&^y>A zfTt*%z=ip+IrkSQ7af*xF~+l@sprKeGyiPLeWdi{LY^JG>%Q&&8{TY>_vbw#FqbAq zLq+$?{{Ts9DDt3g0TlXVyi@n~J1zs=B#cPCZqA0EU@Fsz5V1Q(LL?l!#acg&&QF|I!9BwUMDRNM_BlP4AmhonbUd%%ZItQ&^-EI${>$c zTUDB%LGggw5N9*fQ*Fsvud#ZQyotFTlBY@o;}y-^Dg9#NANj7uF?K$1pI80VEbezd z+AJ1(g@=A5Q+9vrUg(~*_SL&JVmB4^G+1;(b8;pJtV$7ZJNBqai?>J4jc(`sr|cea19rVSUZ%1ZqqJ^q=9nMgQaTzaH9kWW(Dn|(M#k1?hrLvu`3x}25T zy)cau{jN=1q-q!!$!V|j1i3_x{sAZrY=ttKU@+zL^g{qPg=V_jF!s~{55!6o`uDdW z&GZr0bP0d9v8Y1!p~@*Jn*Kjo=fw9T@|TNbRD6`d^j{?KUbEaOB}ArlYy zA~LutR7&H-IG^g}LZ5D$kO4vGfY6w~hnwPPNsMmVp)VDg6N;VC}8Ne|%FARKJ8y_tn-3 z6q=Cs&{5}jP>2{*+35Z7I>I7*m4Bgdvi)P6T{|)Rhbfako3rp*I0_=D@O>ws|G?h1 zO3<$HH~5xmJWtL#2IyWyCZ^HdMtbbv&r7HERScj~Sn|b}M?!UirS!S~D)@8bap1HX zpc0C5G=MtbrPZIl%kD6@f+(HP*EtrenJzoFJ}JcQhTD^~3Ocl}nK zs)ubb&rBn=;yY^hR@eo_R)ZZyMX#8ML_p$7u4sr<#29u&p4U`QOm~8bC_*xWjM2Wy z-gfyp9bMiA?+~)V;kGSkQ75;LJJ&434cEj!^zMd*2jA2fb}dFoT{Y22Wivz)M&!Rk zyi*xE$;E@S*wQ6+okIZO*Bo?tne%jgm9$MHW+R|B^S-c%T_~nP!IA!J=%R|!!+Wftj}Qp^(@r*hLq`go|w`U%(>@boMPhs<>IGsJ0q zqi@~S5DVz3AJ6)DlUPk^p_nEgbR{kXdp_=#+=B?_4u$)cBB9ZdG8W`iTYOCDdaLzd z6)J2>qsDo>pNCUAz5A9qZKnw^N{%C50>L%k@mqM|ax zzv;2S=m)0n#7*Cet>v-&VMz0Y!Lcfm>@w~z(`V`%XAKj!HLK4%6!;+){ReAkK69Nq zo(r!lue1>S=G;dY>pCnN5^Uvm?6ospD|Zy{;4TRaRzKqfAkRhb8Fjo(80UTtFA^rh zh+v}*c|Z8HRToEJ!bQHS&61X$8MrJDMayy)s@i3raVWjac?9a0pJo$9cO#}AHYHyj z@G`=s>t<0E-@1QEW#AO$L#tmdQlkknEBFk#epB~px{XlPFF4x@w!{yysm7)^+h_P! z57x`Ha!KE81hs_CV5#tHfG^rTkE0vA_HQ1_i_V;8<;dk^@%?(#RVX>2Jc}A${(kT^ z|6k1|bXwPyN?;mh(3Jg?cJL#?lj)$7fC8HxKk&eOe)K{Q9$Urkqhld&D;Lst$%_YI z9s}Yl;bCdKuHN>p^K!HiE1UpB!NN)@E&B{@RM8cX&KRv=hWIUS-I;Ko$iP`CVN4AT z9QCR9I*xf(Uv)ono9dNk=NF-m8+uajF#)%7vd)T1OJn^gI!!~U!(B?MjHO@~tlvW= zvQ6sU9Xl2>IP<7!@nBkfixN&tbt?Js2MpkNn1|w4TjJH#TtE2cU`LIE9ka3<7g@CM zkXKqc?8;aEFG=5;m3cPYc3r{mh5?=T8o>Z3Rr9+Y?m4Mqu<;qSLz8;8GpSL*1#D70 zUy{Nr*#HGvkd|LZNNP(mJoP21xfwtBJo^~y+@-mGojW;tn83mdez&~Uf0(HK_ueY~ zHrsYgHNY!zo0ldhHh~%C94+&F3GIBX2c}!A<$!sk(D)hY3gvcyCmFMS1r%KA{P`|8 zlK;Q>+qcHfb`HhvfALO5&rK1>va}%ON>uJ5+L3G^FUGTG@8{R*sk+kz6SRE#V1Iyb zKe61_5tV>XDSI}E;y&wM9_;n{*jQYCXebPc0CX$4S;*ULL|>XzEG(B&W*h-yIZ6%z zNah}0h@T&l6;`6RJ1OTyC?rn)@co4t2!)Cn{Z=YF17u67?9g_B1+MS1 zaj$YRypTUlRlvev^ghvT^lO2+f}+WW!{VTCA4N3C{Uh$wswDN30$}o{=@GeLMil)=qXl#RVrSOOhvj7G!(6dhgRRch zuyO*!{N?z5fa9=f>Uy+ADZ%WRrx0CyUzUAhq;{0i?4hrRml|ix9YTN4?bwNR{i!*H zdrQKuaV|bysHRTeG+k^@QE7Ka;KsDxR^OFKn`-mT8=&+lrYgC@Jx}HrL|D$~Ek@}} z`khR+E3)`I{hr6qhW?nU4 zWGOlvCFd^;yfZ^AcX;kKHZBeeQ`dL^!1uA24*qk_)ReyrG5(-9fB=^Nr(nd`w<@HJ6dPG3-T#yoqcC@ZChW{pO2^&;x|bKqdq zt%l&q>rsmJI;SQieI%EyH*lohzoRaVwBQ$~3coWWjhFFB=5!3`kyZxDy3}~z>#DE4 z7W%tVa3WmQ$UKeyf@3tryimem^cbEY4xyh>g6s4zaEW%%U2s{RdWN|o`N<)M&cC{inea4B3s(fHKH8N=yVI*Xc&-&ZJ& z7AeZda%rG*`w|rJmHwakk*?*^{&_eV;r@;2$bz1M(LS&W$oSQApDsPk z#5T2iA#rj9Jjzc*B} z=$_*2VF#vqjFhfMDf@)MT60HmUAG)X?33zoyj$(uHje=5nhT1LV(M3L{PpD}peJ{S z>(va~u0o8*C}*r77|@@9+?i4!E^r-~v-NkSu_OVNC)IO=bBq3gJ4MAtGKyh3P`oQ7 zq+0GWm1W>M6WlpaLr2o?wJdzyT3*Pm^pIILAj`Uyq1t7H?Mt@x6ALw4y{cC!EG#?^ z%1c96jE^1)k?#H~YV3S_yz%w!K-2o)W)-cm*D!e>kF8@;LVhmWy68YHxD)-G+$I+M z;k4PP{<5s`5eKf(i%u^1?aI-?jl_|1xJlx+rQG8z{_l?x8c(Zkr1{!h1ellh>P6Kn z=w)cMh%jufGRAC{9|jjjLs>pya}RHOYoueM0c|v&&0En};!*;JorE-}zWQRb_w88X zPS8lur#|h5y8YW8?(et#3ws@@YKEkpfeN+}n!pwCb5m$Gd2A<^EkHMe8>UgY^Q^{v znd;vAm?8y0I_JTM9O22iKV+}v;zU^zx~%epL#Z#b{v^J#;dG+cJ~k-MYEvPSDk{{Y zGckJq?mVX4$@3n0uem(Q;E-UIM&(DL{9HZVn%8G6H5#+_KIAaB>HlCoZ z<*VoQ>bFVzLoplI;bWED6)?(Z)nPS5FH9*cg?52IgG3n>hOR7QAg&3AzFhjo%s)eR zMEJ0d4U~)zGRj7$&+if-v_1HSQ3Ivqp^#uXm;N87!-xMlP)S_&3eCBF#CsO=ONs#Ld(f2KRam2M^Pzz5xB~xY{GzNye zk%YSDgQMX+MdAG>LAy-uzefH5h+DOMttJ!6aLq%I6Nhgf0nR9zt~<5n!%98<^HVKi z3kf!X=?Jr=fTby~>gqyJwn+7cw*fHG^z(4ZScrrw*htu>sjNoV1Uztm-{Qoi-hi;4 zX-Z9$FIjLnzl$X0pMmcm9b?oy&z-HPazF0?$$*jabR}|C&lO}j+U%_ba%8a^JhuSH z$jx1>j+MtRzWrlv37Ad=A zK9>sD;ZqHB0o=AidwJW(s#!fGO={g2+q>rLhG$BrC!n%Z778tN=a zF8MLeO)1$9NV49qQJje4dp;ZP1PI{<&dloA?D>4Emtj_f8(5K3U$4_T%(#P%^U1r^ z?{jn9L|r?0Fm^j=&$P)#7KmwAGqeWg7zwpF@9r*hLc0p8d(X@+-+IJ>W*_vYFZZ*> zQe4BJctOmJ%=Qa^7q|lJ{?9JK@%z8s20s|gO>uO78XXoz&slh*%*)T+L6tJ^rpG=7^`ORiS6|}6WMjg$9MfC%Sw(iYDm`qor6AyL9E{94} zt62ETROy|`#xPuL!iURg5~^PAuUW$AI-Ta90S@#wVGFA5`^%jMv_hZ zikFx9luegA>p}RFcGSM=BF2oj&--y{2JwQ`vofKze9ykeV`lux8=BvaT*q6awJs@L$2-2XTc;MXTyN zM&}YNXKx((l9VOetbXuN{Ch$Wdx^<{K9S9=(f-#4RQrFQjqb$4YFTrTG7sh-6)_tK*qnr{ol!3fP(Z;rQ?i^s|IVDk#pr>n$a^RRb%#1Otsp7 zpkmbj$NToVI2PMZ_@7P*UM!4c$Ch&@oLxJFTz5m3taLW3@-WSL4o;Nq*VBLe`H~dy z-BFf(bRa_m#s#m^9Q9wcwY(nE7aip)S2wKSID?9U6>uF)CqjNrCv+o*|4jn=Pk1dW z$7c9M*o|XfY@}rd;K-IY48J-0d-{Pq^M9Al z{~rST|G#`IJ?WzuGy#1E7k z@&i(VI5$-i5x_DB>Y2@`N_l>pzJ<;&-?sJhO=>rD*N)zhJ_Z2t|2AUgR^Gdee}&5C zD0nbz@C?&!_R-HJs9DecI!}h13+QYRBB7Nj_wic9zZq6!^Hr-wH@V-+h;NskMSFiFgN{^0p?O3C;!L$Cs(@pEqrcAr&@zliRwFfxMzN@I>9ECSs zh|zCxtd_Dq0x-{DB}8;fn;ku(8%I<%ODW;toX%IuuS>MDiibVuyRwJ;c44|w-3~Ch zc`&`tnbiSjxBbPDpTfwiGyAKMtpAXe2=Vpoo(sIxnxJbs778q~Nb=?nAAEo5Yx2gN zx8PcdJxdit9ukGbao)P;tkH+q@wOyz(2IHXWA+grUsnM8_B4pSRl(CcOLLFy1Fdr- zG317CezY@ZK)W2!Vm`ihHJt(Q!=SOQdFjA#jOjeox~!KsJ2GZfrRxmik~+vtb|DVq zV~3G(s?2n~W|Hq7UT2?~S!N9lwf7$W;$HtpqO6&h-{yOo`w|92gX-XwO&(r^RzDq) zJHs-b)zUfxvV893o5}aZ&4~y~=zT3GX5q`m-=g*DLpPqy^LDh+H=bOHc zi5t7t;nP@Zq}=jG-a;2{3XO1dxm(Jy?1qevROO|+jLa{ss($0s0OtcAcAnq~GIM=w$f0H`bdP@y zGWRRM(^G-85r#}pilD*_ShzncisnxFGh3gvZYRM%=3LjmA(K}yb%`{q3j@s{GR{pV zK!O%lR3ua`5H@2?DYoCzDS+1zp@kMfE1Q|u^`BqS%06DZAhUMK&RTLXjJWg^3zB{Y z96mG|=akJca>2Q?@|=zs4{lho9ib+1PZ5+A_j6R68xD$w-?C3NaU?uk>*Q>*LFDra z+nU1TGB2Ogh%;Ba+d7ObQ&Kj&+SbR(!(EU>&1(pFf0udnu6atq979laThOTtdyjtK zH`XS`NpP;?;Y*R|)KtuXqIUSw(+h17nYrTYg25y!uaXYxkQ^}DsA*RuoEwoDxbY@W z+;lqk`5fyHCN2zu9HTwbv8>J6m9y4J{b1{m?FzmB^6p?Fh4j&ZRF$xJkF8$H;%jVQ z2Tc26WG`3nuqRUFu!%Fx&HR=<#??+$eaKct6YxfK^m+0e*=cfOd~*($W9LXM zle&37gY4B4QFJmwyRQ@LRx3ScM(6C4CN|bO>6@A7aF1V4(>Gkx&kPwJt=G$;Z_*DKEP9gZ#QCkDMZWDEJw0_NS@$cu}ylDq5$8tTwl^o z_5tU6-$gr-rsyOm!9vX1_UX?nLr6Q1Fu9fIWvmdwoR=64PAN5A!E&P`X;RszrnxR8 zV3&x(u2oRds#d1)R=7CUcmFg%ID+rOqcnm|(2R-_myYGUeA}G=43_**9NH=uS^bgj zBB7<%Zy9c^(khEoW%NK_b`%yQCLoJp4yJlwB#R~cA z`MN|rQSDRdI=u$Pbs!ly0u0HJovr?;k57!eDn3zlt%qy4t2BE^#M2G#T#1eXLbdNl z?#S9&tL?VsC}OR`a`dM9EUT;wE4D(NK=Pf4dHAKS{f}1&aK++_c@uU~8;1eH4>b4P zh(G`4fxWcM$P%i~!N<*;qw0r^izYCW1q$O_cDBP)Lp1Z{WNDdxuB~_ei*kA$DGn9R zZR}O2RHTgWgy9BQkN7cRQ90J#SC^HKMtM!oM$P-Go95Xx)aHzO1>+RF#!G#n1ojL5 z_`liw@tdI(t3$UT--8;FGi{B13zH7hR`0|7PneaxG(jbTA0^D0v=n6_bq!=GgtuMl zsJ|?htK9Y|_&YJUjlg3HD+*3-0Z|Y$13flxeG5DhWQfKCJLJ7~-xXFJLhqhT?)?~yD7Pda@ zoMJ&GhrfN|8g9e#_x6e04fAj_(YCJ6IeoHw`zQw|&$vwxD^T|v&!vDqaKGCeJc%XJ z17BRdCeyZi1Ed+%2#>Tq4)rZ&|8q^RR>9@<73C`3vAcI^V@D8q`Ag@W#}%|s48&?x zhdMPrravsXqP1mN`{$Pv7tW^U&S?s^5fU?hgfQCv62M+Q7sNSK7js`v-{TY2_q7o2 zhT)RW@(?(2lSl6R*fPd2TQ%G7o?f(Rsp;uQXs0HUP|!|(mUrcxzOmOvy6IcQPs&HZ{APZ{zT-c*b}FGp`!><+N-O5@x*@pJ9{rbU5u55XufDe z5{_CbYYC=xU}fK40U&t`?tbatnhTM1B&t#dNj$Qq7b$woOq!~Vz0%DT}y z_!?Vt20mfEGpNi@mXy?Df7w^a`Si(o54c0FXT$-~ksI>2CMhmg@f4(N*f;~FNkwd3 z9A#`fgjy*dh-LU=#(DXrhESH?vZD7BJX1s zr6Oijiq!=@(u^RCQ$aGBgOs-SQquaR@@Y3L7A&*40l=_gu1m>g+@D@&JhTp*`BSq+ z^MRNVf)&)@l4qxyfD4kaD7eond#)U~$SPzU>TGDZ%X#a2;2*OWN7npQ4|4{=lFw@p zUAN!q_N(4}{IrKd2Eq~`fxV8$0R4k5v0^Rl*1f}XdCMl5&gu}+fvf2j@2=p|a-m`+ z2;NlmC&v=i88s>>wXk0*XqH%2vwg48wO9I5o4CAyd&SVO889?GKrI(AdGC~A#i^^D z^c1K$UdHSk^`nfVW`nA1cs#J@{p4+5_A{VnoRGB)hy19j#-e2 z+)cKpHD^QbC+@Vpf#GJ=6VkN{wVZ(az>VYjFHn)x;b%?krQ??k(m$eP_xoHC7YgLn z?YO4u^ke|YzqVM(Q<8d$w?4RnFTQEZIp=cPYOP#VS6U10L>ZbBm2#xxBq3!1b1H=W zD90<`M#6Qd>zmg_J3dOV8*N;OwLD?;UjKA~_>P(&Ug@K8KG~phWr91i-T@E|l4h`02U)Oee|PBwIPg;60@`j)n?Te_yy(pC~CXlgZ`# zlCA*gbjwhWkQOc#(FwS=^L_3nJND5O^^y+gb>>|j1={#yr$OBYEq2rQ{@$~6H~Ru_ zepqX;Vu?dO>0^eXWHJY}(upoAuK918X$cUqEQksAO#H~L(|_cP_M=iEjbR~kV3q2f z9#c(Xb(7OHxLn>h+1fndblAr%lrD1$t<{+w`%~xAJ^>J^h_44&aKXx9OgVL zVUPcqlP|j^T5#IP>Di}Jg@+tMXpvFiTA6}z?3)eKZ_{7ym(W^-bXPR&WFdFTp^~gz zRkz9~}0ysVF{KS7jU7J0G=n zUyBkj?+P>ncpA-#QHOcwN5aA}(XC}ZHFCf{J-tr2P`kADa~kU@)uGc%)m}?60X~~@ zmC`GGdq488s7loVqy^sHV{p*%CWOS z#Os6(TR5mUN?cf+eR9qBKB4OTP0wWSlhO#4+3-~{Bj}u2|KT>2 z>|HKh!U?~%v-*jMtPq|)M7>|MEkWA*l!2kYP6=U5SR-!7=_OQB8UdT)Ea)_Fyzc`L zz7uiz;D~R)e@|2W-LccTZf0k72o4T$SMKT?TGN! z>xSi9k%~whu8#!JRC!;(kYtlj6P6|@RykWlD#|ZSDauDq-P;*Rk7|F9qk z($$aEN)uaUzJ$!&V$yODY`K0*KB#1FAi-QEJ%joSo4Jpg2n9xRpZ`W+>rh8N@ z8xkc@{bIT3k{sVF4o4Km&s7{sXDAFv)v&U;+&)iKc+^YC6!tWCb+LZ5uj?|0Lq%fZ zNQTCa2`m%HDisM`{;f#c`mxT^AqmptXHaV9^HMcL`b88(jx_vVHKkuW_88gvv8>_0 z$~7OJuutkeJ*fD|?U%{1$~KNyewA&+FFVMCx)As!ue5`OCH_mJ*8HVWSK0kKg5I27 z?$Jp-yBTZOTB9TXX94_GF$LK zmDVz4Xy)vD#+C#xt~=tf(*Y8}r2YUvv{m1J-S0#zg_SSOnBT&8Pvi69*?-C0InDk6 zr?2G&DTS~W1qz-G#aiRT#c8}15iH)fccPE6ZtYlA{t8yQzvUI4RxvE1pjKn5H!x|D zYGUn~&!47jBdISS!sP0c-6k5i1|dKg%({DbmYuCH^W=OR2EtM)ar@5;N`Jn1JpR7; zE3!`657&#=XmRcwys0113nlmy!uArA3(b&F^s$%}Y(Y@VyaAmew%4jW;NRC5UQY&! z?~Y)eap;LuERfBPEmlK+eOmPTKCkSreL3VszRl)?#HG6 zBUmxi%lkw3IvO*=gT1iZq+1Q8u63!^1%+~|s=!ym4*Xlw#?^ZMQM_m^Q)3bDk6@-x z)C%)bBR_`jBrFS(jNK{JEP(!7}wVX!lcngOSRzZqv8Gki1ISGX4-dVq<+_ zS8Dy82L8vQ%n#ZDtzn?TF-4sjCh0+OdDu#ED`R10m|nyv1^W=nWo7G*+&<;N{BR+- zokR2o6rJjwmXegXXIlV~W@#q4W53DHu!{XYNu*ZG{1CrZlThi)_G~+WL4lBR|0#geZ_$U-vJBLmt4PLii4;=TmL$#MXVB4 z5#(2|osnR+UZq+h{HmVdTt7oemBf0MOC;B)U`wMC8ilqLP!?p%yWuz2SvBAbWz^OF zFz`(+p~h2Fg{qaIGFWzJGo{Y7Bd(8Vbs|0v+@3sx1y_o=PW zd9K-c!C(Z9RtIi3@jVefQ22KJXTCq(v}-ceh-0LFfBtEBaKNj87^r!n5V1sBSK8O3 z!$i~}LUb!nf|Xxle}u`;(zi2Xy3 z`wPJh`qi`4ssK6%I=6hBTH3sSe2du7-$nJOsC&jWBWfOOGC?0_nt%qsqO!(M(_bx~esr|lxXCKO zNpJCHQb}XOE^NKOiaeGdo+<|DP9Idf@x4BwSuGypPl@Uiv_ch|SKpt=T9cP%Y?jF# zosQsN5Kz6nf2m~6DH`HnS!V1}uVCYG{LEnR{+RO9o<#m?r7bJ2I=8wT3W5WE!9{m? z26U}x+RSqO?M+vaVh_o#wgx4v$GzOOB_VLBfO|r8UoZQ~waMFEBMoQV2OX&$K?xG% zHJb$}?X-B1{~O%W!Zp=1CYa4VG~+F$Ja3}$X>}uL{%}yWV|6K z+FMG->|U{VZ4_613B2r$nFwXAm=@&IDoK!5AHTK{d15Jme9F*{0pP6>+7AM=a^hwe zvfy`8%YNm=E!EQ(E=TgL<)V%}xtk+=ski_6aDPB^d57`u&02V(EmZqr&j3)mz zaVTAo`WvQD3|?B~OjOt_WRF|@ZppP#r9re@;5-aiaAM^Pre2L*YZ)^1#q4G8e)iNy z!roqSP5V;-4fmp#d7C7XY9XH;Z42AqIPZqvRIOT6j8Z#SSmghT+#w~rJXPURs@PJ| z%8s4b^5u}XQXXMmbu;nOVA{%tGxtl$fwaP+qF2VsEPP*P?L<_!WQ%Iy^alg6Afx9; zv?H!=Pe_?^#Khk_$&FE03I_OX%0YW!I5 z>3=@2Yw252uv}C@$m3%*Oxblp|8oe5N680i#FRDa+GFrDJQhEl19UzqV7lBv-(Hzm z?#abqeU`rOjB&v5YeNO$DwTR027z~>$|#){*JTI%Ehv(VI5RjC98KSC=|g_6k+kk1 z?JLNQlJrf!v9iiGUT+2br1+{I65DC67B&kEoHq2edfp|1MCQM3?hxxHOXlR&gN$0f z(gJpRlzoFcx02ucrCk{(Y?#h&UbDj3R}+CQDOC*0@O`v#TyH3pT|OLEW`8)x|*LEhQnzcJFclqXaq2V)nVTxwO`RE|jd z;pCEt&wrx*<{yukL_{rz&A1*6`Qmxo3&bTlN!iCYL2ul6#`XjtWaI%(#({E6)rCWh zgY4Q9%Mzn0M||uTA7vLN6&Atvb5=@BpunM+mL>K$Z&3dJXZMi(%Ad|r7=HBf^76b_ z@dUpASyR%6(~sAuofj>$g$F0DX8Ug%YVHSqZXTnT#&<@KnPezt*5eg|+wqk&wkOL6I!|Y9ndU4NkKe%FU#OZRAEDY7 z7E~})NSnUnIC9PU2%H+!KUx#K{Z+LMHe&s4&5EJh(ce4&YM|r<{^oA5T7RISjt7_9 zDyPiF9l>i3aZADI!t*7!7%g8Jr|+EPP7lMhmww%E*?wgo;64pN)dXQ-`|%{zn8;JO zuZvp2LFrN1ovTkfgEO%;Tk^jyaDTmIFvrFq7^nP4p-Y86;rant5}niBZWo0mje)U_ z&!1?3>EX*=5-^-Y;Bl4!IP=7c?h2{ToZRe$9hy9S+dKQxqoD0t_e%F_(h?*l-ht3P zP{zy}E-8e&w5^^on0)-3`KXUv%LAtJj^$N+bnhi#5YDfsE{?kuo^0b4yFVZA?siVgv8vt2Xgo(eXr+_E*y zg%$=)0`KvbZydp|Br9sy%jxYQGljO4K>p*qrD{A18e%qhjf9~kvhVAKHl6^Cs9h4N zoH<;u&d|Y^>n#Km0F-t(Vh}xsskxQ?I#M%WcVxRha7|fVuckf~OPnYi#^9fuy}8h4 zV+SA9E4i^Wp035QBn7TCj#$vWrMS(Ax=HKmA0-K_k*g#-VZ=q|hw7XR?a-RjJ~kh> zS++?2x|8pW%iJ*+Mot7De+y#`v_Jki&<@y7KH+dBx=iH}mh59h=k`?lRKGHe&mD}j zQ3?752jlGWU|)HDGT7CKb+Iqx8%T!I#_|*+NCi;R4&xSn*B@fdtNeKdt9SUzr94{0 z8+zrN;_a{eXlwS`cFJ!9teJfoU*_{iR{Xts)i)hV5) zfeF?36V@)9j@+_y$Jw?CU0jQBZ!m0auwf={+sxnU+_0{)+SYBTKz}Xm1b;4k{1Zg- z2aXxU&{oCooj(C4kK>(SZC^`gedz_fVOx@1$d%bV@fmWAWQcz1c zRJ~UGx9>bh-sHEV0p28Tt}8R!b(VAdTD&Y#r4uB|OX%`HeEO8Ibp zu!^kJhUBjKEB>Tx?F3_H#;C587PX!!|G+D&!6#nC*@)GZ2dtM&P2kme^hP_e6<`be z$l%)MnRH*ptm*P#8!K;;aKIb}O0Ff^pp0VqAh{m8^9i6cw>QyFDa=u_NjbRoAz)ss@~NTa}2&8m&r+ z3hG#4($eld4ALX5jz(Cr?-Bnd8Z1Hz|C*|%8!T7WU_?zu5htPCuW@G~)ymTGoyP_8qJYHV*vHtd4Stw~W`8)pJW*AXSX3WKcX z9#G(z@r$Bc`*&C`Y?sz0o&<<@v_>9OU|4Ix2zMF%j)o&n$bU86N(;ig)0Oa!2TXSK zaL))Flr4UjY+56OSzq{T@ps{3@_*HZ@Xs9YfBWM9CV>8bB!IZ}aHZhU`^V4l`^5jg zWSuH<^0ts`T78ovw}XRe1-Yz?{A>Hy2T#1SA?WClvKmW?gmzYX>%pb~8A84zL=Ew_ z_Q)h!p7^<(9?f@TZG6N2+T&lJf4S5|zUu~TB;R+7o^{&Qo6B+l)=7>Q;9+71(T2XK z*Gy~5!Kj1vAz2&xqH;?(-^pjN{GrA+#qnwdSMEV4@20%`5wz+Y%=n>k_N(LUirN3# z8Crm{YdUk(CBH?dOi1t_^qFCOmW}S8zxUDlhZi64-}A^%R%$Z^cBilxIZEiS500R% M3A~59`{d>S0Cq20$^ZZW literal 0 HcmV?d00001 diff --git a/docs/articles/timers/OFFDELAYTIMER.html b/docs/articles/timers/OFFDELAYTIMER.html new file mode 100644 index 000000000..c15067870 --- /dev/null +++ b/docs/articles/timers/OFFDELAYTIMER.html @@ -0,0 +1,165 @@ + + + + + + + + AxOpen.Timers.OffDelayTimer | System.Dynamic.ExpandoObject + + + + + + + + + + + + + + + + +

+
+ + + + +
+
+ +
+
Search Results for
+
+

+
+
    +
    +
    + + +
    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/timers/ONDELAYTIMER.html b/docs/articles/timers/ONDELAYTIMER.html new file mode 100644 index 000000000..4390ac63c --- /dev/null +++ b/docs/articles/timers/ONDELAYTIMER.html @@ -0,0 +1,165 @@ + + + + + + + + AxOpen.Timers.OnDelayTimer | System.Dynamic.ExpandoObject + + + + + + + + + + + + + + + + +
    +
    + + + + +
    +
    + +
    +
    Search Results for
    +
    +

    +
    +
      +
      +
      + + +
      +
      + +
      +
      + + + + + + + + diff --git a/docs/articles/timers/PULSETIMER.html b/docs/articles/timers/PULSETIMER.html new file mode 100644 index 000000000..2ec188795 --- /dev/null +++ b/docs/articles/timers/PULSETIMER.html @@ -0,0 +1,165 @@ + + + + + + + + AxOpen.Timers.PulseTimer | System.Dynamic.ExpandoObject + + + + + + + + + + + + + + + + +
      +
      + + + + +
      +
      + +
      +
      Search Results for
      +
      +

      +
      +
        +
        +
        + + +
        +
        + +
        +
        + + + + + + + + diff --git a/docs/articles/timers/README.html b/docs/articles/timers/README.html new file mode 100644 index 000000000..e969cbc4f --- /dev/null +++ b/docs/articles/timers/README.html @@ -0,0 +1,244 @@ + + + + + + + + AXOpen.Timers | System.Dynamic.ExpandoObject + + + + + + + + + + + + + + + + +
        +
        + + + + +
        +
        + +
        +
        Search Results for
        +
        +

        +
        +
          +
          +
          + + +
          +
          + +
          +
          + + + + + + + + diff --git a/src/AXOpen.sln b/src/AXOpen.sln index 4de56e4e4..d089199ba 100644 --- a/src/AXOpen.sln +++ b/src/AXOpen.sln @@ -155,6 +155,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "clientchat", "clientchat", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clientchat", "clientchat\clientchat.csproj", "{B3B2A1D3-A1A5-443A-975F-C44F7C2648E6}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "inspectors", "inspectors", "{E644E81B-36C4-44B3-837F-AC1DDDB609C5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{6B847420-D488-4E16-B599-14F7558EBD66}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{ACDBA197-69BA-49E9-9624-DC7B912E4C3D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AxOpen.Inspectors.Blazor", "inspectors\src\AxOpen.Inspectors.Blazor\AxOpen.Inspectors.Blazor.csproj", "{6A796A98-F570-4F35-B46B-177B4C0178DC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_inspectors", "inspectors\src\AxOpen.Inspectors\ix_ax_axopen_inspectors.csproj", "{358D781D-BE42-4298-A60F-BE0358B5B405}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -309,6 +319,14 @@ Global {B3B2A1D3-A1A5-443A-975F-C44F7C2648E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {B3B2A1D3-A1A5-443A-975F-C44F7C2648E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {B3B2A1D3-A1A5-443A-975F-C44F7C2648E6}.Release|Any CPU.Build.0 = Release|Any CPU + {6A796A98-F570-4F35-B46B-177B4C0178DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A796A98-F570-4F35-B46B-177B4C0178DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A796A98-F570-4F35-B46B-177B4C0178DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A796A98-F570-4F35-B46B-177B4C0178DC}.Release|Any CPU.Build.0 = Release|Any CPU + {358D781D-BE42-4298-A60F-BE0358B5B405}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {358D781D-BE42-4298-A60F-BE0358B5B405}.Debug|Any CPU.Build.0 = Debug|Any CPU + {358D781D-BE42-4298-A60F-BE0358B5B405}.Release|Any CPU.ActiveCfg = Release|Any CPU + {358D781D-BE42-4298-A60F-BE0358B5B405}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -373,6 +391,10 @@ Global {4D4B57A7-55C4-4AE2-8991-250937389412} = {7A82F34B-A479-47D4-8FB6-F9A66FE6591A} {D3094A68-880C-4637-8F90-6034951E141B} = {E2BFDC17-38C1-43AD-9CB5-4FA440D2DEEA} {B3B2A1D3-A1A5-443A-975F-C44F7C2648E6} = {FEF28A3F-E141-4492-8055-3B21A1BDDAAB} + {6B847420-D488-4E16-B599-14F7558EBD66} = {E644E81B-36C4-44B3-837F-AC1DDDB609C5} + {ACDBA197-69BA-49E9-9624-DC7B912E4C3D} = {E644E81B-36C4-44B3-837F-AC1DDDB609C5} + {6A796A98-F570-4F35-B46B-177B4C0178DC} = {6B847420-D488-4E16-B599-14F7558EBD66} + {358D781D-BE42-4298-A60F-BE0358B5B405} = {6B847420-D488-4E16-B599-14F7558EBD66} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {292B45BE-E9CB-443B-979D-C0AFCD8D5675} diff --git a/src/core/ctrl/src/AxoCoordination/AxoSequencer/AxoSequencer.st b/src/core/ctrl/src/AxoCoordination/AxoSequencer/AxoSequencer.st index 86561467e..21c7cd045 100644 --- a/src/core/ctrl/src/AxoCoordination/AxoSequencer/AxoSequencer.st +++ b/src/core/ctrl/src/AxoCoordination/AxoSequencer/AxoSequencer.st @@ -160,6 +160,8 @@ NAMESPACE AXOpen.Core END_IF; END_METHOD + + /// /// Terminates the currently executed step and initiates the RequestedStep to be executed /// diff --git a/src/core/ctrl/src/abstractions/AxoCoordination/IAxoCoordinator.st b/src/core/ctrl/src/abstractions/AxoCoordination/IAxoCoordinator.st index aa36855f0..5577bd7d1 100644 --- a/src/core/ctrl/src/abstractions/AxoCoordination/IAxoCoordinator.st +++ b/src/core/ctrl/src/abstractions/AxoCoordination/IAxoCoordinator.st @@ -1,5 +1,17 @@ NAMESPACE AXOpen.Core INTERFACE IAxoCoordinator EXTENDS IAxoObject METHOD GetCoordinatorState : AxoCoordinatorStates END_METHOD + + + METHOD MoveNext + END_METHOD + + METHOD RequestStep + VAR_INPUT + RequestedStep : IAxoStep; + END_VAR + END_METHOD + + END_INTERFACE END_NAMESPACE diff --git a/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogBaseView.cs b/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogBaseView.cs index 5144ad8b0..c4ea83c8d 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogBaseView.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogBaseView.cs @@ -24,9 +24,12 @@ public partial class AxoDialogBaseView : RenderableComplexComponentBase w public override void AddToPolling(ITwinElement element, int pollingInterval = 250) { - var task = (AxoDialog)element; + var task = (AxoDialogBase)element; var kids = task.GetValueTags().ToList(); + //var task1 = (AxoDialog)element; + //var kids1 = task.GetValueTags().ToList(); + kids.ForEach(p => { diff --git a/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogDialogView/AxoDialogDialogView.razor b/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogDialogView/AxoDialogDialogView.razor index 48e2e27a5..7977603bd 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogDialogView/AxoDialogDialogView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogDialogView/AxoDialogDialogView.razor @@ -1,7 +1,6 @@ @namespace AXOpen.Core @using AXOpen.Core.Blazor.AxoDialogs; @using AXOpen.Dialogs; -@using Microsoft.JSInterop; @inject NavigationManager _navigationManager @inherits AxoDialogBaseView @inject AuthenticationStateProvider _asp diff --git a/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogDialogView/AxoDialogDialogView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogDialogView/AxoDialogDialogView.razor.cs index ea799b996..650a78a5c 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogDialogView/AxoDialogDialogView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogDialogView/AxoDialogDialogView.razor.cs @@ -22,6 +22,7 @@ protected override void OnInitialized() base.OnInitialized(); } + // experimental stuff for external closings private async void OnCloseSignal(object sender, EventArgs e) { if (Component._closeSignal.Cyclic) @@ -57,8 +58,6 @@ public override void Dispose() { base.Dispose(); Component._answer.ValueChangeEvent -= OnCloseSignal; - _dialogContainer.DialogClient.MessageReceivedDialogClose -= OnCloseDialogMessage; - _dialogContainer.DialogClient.MessageReceivedDialogOpen -= OnOpenDialogMessage; } } } diff --git a/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogLocator.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogLocator.razor.cs index 7ffb88105..50eab5a5a 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogLocator.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoDialogs/AxoDialogLocator.razor.cs @@ -74,8 +74,11 @@ private async void OnDialogInvoked(object? sender, AxoDialogEventArgs e) /// public void Dispose() { - _axoDialogProxyService.DialogInvoked -= OnDialogInvoked; - _axoDialogProxyService.Dispose(); + if (_axoDialogProxyService != null) + { + _axoDialogProxyService.DialogInvoked -= OnDialogInvoked; + _axoDialogProxyService.Dispose(); + } } } } diff --git a/src/core/src/AXOpen.Core.Blazor/axopen_core_blazor.csproj b/src/core/src/AXOpen.Core.Blazor/axopen_core_blazor.csproj index 19590bf3a..85b921c43 100644 --- a/src/core/src/AXOpen.Core.Blazor/axopen_core_blazor.csproj +++ b/src/core/src/AXOpen.Core.Blazor/axopen_core_blazor.csproj @@ -32,7 +32,6 @@ - diff --git a/src/data/src/AXOpen.Data.Blazor/axopen_data_blazor.csproj b/src/data/src/AXOpen.Data.Blazor/axopen_data_blazor.csproj index 86333dd80..815f40913 100644 --- a/src/data/src/AXOpen.Data.Blazor/axopen_data_blazor.csproj +++ b/src/data/src/AXOpen.Data.Blazor/axopen_data_blazor.csproj @@ -30,8 +30,6 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/src/inspectors/ctrl/.gitignore b/src/inspectors/ctrl/.gitignore new file mode 100644 index 000000000..0228acd94 --- /dev/null +++ b/src/inspectors/ctrl/.gitignore @@ -0,0 +1,8 @@ +.apax +.env +bin + +obj +testresult + +*.apax.tgz diff --git a/src/inspectors/ctrl/.npmrc b/src/inspectors/ctrl/.npmrc new file mode 100644 index 000000000..72534ba37 --- /dev/null +++ b/src/inspectors/ctrl/.npmrc @@ -0,0 +1 @@ +@ix-ax:registry=https://npm.pkg.github.com \ No newline at end of file diff --git a/src/inspectors/ctrl/AXSharp.config.json b/src/inspectors/ctrl/AXSharp.config.json new file mode 100644 index 000000000..da8b5f062 --- /dev/null +++ b/src/inspectors/ctrl/AXSharp.config.json @@ -0,0 +1 @@ +{"OutputProjectFolder":"..\\src\\AXOpen.Inspectors"} \ No newline at end of file diff --git a/src/inspectors/ctrl/apax.yml b/src/inspectors/ctrl/apax.yml new file mode 100644 index 000000000..4aa8b8e42 --- /dev/null +++ b/src/inspectors/ctrl/apax.yml @@ -0,0 +1,17 @@ +name: "@ix-ax/axopen.inspectors" +version: '0.1.4-alpha.79' +type: lib +targets: + - axunit-llvm + - llvm +files: + - src +devDependencies: + "@ax/sdk": ^4.0.3 +scripts: + postbuild: + - dotnet ixc +dependencies: + "@ax/system-timer": ^4.0.1 + "@ix-ax/axopen.core": '0.1.4-alpha.79' + "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' diff --git a/src/inspectors/ctrl/dw.ps1 b/src/inspectors/ctrl/dw.ps1 new file mode 100644 index 000000000..d7c96dc7c --- /dev/null +++ b/src/inspectors/ctrl/dw.ps1 @@ -0,0 +1,3 @@ +apax install +apax build +apax sld --accept-security-disclaimer -t 192.168.0.1 -i .\bin\1500\ \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoAnalogueInspector/AxoAnalogueInspector.st b/src/inspectors/ctrl/src/AxoAnalogueInspector/AxoAnalogueInspector.st new file mode 100644 index 000000000..01bbb831c --- /dev/null +++ b/src/inspectors/ctrl/src/AxoAnalogueInspector/AxoAnalogueInspector.st @@ -0,0 +1,123 @@ +NAMESPACE AXOpen.Inspectors + + + + /// + /// Class representing inspection of value within an interval. + /// + CLASS AxoAnalogueInspector EXTENDS AxoInspector IMPLEMENTS IAxoAnalogueInspector + + VAR PUBLIC + {#ix-set:AttributeName = "<#Inspector data#>"} + _data : AxoAnalogueInspectorData; + // result data of inspection + {#ix-attr:[RenderIgnore()]} + _lastOutValue : LREAL; + END_VAR + + + /// + /// Inspection method, which contains main logic of inspection. + /// + METHOD PUBLIC Inspect : IInspector + VAR_INPUT + _parent : AXOpen.Core.IAxoObject; + Status : LREAL; + END_VAR + + VAR + tmpResult : BOOL; + _minimum : LREAL; + _value : LREAL; + _maximum : LREAL; + END_VAR + + VAR CONSTANT + epsilon : REAL := 10000; + END_VAR + + THIS.Initialize(_parent); + _inspectorTask.Initialize(_parent); + + //return this instance + Inspect := THIS; + + // pass address of data to set an inspection data + _inspectorTask.SetInspectionData(REF(_data)); + + //check for overinspection + IF(THIS.IsOverInspected())THEN + RETURN; + END_IF; + + //initialize and invoke inspector task + _inspectorTask.Invoke(); + + //do inspection + IF (_inspectorTask.Execute()) THEN + IF (_data.IsByPassed) THEN + _data.Result := eInspectorResult#Bypassed; + _data.TimeStamp := THIS.GetContext().GetRtc().NowUTC(); + _inspectorTask.DoneWhen(TRUE); + RETURN; + END_IF; + + _data.Result := eInspectorResult#Running; + + _minimum := (_data.RequiredMin * epsilon); + _value := (Status * epsilon); + _maximum := (_data.RequiredMax * epsilon); + + _data.DetectedStatus := Status; + + tmpResult := (_minimum <= _value) AND (_maximum >= _value); + + IF(NOT tmpResult) THEN + _lastOutValue := Status; + END_IF; + + _inspectorTask._failTimer(TRUE, _data.FailTime); + _inspectorTask._passTimer(tmpResult, _data.PassTime); + + IF(_inspectorTask._passTimer.output OR _inspectorTask._failTimer.output) THEN + _inspectorTask.DoneWhen(TRUE); + THIS.OnDone(); + END_IF; + + END_IF; + END_METHOD + + /// + /// Set coordinator to this instance + /// + METHOD PUBLIC WithCoordinator : IAxoAnalogueInspector + VAR_INPUT + inCoordinator : AXOpen.Core.IAxoCoordinator; + END_VAR + + _coordinator := inCoordinator; + THIS._WithCoordinator(inCoordinator); + + WithCoordinator := THIS; + END_METHOD + + /// + /// If inspection fails, set result to data + /// + METHOD OnDone + IF (_data.Result = eInspectorResult#Failed) THEN + _data.DetectedStatus := _lastOutValue; + END_IF; + END_METHOD + + /// + /// Set coordinator to this instance + /// + METHOD PUBLIC Data : REF_TO AxoAnalogueInspectorData + + Data := REF(_data); + END_METHOD + +END_CLASS + + END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoAnalogueInspector/AxoAnalogueInspectorData.st b/src/inspectors/ctrl/src/AxoAnalogueInspector/AxoAnalogueInspectorData.st new file mode 100644 index 000000000..426715761 --- /dev/null +++ b/src/inspectors/ctrl/src/AxoAnalogueInspector/AxoAnalogueInspectorData.st @@ -0,0 +1,24 @@ +NAMESPACE AXOpen.Inspectors + + /// + /// Data subjected to each analogue inspector instance. + /// + CLASS AxoAnalogueInspectorData EXTENDS AxoInspectorData + + VAR PUBLIC + + {#ix-set:AttributeName = "<#Min#>"} + RequiredMin : LREAL; + + {#ix-set:AttributeName = "<#Detected#>"} + DetectedStatus : LREAL; + + {#ix-set:AttributeName = "<#Max#>"} + RequiredMax: LREAL; + + END_VAR + + END_CLASS + + +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoAnalogueInspector/IAxoAnalogueInspector.st b/src/inspectors/ctrl/src/AxoAnalogueInspector/IAxoAnalogueInspector.st new file mode 100644 index 000000000..2b95e0113 --- /dev/null +++ b/src/inspectors/ctrl/src/AxoAnalogueInspector/IAxoAnalogueInspector.st @@ -0,0 +1,13 @@ +USING AXOpen.Core; +NAMESPACE AXOpen.Inspectors + INTERFACE IAxoAnalogueInspector + + METHOD Inspect : IInspector + VAR_INPUT + _parent: IAxoObject; + Status : LREAL; + END_VAR + END_METHOD + + END_INTERFACE +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoComprehensiveResult.st b/src/inspectors/ctrl/src/AxoComprehensiveResult.st new file mode 100644 index 000000000..b6621d562 --- /dev/null +++ b/src/inspectors/ctrl/src/AxoComprehensiveResult.st @@ -0,0 +1,49 @@ +NAMESPACE AXOpen.Inspectors + + CLASS AxoComprehensiveResult IMPLEMENTS IAxoComprehensiveResult + VAR PUBLIC + + Result : eOverallResult; + Failures : STRING; + ErrorCodes : STRING; + + END_VAR + + + METHOD PUBLIC GetResult : eOverallResult + GetResult := Result; + END_METHOD + + METHOD PUBLIC GetFailures : STRING + GetFailures := Failures; + END_METHOD + + METHOD PUBLIC GetErrorCodes : STRING + GetErrorCodes := ErrorCodes; + END_METHOD + + METHOD PUBLIC SetResult + VAR_INPUT + inResult : eOverallResult; + END_VAR + Result := inResult; + END_METHOD + + METHOD PUBLIC SetFailures + VAR_INPUT + inFailures : STRING; + END_VAR + Failures := inFailures; + END_METHOD + + METHOD PUBLIC SetErrorCodes + VAR_INPUT + inErrorCodes : STRING; + END_VAR + + ErrorCodes := inErrorCodes; + END_METHOD + END_CLASS + + +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoDataInspector/AxoDataInspector.st b/src/inspectors/ctrl/src/AxoDataInspector/AxoDataInspector.st new file mode 100644 index 000000000..3da60c5fd --- /dev/null +++ b/src/inspectors/ctrl/src/AxoDataInspector/AxoDataInspector.st @@ -0,0 +1,180 @@ +USING System.Strings; + +NAMESPACE AXOpen.Inspectors + + /// + /// Class representing inspection of string value with support of star notation. + /// + CLASS AxoDataInspector EXTENDS AxoInspector IMPLEMENTS IAxoDataInspector + + VAR PUBLIC + {#ix-set:AttributeName = "<#Inspector data#>"} + _data : AxoDataInspectorData; + // result data of inspection + {#ix-attr:[RenderIgnore()]} + _lastOutValue : STRING; + END_VAR + + + /// + /// Inspection method, which contains main logic of inspection. + /// + METHOD PUBLIC Inspect : IInspector + VAR_INPUT + _parent : AXOpen.Core.IAxoObject; + Status : STRING; + + END_VAR + + VAR + tmpResult : BOOL; + charIndex: DINT; + charRequired : CHAR; + charAcquired : CHAR; + END_VAR + + VAR CONSTANT + epsilon : REAL := 1; + END_VAR + + THIS.Initialize(_parent); + _inspectorTask.Initialize(_parent); + + //return this instance + Inspect := THIS; + + // pass address of data to set an inspection data + _inspectorTask.SetInspectionData(REF(_data)); + + //check for overinspection + IF(THIS.IsOverInspected())THEN + RETURN; + END_IF; + + //initialize and invoke inspector task + _inspectorTask.Invoke(); + + + //do inspection + IF (_inspectorTask.Execute()) THEN + IF (_data.IsByPassed) THEN + _data.Result := eInspectorResult#Bypassed; + _data.TimeStamp := THIS.GetContext().GetRtc().NowUTC(); + _inspectorTask.DoneWhen(TRUE); + RETURN; + END_IF; + + _data.Result := eInspectorResult#Running; + + _data.DetectedStatus := Status; + + // if star notation is enabled, comparison by chars is needed + IF(_data.StarNotationEnabled) THEN + tmpResult := TRUE; + // iterate throug the string + FOR charIndex := DINT#1 TO LengthOf(_data.RequiredStatus) DO + + //get char from required string + charRequired := _data.RequiredStatus[charIndex]; + + + //get char from detected string, only if is within a range + IF(LengthOf(_data.DetectedStatus) >= charIndex) THEN + charAcquired := _data.DetectedStatus[charIndex]; + END_IF; + + //if it's not wild card, compare chars + IF(charRequired <> '*' AND charRequired <> '#') THEN + tmpResult := charRequired = charAcquired; + ELSIF(charRequired = '#') THEN + // if is # wildcard, check for number + tmpResult := THIS.IsCharNumber(charAcquired); + END_IF; + + // if tmpResult is false, we know that string are not the same, therefore exit + IF(NOT tmpResult) THEN + EXIT; + END_IF; + END_FOR; + ELSE + //TODO what about spaces at the beginning and the end? + tmpResult := _data.DetectedStatus = _data.RequiredStatus; + END_IF; + + IF(NOT tmpResult) THEN + _lastOutValue := Status; + END_IF; + + _inspectorTask._failTimer(TRUE, _data.FailTime); + _inspectorTask._passTimer(tmpResult, _data.PassTime); + + IF(_inspectorTask._passTimer.output OR _inspectorTask._failTimer.output) THEN + _inspectorTask.DoneWhen(TRUE); + THIS.OnDone(); + END_IF; + END_IF; + END_METHOD + + /// + /// Set coordinator to this instance + /// + METHOD PUBLIC WithCoordinator : IAxoDataInspector + VAR_INPUT + inCoordinator : AXOpen.Core.IAxoCoordinator; + END_VAR + + _coordinator := inCoordinator; + THIS._WithCoordinator(inCoordinator); + + WithCoordinator := THIS; + END_METHOD + + /// + /// If inspection fails, set result to data + /// + METHOD OnDone + IF (_data.Result = eInspectorResult#Failed) THEN + _data.DetectedStatus := _lastOutValue; + END_IF; + END_METHOD + + + /// + /// Check, if character is a number + /// + METHOD IsCharNumber : BOOL + + VAR_INPUT + inCharacter: CHAR; + END_VAR + IF (inCharacter = '0' + OR inCharacter = '1' + OR inCharacter = '2' + OR inCharacter = '3' + OR inCharacter = '4' + OR inCharacter = '5' + OR inCharacter = '6' + OR inCharacter = '7' + OR inCharacter = '8' + OR inCharacter = '9') + THEN + IsCharNumber := TRUE; + RETURN; + END_IF; + + IsCharNumber := FALSE; + END_METHOD + + /// + /// Set coordinator to this instance + /// + METHOD PUBLIC Data : REF_TO AxoDataInspectorData + + Data := REF(_data); + END_METHOD + + + +END_CLASS + + END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoDataInspector/AxoDataInspectorData.st b/src/inspectors/ctrl/src/AxoDataInspector/AxoDataInspectorData.st new file mode 100644 index 000000000..973a0802f --- /dev/null +++ b/src/inspectors/ctrl/src/AxoDataInspector/AxoDataInspectorData.st @@ -0,0 +1,24 @@ +NAMESPACE AXOpen.Inspectors + + /// + /// Data subjected to each data inspector instance. + /// + CLASS AxoDataInspectorData EXTENDS AxoInspectorData + + VAR PUBLIC + + {#ix-set:AttributeName = "<#Required#>"} + RequiredStatus: STRING; + + {#ix-set:AttributeName = "<#Detected#>"} + DetectedStatus : STRING; + + {#ix-set:AttributeName = "<#Star notation#>"} + StarNotationEnabled: BOOL; + + END_VAR + + END_CLASS + + +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoDataInspector/IAxoDataInspector.st b/src/inspectors/ctrl/src/AxoDataInspector/IAxoDataInspector.st new file mode 100644 index 000000000..fdce0b871 --- /dev/null +++ b/src/inspectors/ctrl/src/AxoDataInspector/IAxoDataInspector.st @@ -0,0 +1,13 @@ +USING AXOpen.Core; +NAMESPACE AXOpen.Inspectors + INTERFACE IAxoDataInspector + + METHOD Inspect : IInspector + VAR_INPUT + _parent: IAxoObject; + Status : STRING; + END_VAR + END_METHOD + + END_INTERFACE +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoDigitalInspector/AxoDigitalInspector.st b/src/inspectors/ctrl/src/AxoDigitalInspector/AxoDigitalInspector.st new file mode 100644 index 000000000..d6c6d72c1 --- /dev/null +++ b/src/inspectors/ctrl/src/AxoDigitalInspector/AxoDigitalInspector.st @@ -0,0 +1,110 @@ +NAMESPACE AXOpen.Inspectors + +/// +/// Class representing inspection of bool value. +/// +CLASS AxoDigitalInspector EXTENDS AxoInspector IMPLEMENTS IAxoDigitalInspector + + VAR PUBLIC + {#ix-set:AttributeName = "<#Inspector data#>"} + _data : AxoDigitalInspectorData; + END_VAR + + /// + /// Inspection method, which contains main logic of inspection. + /// + METHOD PUBLIC Inspect : IInspector + VAR_INPUT + _parent: AXOpen.Core.IAxoObject; + Status : BOOL; + END_VAR + + THIS.Initialize(_parent); + _inspectorTask.Initialize(_parent); + + //return this instance + Inspect := THIS; + + + // set task inspection data, pass a reference (an address) + // REF(_data) will get a reference of _data variable (like & in C) + _inspectorTask.SetInspectionData(REF(_data)); + + + //here i should check, if data are overinspected + IF(THIS.IsOverInspected()) THEN + RETURN; + END_IF; + + //invoke inspection task + _inspectorTask.Invoke(); + + //execute inspection task + IF (_inspectorTask.Execute()) THEN + + // if data are bypassed, skip inspection + IF (_data.IsByPassed) THEN + + _data.Result := eInspectorResult#Bypassed; + + _data.TimeStamp := THIS.GetContext().GetRtc().NowUTC(); + + _inspectorTask.DoneWhen(TRUE); + RETURN; + END_IF; + + + //set timers + _data.Result := eInspectorResult#Running; + _inspectorTask._failTimer(TRUE, _data.FailTime); + _inspectorTask._passTimer(Status = _data.RequiredStatus, _data.PassTime); + + _data.DetectedStatus := Status; + + // if any timer is satisfied, end inspection + IF(_inspectorTask._failTimer.output OR _inspectorTask._passTimer.output) THEN + _inspectorTask.DoneWhen(TRUE); + THIS.OnDone(); + + END_IF; + END_IF; + + + END_METHOD + + /// + /// If inspection fails, set result to data + /// + METHOD OnDone + IF (_data.Result = eInspectorResult#Failed) THEN + _data.DetectedStatus := NOT _data.RequiredStatus; + END_IF; + END_METHOD + + /// + /// Set coordinator to this instance + /// + METHOD PUBLIC WithCoordinator : IAxoDigitalInspector + VAR_INPUT + inCoordinator : AXOpen.Core.IAxoCoordinator; + END_VAR + + _coordinator := inCoordinator; + THIS._WithCoordinator(inCoordinator); + + WithCoordinator := THIS; + END_METHOD + + + /// + /// Set coordinator to this instance + /// + METHOD PUBLIC Data : REF_TO AxoDigitalInspectorData + + Data := REF(_data); + END_METHOD + + +END_CLASS + +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoDigitalInspector/AxoDigitalInspectorData.st b/src/inspectors/ctrl/src/AxoDigitalInspector/AxoDigitalInspectorData.st new file mode 100644 index 000000000..032dc0a9b --- /dev/null +++ b/src/inspectors/ctrl/src/AxoDigitalInspector/AxoDigitalInspectorData.st @@ -0,0 +1,22 @@ +NAMESPACE AXOpen.Inspectors + + /// + /// Data subjected to each digital inspector instance. + /// + CLASS AxoDigitalInspectorData EXTENDS AxoInspectorData + + VAR PUBLIC + + {#ix-set:AttributeName = "<#Required#>"} + RequiredStatus : BOOL; + + {#ix-set:AttributeName = "<#Detected#>"} + DetectedStatus : BOOL; + + + END_VAR + + END_CLASS + + +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoDigitalInspector/IAxoDigitalInspector.st b/src/inspectors/ctrl/src/AxoDigitalInspector/IAxoDigitalInspector.st new file mode 100644 index 000000000..314480f13 --- /dev/null +++ b/src/inspectors/ctrl/src/AxoDigitalInspector/IAxoDigitalInspector.st @@ -0,0 +1,13 @@ +USING AXOpen.Core; +NAMESPACE AXOpen.Inspectors + INTERFACE IAxoDigitalInspector + + METHOD Inspect : IInspector + VAR_INPUT + _parent: IAxoObject; + Status : BOOL; + END_VAR + END_METHOD + + END_INTERFACE +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoInspector.st b/src/inspectors/ctrl/src/AxoInspector.st new file mode 100644 index 000000000..d666303df --- /dev/null +++ b/src/inspectors/ctrl/src/AxoInspector.st @@ -0,0 +1,240 @@ +USING AXOpen.Core; + +NAMESPACE AXOpen.Inspectors + + /// + /// AxoInspector base class with implemented evaluation methods + /// Evaluation methods need IAxoCoordinator instance + /// + CLASS AxoInspector EXTENDS AXOpen.Core.AxoObject IMPLEMENTS IInspector, IOnFail + + + VAR PUBLIC + _axoInspectorDialog : AxoInspectorDialog; + END_VAR + VAR + _inspectorTask: AxoInspectorTask; + _coordinator: IAxoCoordinator; + _isOverInspected: BOOL; + _busy : BOOL; + _commonData: REF_TO AxoInspectorData; + _originalOverallResult : IAxoComprehensiveResult; + + END_VAR + + + /// + /// Check, if data are overinspected (attempts of inspections is larger than maximum number of allowed retries) + /// + METHOD PUBLIC CheckOverInspection : BOOL + //check if reference is valid + IF _inspectorTask.InspectionData() <> NULL THEN + CheckOverInspection := (_inspectorTask.InspectionData()^.RetryAttemptsCount >= _inspectorTask.InspectionData()^.NumberOfAllowedRetries) + AND (_inspectorTask.InspectionData()^.NumberOfAllowedRetries <> UINT#0); + END_IF; + END_METHOD + + + /// + /// Gets `true` when this inspection overruns max number of inspections. + /// + METHOD PROTECTED IsOverInspected : BOOL + + _isOverInspected := THIS.CheckOverInspection(); + IF(THIS.CheckOverInspection()) THEN + _inspectorTask.Invoke(); + IF(_inspectorTask.Execute()) THEN + _inspectorTask.InspectionData()^.Result := eInspectorResult#Failed; + _inspectorTask.DoneWhen(TRUE); + END_IF; + END_IF; + + IsOverinspected := THIS.CheckOverInspection(); + END_METHOD + + + /// + /// Set passed instance of iAxoCoordinator to this inspector. + /// This method can be called only in derived classes. + /// + METHOD PROTECTED _WithCoordinator : IInspector + VAR_INPUT + inCoordinator : IAxoCoordinator; + END_VAR + + _coordinator := inCoordinator; + _WithCoordinator := THIS; + + END_METHOD + + METHOD PUBLIC OnFail : IOnFail + + // here if is coordinator missing, it should provide message to call it with WithCoordinator method + OnFail:= THIS; + + END_METHOD + + METHOD PUBLIC Dialog : BOOL + VAR_INPUT + inRetryStep: IAxoStep; + inTerminateStep: IAxoStep; + END_VAR + // here if is coordinator missing, it should provide message to call it with WithCoordinator method + _axoInspectorDialog.Show(REF(THIS), inRetryStep, inTerminateStep); + + END_METHOD + + + /// + /// When inspection is done, retry provided step + /// + METHOD PUBLIC RetryWithStep : BOOL + + VAR_INPUT + /// State from which the inspection will restart. + inRetryStep : IAxoStep; + END_VAR + + IF(_coordinator = NULL) THEN + RETURN; + END_IF; + + IF(THIS.Done()) THEN + IF(THIS.Result() = eInspectorResult#Failed) THEN + + IF(inRetryStep <> NULL) THEN + + _coordinator.RequestStep(inRetryStep); + END_IF; + ELSE + _coordinator.MoveNext(); + END_IF; + END_IF; + + + RetryWithStep:= THIS.Done(); + + END_METHOD + + + + /// + /// When inspection is done, continue to next step. + /// + METHOD PUBLIC CarryOn : BOOL + + IF(_coordinator = NULL) THEN + RETURN; + END_IF; + + IF(THIS.Done()) THEN + _coordinator.MoveNext(); + END_IF; + + CarryOn := THIS.Done(); + END_METHOD + + /// + /// When inspection is done, terminate provided step + /// + METHOD PUBLIC TerminateWithStep : BOOL + VAR_INPUT + inTerminateStep : AXOpen.Core.IAxoStep; + END_VAR + IF(_coordinator = NULL) THEN + RETURN; + END_IF; + + + IF(THIS.Done()) THEN + IF(THIS.Result() = eInspectorResult#Failed) THEN + + IF(inTerminateStep <> NULL) THEN + + _coordinator.RequestStep(inTerminateStep); + + END_IF; + ELSE + _coordinator.MoveNext(); + END_IF; + END_IF; + + TerminateWithStep := THIS.Done(); + END_METHOD + + + + + /// + /// Update commmon comprehensive result, which can be used across multiple inspectors + /// Updates comprehensive result. The comprehensive result is set to `Failed` when any inspection fails or is inconclusive. + /// Any bypassed or excluded inspections are not taken into account. + /// + + METHOD PUBLIC UpdateComprehensiveResult : IInspector + VAR_IN_OUT + inoResult : AxoComprehensiveResult; + END_VAR + + + UpdateComprehensiveResult := THIS; + + // if inspection data are not provided, set default result + IF(_inspectorTask.InspectionData() = NULL ) THEN + inoResult.SetResult(eOveralLResult#NoAction); + RETURN; + END_IF; + + // set result to comprehensive data only when inspection fails + CASE _inspectorTask.InspectionData()^.Result OF + + eInspectorResult#Failed: + inoResult.SetResult(eOverallResult#Failed); + //TODO here I should update descriptions + //UpdateDescriptions(inoResult); + eInspectorResult#Inconclusive: + inoResult.SetResult(eOverallResult#Failed); + //TODO here I should update descriptions + //UpdateDescriptions(inoResult); + ELSE + ; + END_CASE; + + + END_METHOD + + + METHOD PUBLIC RestoreInspectorTask : BOOL + _inspectorTask.Restore(); + END_METHOD + + METHOD PUBLIC Busy : BOOL + Busy := _inspectorTask.IsBusy(); + END_METHOD + + METHOD PUBLIC CommonData : REF_TO AXOpen.Inspectors.AxoInspectorData + ; + END_METHOD + + METHOD PUBLIC Coordinator : IAxoCoordinator + Coordinator := _coordinator; + END_METHOD + + METHOD PUBLIC Done : BOOL + Done := _inspectorTask.IsDone(); + END_METHOD + + METHOD PUBLIC Result : eInspectorResult + Result := _inspectorTask.InspectionData()^.Result; + END_METHOD + + + + +END_CLASS + + + + + +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoInspectorData.st b/src/inspectors/ctrl/src/AxoInspectorData.st new file mode 100644 index 000000000..6a48b6571 --- /dev/null +++ b/src/inspectors/ctrl/src/AxoInspectorData.st @@ -0,0 +1,46 @@ +NAMESPACE AXOpen.Inspectors + + /// + /// Data subjected to each inspector instance. + /// + CLASS AxoInspectorData + + VAR PUBLIC + + + {#ix-set:AttributeName = "<#TimeStamp#>"} + Timestamp: LDATE_AND_TIME; + + {#ix-set:AttributeName = "<#Stab.Time#>"} + PassTime : TIME; + + {#ix-set:AttributeName = "<#Timeout#>"} + FailTime : TIME; + + {#ix-set:AttributeName = "<#Result#>"} + Result : eInspectorResult; + + {#ix-set:AttributeName = "<#Excluded#>"} + IsExcluded: BOOL; + + {#ix-set:AttributeName = "<#Bypass#>"} + IsByPassed : BOOL; + + {#ix-set:AttributeName = "<#Re-tries#>"} + NumberOfAllowedRetries : UINT; + + {#ix-set:AttributeName = "<#Attempts#>"} + RetryAttemptsCount : UINT; + + // {#ix-set:AttributeName = "<#Failure description#>"} + // FailureDescription : STRING; + + // {#ix-set:AttributeName = "<#Code#>"} + // ErrorCode : STRING; + + END_VAR + + END_CLASS + + +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoInspectorDialog.st b/src/inspectors/ctrl/src/AxoInspectorDialog.st new file mode 100644 index 000000000..d349a92a4 --- /dev/null +++ b/src/inspectors/ctrl/src/AxoInspectorDialog.st @@ -0,0 +1,124 @@ +USING AXOpen.Core; + +NAMESPACE AXOpen.Inspectors + + /// + /// AxoInspector base class with implemented evaluation methods + /// Evaluation methods need IAxoCoordinator instance + /// + CLASS AxoInspectorDialog EXTENDS AXOpen.Core.AxoDialogBase + + VAR PUBLIC + _isOverInspected : BOOL; + _dialogueRetry : BOOL; + _dialogueTerminate : BOOL; + _dialogueOverride : BOOL; + END_VAR + + VAR PRIVATE + _lastCall : ULINT; + END_VAR + + VAR + + _isActive : BOOL; + _dialogIsClosed : BOOL; + _isAnswerProvided : BOOL; + + END_VAR + + + + METHOD PUBLIC Show + VAR_INPUT + _parentInspectorRef : REF_TO AxoInspector; + inRetryStep : IAxoStep; + inTerminateStep : IAxoStep; + END_VAR + VAR + callCounter : ULINT; + END_VAR + + + //Restores when not called for 2+ consecutive cycles of the context. + callCounter := THIS.GetParent().GetContext().OpenCycleCount(); + IF(callCounter > _lastCall + ULINT#1) THEN + THIS.Restore(); + END_IF; + _lastCall := callCounter; + + + IF(_parentInspectorRef = NULL) THEN + RETURN; + END_IF; + + + _isOverInspected := _parentInspectorRef^.CheckOverInspection(); + + + IF(_parentInspectorRef^.Done()) THEN + + IF(_parentInspectorRef^.Result() = eInspectorResult#Failed) THEN + THIS.Initialize(_parentInspectorRef^); + THIS.Invoke(); + SUPER.Execute(); + + + IF(_dialogueRetry) THEN + _parentInspectorRef^.RetryWithStep(inRetryStep); + _isAnswerProvided := TRUE; + + END_IF; + + IF(_dialogueTerminate) THEN + _parentInspectorRef^.TerminateWithStep(inTerminateStep); + _isAnswerProvided := TRUE; + + END_IF; + + IF(_dialogueOverride) THEN + _parentInspectorRef^.CarryOn(); + _isAnswerProvided := TRUE; + + END_IF; + + + ELSE + + IF(_parentInspectorRef^.Coordinator() <> NULL) THEN + _parentInspectorRef^.Coordinator().MoveNext(); + END_IF; + + END_IF; + + // restore this task, when answer is provided and task is done + IF _isAnswerProvided THEN + THIS.Restore(); + _parentInspectorRef^.RestoreInspectorTask(); + _isAnswerProvided := FALSE; + END_IF; + + + END_IF; + END_METHOD + + + METHOD PUBLIC Restore + + SUPER.Restore(); + _dialogueRetry := FALSE; + _dialogueTerminate := FALSE; + _dialogueOverride := FALSE; + _dialogIsClosed := FALSE; + + END_METHOD + + + +END_CLASS + + + + + +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/AxoInspectorTask.st b/src/inspectors/ctrl/src/AxoInspectorTask.st new file mode 100644 index 000000000..1e7ab6b5d --- /dev/null +++ b/src/inspectors/ctrl/src/AxoInspectorTask.st @@ -0,0 +1,119 @@ +USING AXOpen.Core; +USING AXOpen.Inspectors; +USING AXOpen.Core; +USING System.Timer; + + + +NAMESPACE AXOpen.Inspectors + + CLASS AxoInspectorTask EXTENDS AxoTask + VAR + _onDoneFlag: BOOL; + _inspectionData: REF_TO AxoInspectorData; + + END_VAR + + VAR INTERNAL + // _passTimer : AXOpen.Timers.OnDelayContext; + // _failTimer : AXOpen.Timers.OnDelayContext; + _passTimer : OnDelay; + _failTimer : OnDelay; + END_VAR + + + //getter + METHOD PUBLIC InspectionData : REF_TO AxoInspectorData + InspectionData := _inspectionData; + END_METHOD + + //setter + METHOD INTERNAL SetInspectionData : REF_TO AxoInspectorData + VAR_INPUT + inInspectionData: REF_TO AxoInspectorData; + END_VAR + _inspectionData := inInspectionData; + END_METHOD + + + METHOD PUBLIC OnDoneFlag : BOOL + OnDoneFlag := _onDoneFlag; + END_METHOD + + + /// + /// Execute inspection task. + /// + METHOD PUBLIC OVERRIDE Execute : BOOL + + _onDoneFlag := FALSE; + Execute := SUPER.Execute(); + END_METHOD + + //// + /// Executes once when inspection starts. + /// + METHOD PROTECTED OVERRIDE OnStart + SUPER.OnStart(); + + // set default values for passtime and failtime if no values were provided + IF (_inspectionData^.PassTime = T#0S) THEN + _inspectionData^.PassTime := T#50MS; + END_IF; + + IF (_inspectionData^.FailTime = T#0S) THEN + _inspectionData^.FailTime := T#100MS; + END_IF; + + _inspectionData^.Result := eInspectorResult#NoAction; + + _passTimer(FALSE, LT#0MS); + _failTimer(FALSE, LT#0MS); + END_METHOD + + + METHOD PUBLIC Restore + SUPER.Restore(); + _onDoneFlag := FALSE; + END_METHOD + + //// + /// When inspection Task is done, evaluate inspection result and write to inspection data. + /// + METHOD PROTECTED OVERRIDE OnDone + SUPER.OnDone(); + + // iterate number of retries + _inspectionData^.RetryAttemptsCount := _inspectionData^.RetryAttemptsCount + UINT#1; + + // if inspection is set to be bypassed, skip evalution of result + IF (_inspectionData^.Result = eInspectorResult#Bypassed) THEN + RETURN; + END_IF; + + _inspectionData^.TimeStamp := THIS.GetContext().GetRtc().NowUTC(); + _inspectionData^.Result := eInspectorResult#Failed; + + // if fail timer was not satisfied and pass timer passed, set inspector result to passed + IF (NOT _failTimer.output AND _passTimer.output) THEN + _inspectionData^.Result := eInspectorResult#Passed; + END_IF; + + // if inspector was excluded, set result to excluded + IF (_inspectionData^.IsExcluded) THEN + _inspectionData^.Result := eInspectorResult#Excluded; + END_IF; + + _onDoneFlag := TRUE; + END_METHOD + + END_CLASS + + + + + + + + +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/enums/eInspectorResult.st b/src/inspectors/ctrl/src/enums/eInspectorResult.st new file mode 100644 index 000000000..90bdc49fa --- /dev/null +++ b/src/inspectors/ctrl/src/enums/eInspectorResult.st @@ -0,0 +1,13 @@ +NAMESPACE AXOpen.Inspectors + TYPE + eInspectorResult : INT ( + NoAction := 0, + Running := 10, + Passed := 20, + Failed := 30, + Inconclusive := 35, + Excluded := 40, + Bypassed := 50 + ); + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/enums/eOverallResult.st b/src/inspectors/ctrl/src/enums/eOverallResult.st new file mode 100644 index 000000000..f0d825cc6 --- /dev/null +++ b/src/inspectors/ctrl/src/enums/eOverallResult.st @@ -0,0 +1,10 @@ +NAMESPACE AXOpen.Inspectors + TYPE + eOverallResult : INT ( + NoAction := 0, + InProgress := 10, + Passed := 20, + Failed := 30 + ); + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/interfaces/IAxoComprehensiveResult.st b/src/inspectors/ctrl/src/interfaces/IAxoComprehensiveResult.st new file mode 100644 index 000000000..f5094b7a7 --- /dev/null +++ b/src/inspectors/ctrl/src/interfaces/IAxoComprehensiveResult.st @@ -0,0 +1,33 @@ +USING AXOpen.Core; +NAMESPACE AXOpen.Inspectors + INTERFACE IAxoComprehensiveResult + + METHOD GetResult : eOverallResult + END_METHOD + + METHOD GetFailures : STRING + END_METHOD + + METHOD GetErrorCodes : STRING + END_METHOD + + METHOD SetResult + VAR_INPUT + inResult: eOverallResult; + END_VAR + END_METHOD + + METHOD SetFailures + VAR_INPUT + inFailures: STRING; + END_VAR + END_METHOD + + METHOD SetErrorCodes + VAR_INPUT + inErrorCodes: STRING; + END_VAR + END_METHOD + + END_INTERFACE +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/interfaces/IInspector.st b/src/inspectors/ctrl/src/interfaces/IInspector.st new file mode 100644 index 000000000..70bdfb580 --- /dev/null +++ b/src/inspectors/ctrl/src/interfaces/IInspector.st @@ -0,0 +1,48 @@ +USING AXOpen.Core; +NAMESPACE AXOpen.Inspectors + INTERFACE IInspector + + METHOD Busy : BOOL + END_METHOD + + METHOD CommonData : REF_TO AxoInspectorData + END_METHOD + + METHOD Coordinator : IAxoCoordinator + END_METHOD + + METHOD Done : BOOL + END_METHOD + + + METHOD CheckOverInspection : BOOL + END_METHOD + + METHOD Result : eInspectorResult + END_METHOD + + METHOD Dialog : BOOL + VAR_INPUT + inRetryStep: IAxoStep; + inTerminateStep: IAxoStep; + END_VAR + + + END_METHOD + + METHOD RestoreInspectorTask : BOOL + END_METHOD + + METHOD OnFail : IOnFail + END_METHOD + + METHOD UpdateComprehensiveResult : IInspector + + VAR_IN_OUT + inoResult : AxoComprehensiveResult; + END_VAR + + END_METHOD + + END_INTERFACE +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/src/interfaces/IOnFail.st b/src/inspectors/ctrl/src/interfaces/IOnFail.st new file mode 100644 index 000000000..b6d085612 --- /dev/null +++ b/src/inspectors/ctrl/src/interfaces/IOnFail.st @@ -0,0 +1,34 @@ + +NAMESPACE AXOpen.Inspectors + INTERFACE IOnFail + + METHOD CarryOn : BOOL + END_METHOD + + METHOD RetryWithStep : BOOL + VAR_INPUT + /// State from which the inspection will restart. + inRetryStep : AXOpen.Core.IAxoStep; + END_VAR + END_METHOD + + + METHOD Dialog : BOOL + VAR_INPUT + inRetryStep: AXOpen.Core.IAxoStep; + inTerminateStep: AXOpen.Core.IAxoStep; + END_VAR + END_METHOD + + + METHOD TerminateWithStep : BOOL + VAR_INPUT + /// State from which the inspection will restart. + inTerminateStep : AXOpen.Core.IAxoStep; + END_VAR + END_METHOD + + + + END_INTERFACE +END_NAMESPACE \ No newline at end of file diff --git a/src/inspectors/ctrl/test/AxoDigitalInspectorTests.st b/src/inspectors/ctrl/test/AxoDigitalInspectorTests.st new file mode 100644 index 000000000..18bf39bbb --- /dev/null +++ b/src/inspectors/ctrl/test/AxoDigitalInspectorTests.st @@ -0,0 +1,129 @@ +USING AXOpen.Rtc; +USING AXOpen.Logging; +USING AXOpen.Core; +USING AXOpen.Rtc; +USING AxUnit; + +NAMESPACE AXOpen.Inspectors.AxoDigitalInspector_Tests + + CLASS AxoRtcMock IMPLEMENTS IAxoRtc + VAR PRIVATE + _NowUTC : LDATE_AND_TIME; + END_VAR + + METHOD INTERNAL SetNowUTC : LDATE_AND_TIME + VAR_INPUT + Set : LDATE_AND_TIME; + END_VAR; + _NowUTC := Set; + END_METHOD + + METHOD PUBLIC NowUTC : LDATE_AND_TIME + NowUTC := _NowUTC; + END_METHOD + END_CLASS + + CLASS TestContext IMPLEMENTS IAxoContext + VAR PROTECTED + _openCounter : ULINT; + _closeCounter : ULINT; + _identityCounter : ULINT; + _rtc : IAxoRtc; + END_VAR + METHOD PUBLIC Open : ULINT + _openCounter := _openCounter + ULINT#1; + END_METHOD + + METHOD PUBLIC Close : ULINT + _closeCounter := _closeCounter + ULINT#1; + END_METHOD + + METHOD PUBLIC OpenCycleCount : ULINT + OpenCycleCount := _openCounter; + END_METHOD + + METHOD PUBLIC ClosedCycleCount : ULINT + ClosedCycleCount := _closeCounter; + END_METHOD + + METHOD PUBLIC CreateIdentity : ULINT + _identityCounter := _identityCounter + ULINT#1; + CreateIdentity := _identityCounter; + END_METHOD + + METHOD PUBLIC GetRtc : IAxoRtc ; + GetRtc := _rtc; + END_METHOD + + METHOD PUBLIC InjectRtc + VAR_INPUT Rtc : IAxoRtc; + END_VAR ; + + _rtc := Rtc; + END_METHOD + + VAR PRIVATE + NULL_LOGGER : _NULL_LOGGER; + END_VAR + METHOD PUBLIC GetLogger : AXOpen.Logging.IAxoLogger GetLogger := NULL_LOGGER; END_METHOD + METHOD PUBLIC InjectLogger VAR_INPUT _logger : AXOpen.Logging.IAxoLogger; END_VAR ; END_METHOD + + END_CLASS + + {TestFixture} + CLASS AxoDigitalInspectorTests + // VAR PROTECTED + // _context : TestContext; + // _digitalInspector : AxoDigitalInspector; + // _inspectedBool : BOOL; + // _sequencer : AxoSequencer; + // _rtcMock : AxoRtcMock; + + // _testBool : BOOL; + + // _testTimer: AXOpen.Timers.OnDelayContext; + // _testTimeDelay: LTIME; + // END_VAR + + // METHOD PRIVATE Initialize + // _context.InjectRtc(_rtcMock); + // _sequencer.Initialize(_context); + // END_METHOD + + + // {Test} + // METHOD PUBLIC Timer_test_pass + // THIS.Initialize(); + + // _context.Open(); + + + // _rtcMock.SetNowUTC(LDT#1980-01-23-13:14:33.123456); + // _testBool := TRUE; + // _testTimeDelay := LTIME#13:14:3.45; + + // _testTimer.Delay(_context,_testBool,_testTimeDelay); + // _inspectedBool := TRUE; + // _digitalInspector.Data()^.RequiredStatus := TRUE; + + // _testBool := _digitalInspector.Inspect(_sequencer,_inspectedBool).Done(); + + // _rtcMock.SetNowUTC(LDT#1980-01-23-13:14:38.123456); + + // _testBool := _digitalInspector.Inspect(_sequencer,_inspectedBool).Done(); + // //_digitalInspector.WithCoordinator(_sequencer).Inspect(_sequencer,_inspectedBool).OnFail().CarryOn(); + + // // WHILE NOT _digitalInspector.Inspect(_sequencer,_inspectedBool).Done() DO + // // ; + // // END_WHILE; + + + // Assert.Equal(eInspectorResult#Passed, _digitalInspector.Data()^.Result); + + + // _context.Close(); + // END_METHOD + + + END_CLASS +END_NAMESPACE diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxOpen.Inspectors.Blazor.csproj b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxOpen.Inspectors.Blazor.csproj new file mode 100644 index 000000000..acf1d78e7 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxOpen.Inspectors.Blazor.csproj @@ -0,0 +1,25 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + + + + + + + + + diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Online/AxoAnalogueInspectorCommandView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Online/AxoAnalogueInspectorCommandView.razor new file mode 100644 index 000000000..7ef5f84ba --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Online/AxoAnalogueInspectorCommandView.razor @@ -0,0 +1,25 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + +@code{ + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Online/AxoAnalogueInspectorStatusView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Online/AxoAnalogueInspectorStatusView.razor new file mode 100644 index 000000000..0a9889ac7 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Online/AxoAnalogueInspectorStatusView.razor @@ -0,0 +1,27 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + + +@code { + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Shadow/AxoAnalogueInspectorShadowControlView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Shadow/AxoAnalogueInspectorShadowControlView.razor new file mode 100644 index 000000000..fe5d7e524 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Shadow/AxoAnalogueInspectorShadowControlView.razor @@ -0,0 +1,25 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + +@code { + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Shadow/AxoAnalogueInspectorShadowDisplayView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Shadow/AxoAnalogueInspectorShadowDisplayView.razor new file mode 100644 index 000000000..2bf45dcae --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoAnalogueInspector/Shadow/AxoAnalogueInspectorShadowDisplayView.razor @@ -0,0 +1,25 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + +@code { + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Online/AxoDataInspectorCommandView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Online/AxoDataInspectorCommandView.razor new file mode 100644 index 000000000..374d5e301 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Online/AxoDataInspectorCommandView.razor @@ -0,0 +1,27 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + + +@code { + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Online/AxoDataInspectorStatusView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Online/AxoDataInspectorStatusView.razor new file mode 100644 index 000000000..267cb5c22 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Online/AxoDataInspectorStatusView.razor @@ -0,0 +1,27 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + + +@code { + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Shadow/AxoDataInspectorShadowControlView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Shadow/AxoDataInspectorShadowControlView.razor new file mode 100644 index 000000000..3f9cec2f0 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Shadow/AxoDataInspectorShadowControlView.razor @@ -0,0 +1,25 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + +@code { + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Shadow/AxoDataInspectorShadowDisplayView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Shadow/AxoDataInspectorShadowDisplayView.razor new file mode 100644 index 000000000..79890123f --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDataInspector/Shadow/AxoDataInspectorShadowDisplayView.razor @@ -0,0 +1,25 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + +@code { + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Online/AxoDigitalInspectorCommandView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Online/AxoDigitalInspectorCommandView.razor new file mode 100644 index 000000000..308c34501 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Online/AxoDigitalInspectorCommandView.razor @@ -0,0 +1,27 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + + +@code{ + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} + diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Online/AxoDigitalInspectorStatusView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Online/AxoDigitalInspectorStatusView.razor new file mode 100644 index 000000000..14f5b3a10 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Online/AxoDigitalInspectorStatusView.razor @@ -0,0 +1,58 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          + +
          +
          + +
          + +
          + + @if (Component._axoInspectorDialog._isOverInspected.Cyclic) + { +

          Overinspection detected

          + } +
          +
          +
          +
          + +
          +
          +
          +
          + +@code{ + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} + diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Shadow/AxoDigitalInspectorShadowControlView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Shadow/AxoDigitalInspectorShadowControlView.razor new file mode 100644 index 000000000..f3f211dd1 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Shadow/AxoDigitalInspectorShadowControlView.razor @@ -0,0 +1,25 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + +@code { + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Shadow/AxoDigitalInspectorShadowDisplayView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Shadow/AxoDigitalInspectorShadowDisplayView.razor new file mode 100644 index 000000000..994f810d3 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoDigitalInspector/Shadow/AxoDigitalInspectorShadowDisplayView.razor @@ -0,0 +1,25 @@ +@namespace AXOpen.Inspectors +@inherits RenderableComplexComponentBase + + + + + + + +@code { + private string ID = "M" + Guid.NewGuid().ToString(); + + public string getNameOrSymbol() + { + return string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + } + + protected override void OnInitialized() + { + UpdateValuesOnChange(Component._data.Result); + } +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoInspectorDialog/AxoInspectorDialogDialogView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoInspectorDialog/AxoInspectorDialogDialogView.razor new file mode 100644 index 000000000..a65edef11 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoInspectorDialog/AxoInspectorDialogDialogView.razor @@ -0,0 +1,39 @@ +@namespace AXOpen.Inspectors +@using AXOpen.Core.Blazor.AxoDialogs +@using Microsoft.AspNetCore.Components.Authorization; +@inherits AxoDialogBaseView +@inject AuthenticationStateProvider _asp + +

          AxoInspectorDialogDialogView

          + + + +

          Inspection failed, you will need to decide what's next...

          +
          + +
          + +
          @Description
          + @if (Inspector != null) + { + + } + else + { +

          Loading inspector... if it's taking long, something is wrong

          + } + +
          +
          + + + + + +
          +
          +
          + + + + diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoInspectorDialog/AxoInspectorDialogDialogView.razor.cs b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoInspectorDialog/AxoInspectorDialogDialogView.razor.cs new file mode 100644 index 000000000..383eaa5ff --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/AxoInspectorDialog/AxoInspectorDialogDialogView.razor.cs @@ -0,0 +1,100 @@ +using AXOpen.Core; +using AXOpen.Core.Blazor.AxoDialogs; +using AXOpen.Logging; +using AXSharp.Connector; +using Pocos.AXOpen.Inspectors; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AXOpen.Inspectors +{ + public partial class AxoInspectorDialogDialogView : AxoDialogBaseView, IDisposable + { + + public bool RetryDisabled { get; set; } = false; + + protected override void OnAfterRender(bool firstRender) + { + _inspector = null; + try + { + var parent = Component.GetParent(); + + if (parent is AxoInspector i) + { + _inspector = i; + } + } + catch (Exception) + { + } + + if(base.Component._isOverInspected.Cyclic) + RetryDisabled = true; + } + + public override void AddToPolling(ITwinElement element, int pollingInterval = 250) + { + base.AddToPolling(element, pollingInterval); + } + + public async Task Retry() + { + if (base.Component != null && !base.Component._isOverInspected.Cyclic) + { + RetryDisabled = false; + base.Component._dialogueRetry.Edit = true; + await base.CloseDialogsWithSignalR(); + var identity = (await _asp.GetAuthenticationStateAsync()).User.Identity; + AxoApplication.Current.Logger.Information($"{nameof(Retry)} of {Component.HumanReadable} was executed.", identity); + } + else + { + RetryDisabled = true; + } + + } + public async Task Terminate() + { + base.Component._dialogueTerminate.Edit = true; + await base.CloseDialogsWithSignalR(); + var identity = (await _asp.GetAuthenticationStateAsync()).User.Identity; + AxoApplication.Current.Logger.Information($"{nameof(Terminate)} of {Component.HumanReadable} was executed.", identity); + } + public async Task Override() + { + base.Component._dialogueOverride.Edit = true; + await base.CloseDialogsWithSignalR(); + var identity = (await _asp.GetAuthenticationStateAsync()).User.Identity; + AxoApplication.Current.Logger.Information($"{nameof(Override)} of {Component.HumanReadable} was executed.", identity); + } + + + public string Description + { + get => string.IsNullOrEmpty(base.Component.AttributeName) ? base.Component.GetSymbolTail() : base.Component.AttributeName; + + } + + private ITwinObject _inspector; + public ITwinObject Inspector + { + get + { + + return _inspector; + } + + } + + public override void Dispose() + { + base.Dispose(); + } + + } + + } diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/GenericIconView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/GenericIconView.razor new file mode 100644 index 000000000..ed7cbfc13 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/GenericIconView.razor @@ -0,0 +1,76 @@ +@namespace AXOpen.Inspectors + +
          + @switch (@Result) + { + case 0: + + + + break; + case 10: + + + + break; + case 20: + + + + break; + case 30: + + + + break; + case 35: + + + + break; + case 40: + + + + break; + case 50: + + + + break; + } +
          +
          + @switch (@Result) + { + case 0: +

          No Action

          + break; + case 10: +

          Running

          + break; + case 20: +

          Passed

          + break; + case 30: +

          Failed

          + break; + case 35: +

          Inconclusive

          + break; + case 40: +

          Excluded

          + break; + case 50: +

          Bypassed

          + break; + } +
          + + +@code { + [Parameter] + public short Result { get; set; } + + +} \ No newline at end of file diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/GenericInspectorDataView.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/GenericInspectorDataView.razor new file mode 100644 index 000000000..824a3452d --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/GenericInspectorDataView.razor @@ -0,0 +1,28 @@ +@namespace AXOpen.Inspectors + + + +
          +
          + + +@* + *@ +
          +
          + + + +
          +
          + + +
          +
          + +@code { + [Parameter] + public AxoInspectorData Data { get; set; } + [Parameter] + public string Presentation { get; set; } +} \ No newline at end of file diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/GenericInspectorDataView.razor.css b/src/inspectors/src/AxOpen.Inspectors.Blazor/GenericInspectorDataView.razor.css new file mode 100644 index 000000000..c6afca404 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/GenericInspectorDataView.razor.css @@ -0,0 +1,6 @@ +.my-component { + border: 2px dashed red; + padding: 1em; + margin: 1em 0; + background-image: url('background.png'); +} diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/InspectorViewTemplate.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/InspectorViewTemplate.razor new file mode 100644 index 000000000..3f79365c1 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/InspectorViewTemplate.razor @@ -0,0 +1,108 @@ +@namespace AXOpen.Inspectors + +
          +
          +
          + +
          +
          + +
          + @if (IsAnalogInspectorData()) + { +
          + +
          +
          + +
          +
          + +
          + } + else if(IsDigitalInspectorData()) + { +
          + +
          +
          + +
          + } + else if (IsDataInspectorData()) + { +
          + +
          +
          + +
          +
          + +
          + } + else + { +

          Cannot render, unspecified inspector type

          + } +
          + +
          +
          + +
          +
          + +
          + +
          + +
          + + @if (IsOverInspected) + { +

          Over-inspection detected

          + } +
          +
          + +
          +
          + +
          +
          +
          +
          + + + + +@code { + + + [Parameter] + public AxoInspectorData Data { get; set; } + + [Parameter] + public string Presentation { get; set; } + + [Parameter] + public bool IsOverInspected { get; set; } + + [Parameter] + public string Name { get; set; } + + + private string ID = "M" + Guid.NewGuid().ToString(); + + private bool IsAnalogInspectorData() => Data is AxoAnalogueInspectorData ? true : false; + private bool IsDigitalInspectorData() => Data is AxoDigitalInspectorData ? true : false; + private bool IsDataInspectorData() => Data is AxoDataInspectorData ? true : false; + + + +} + + diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/Properties/AssemblyInfo.cs b/src/inspectors/src/AxOpen.Inspectors.Blazor/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..7fc953296 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using AXSharp.Presentation.Blazor.Attributes; + +[assembly: RenderableBlazorAssembly()] \ No newline at end of file diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/_Imports.razor b/src/inspectors/src/AxOpen.Inspectors.Blazor/_Imports.razor new file mode 100644 index 000000000..9ec08f956 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/_Imports.razor @@ -0,0 +1,2 @@ +@using Microsoft.AspNetCore.Components.Web +@using AXSharp.Presentation.Blazor.Controls.RenderableContent diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/wwwroot/background.png b/src/inspectors/src/AxOpen.Inspectors.Blazor/wwwroot/background.png new file mode 100644 index 0000000000000000000000000000000000000000..e15a3bde6e2bdb380df6a0b46d7ed00bdeb0aaa8 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK1SGdsl%54rjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^ie7oTIEF;HpS|GCbyPusHSqiXaCu3qf)82(9Gq&mZq2{Kq}M*X&MWtJ zSi1Jo7ZzfImg%g=t(qo=wsSR2lZoP(Rj#3wacN=q0?Br(rXzgZEGK2$ID{|A=5S{xJEuzSH>!M+7wSY6hB<=-E^*n0W7 S8wY^CX7F_Nb6Mw<&;$S{dxtsz literal 0 HcmV?d00001 diff --git a/src/inspectors/src/AxOpen.Inspectors.Blazor/wwwroot/exampleJsInterop.js b/src/inspectors/src/AxOpen.Inspectors.Blazor/wwwroot/exampleJsInterop.js new file mode 100644 index 000000000..ea8d76ad2 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors.Blazor/wwwroot/exampleJsInterop.js @@ -0,0 +1,6 @@ +// This is a JavaScript module that is loaded on demand. It can export any number of +// functions, and may import other JavaScript modules if required. + +export function showPrompt(message) { + return prompt(message, 'Type anything here'); +} diff --git a/src/inspectors/src/AxOpen.Inspectors/ix_ax_axopen_inspectors.csproj b/src/inspectors/src/AxOpen.Inspectors/ix_ax_axopen_inspectors.csproj new file mode 100644 index 000000000..a5e68bbd2 --- /dev/null +++ b/src/inspectors/src/AxOpen.Inspectors/ix_ax_axopen_inspectors.csproj @@ -0,0 +1,20 @@ + + + net7.0 + enable + enable + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/templates.simple/axosimple.app/Components/UnitsData.razor b/src/templates.simple/axosimple.app/Components/UnitsData.razor index 1e7c2b460..ff504062b 100644 --- a/src/templates.simple/axosimple.app/Components/UnitsData.razor +++ b/src/templates.simple/axosimple.app/Components/UnitsData.razor @@ -9,8 +9,8 @@ Process Data
          - - + + @**@
          diff --git a/src/templates.simple/axosimple.app/Pages/UI/ManipulatorExample.razor b/src/templates.simple/axosimple.app/Pages/UI/ManipulatorExample.razor index 5c0e0d730..99576fc08 100644 --- a/src/templates.simple/axosimple.app/Pages/UI/ManipulatorExample.razor +++ b/src/templates.simple/axosimple.app/Pages/UI/ManipulatorExample.razor @@ -7,9 +7,15 @@ @using AXOpen.Messaging.Static @using AXSharp.Connector; - @inject IAlertDialogService _alerts + + + + + + + @@ -23,28 +29,37 @@ } + + + + + +

          Comprehensive result

          + - + @code { - private ElementReference keyDownDiv; - private ModalDialog ModalDialog { get; set; } + private IEnumerable Messengers => Entry.Plc.Context.PneumaticManipulator.GetChildren().Flatten(p => p.GetChildren()).OfType(); - private void showAlert() + private void Reset() { - _alerts.AddAlertDialog(eAlertDialogType.Info, "Ahoj", "som dialog", 60); + Entry.Plc.Context.PneumaticManipulator.AutomatSequence._comprehensiveResult.Result.Cyclic = 0; + _alerts.AddAlertDialog(eAlertDialogType.Info, "Comprehenesive result", "Reseted", 3); StateHasChanged(); } + + } diff --git a/src/templates.simple/axosimple.app/Pages/UI/ProcessData.razor b/src/templates.simple/axosimple.app/Pages/UI/ProcessData.razor index 8f2a34d26..b48a6361e 100644 --- a/src/templates.simple/axosimple.app/Pages/UI/ProcessData.razor +++ b/src/templates.simple/axosimple.app/Pages/UI/ProcessData.razor @@ -23,7 +23,7 @@ } - + @**@ diff --git a/src/templates.simple/axosimple.app/Program.cs b/src/templates.simple/axosimple.app/Program.cs index 969face9d..cd91a857e 100644 --- a/src/templates.simple/axosimple.app/Program.cs +++ b/src/templates.simple/axosimple.app/Program.cs @@ -56,8 +56,7 @@ //Entry.Plc.ContextLogger.StartDequeuing(AxoApplication.Current.Logger, 250); -var a = Entry.Plc.Context.PneumaticManipulator - .ProcessData +var a = Entry.Plc.Context.ProcessDataPneumaticManipulator .CreateBuilder(); a.DataManger.SetRepository(productionDataRepository); diff --git a/src/templates.simple/axosimple.app/axosimple.hmi.csproj b/src/templates.simple/axosimple.app/axosimple.hmi.csproj index 6e18ab526..24eab0fbe 100644 --- a/src/templates.simple/axosimple.app/axosimple.hmi.csproj +++ b/src/templates.simple/axosimple.app/axosimple.hmi.csproj @@ -33,6 +33,7 @@ + diff --git a/src/templates.simple/axosimple.twin/Entry.cs b/src/templates.simple/axosimple.twin/Entry.cs index 8ce14c7b2..f7e878a77 100644 --- a/src/templates.simple/axosimple.twin/Entry.cs +++ b/src/templates.simple/axosimple.twin/Entry.cs @@ -17,7 +17,7 @@ namespace axosimple { public static class Entry { - private const string TargetIp = "10.10.10.1"; // <- replace by your IP + private static string TargetIp = Environment.GetEnvironmentVariable("AXTARGET"); // <- replace by your IP private const string UserName = "Everybody"; //<- replace by user name you have set up in your WebAPI settings private const string Pass = ""; // <- Pass in the password that you have set up for the user. NOT AS PLAIN TEXT! Use user secrets instead. private const bool IgnoreSslErrors = true; // <- When you have your certificates in order set this to false. diff --git a/src/templates.simple/axosimple.twin/Resources/PlcStringResources.resx b/src/templates.simple/axosimple.twin/Resources/PlcStringResources.resx index b8b155214..a557e9af4 100644 --- a/src/templates.simple/axosimple.twin/Resources/PlcStringResources.resx +++ b/src/templates.simple/axosimple.twin/Resources/PlcStringResources.resx @@ -76,14 +76,14 @@ AUTOMAT - src\Examples\PneumaticManipulator.st,142 + src\Examples\PneumaticManipulator.st,147 GROUND - src\Examples\PneumaticManipulator.st,315 + src\Examples\PneumaticManipulator.st,339 SERVICE - src\Examples\PneumaticManipulator.st,369 + src\Examples\PneumaticManipulator.st,393 \ No newline at end of file diff --git a/src/templates.simple/axosimple.twin/axosimple.csproj b/src/templates.simple/axosimple.twin/axosimple.csproj index 2ac803782..e6439a67f 100644 --- a/src/templates.simple/axosimple.twin/axosimple.csproj +++ b/src/templates.simple/axosimple.twin/axosimple.csproj @@ -15,6 +15,7 @@ + @@ -29,4 +30,7 @@ PlcStringResources.Designer.cs + + + \ No newline at end of file diff --git a/src/templates.simple/ctrl/apax.yml b/src/templates.simple/ctrl/apax.yml index d9787c339..d8b6bdb39 100644 --- a/src/templates.simple/ctrl/apax.yml +++ b/src/templates.simple/ctrl/apax.yml @@ -8,6 +8,7 @@ devDependencies: "@ax/sld": ^0.15.9 dependencies: "@ix-ax/axopen.data": '0.1.4-alpha.79' + "@ix-ax/axopen.inspectors": '0.1.4-alpha.79' "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' "@ax/system-serde": ^2.0.2 variables: diff --git a/src/templates.simple/ctrl/monitor.mon b/src/templates.simple/ctrl/monitor.mon index f74cb314d..32bf13da6 100644 --- a/src/templates.simple/ctrl/monitor.mon +++ b/src/templates.simple/ctrl/monitor.mon @@ -10,11 +10,14 @@ #Context.PneumaticManipulator.AutomatSequence._dialog -Context.PneumaticManipulator.AutomatSequence._dialog3._closeSignal -Context.PneumaticManipulator.AutomatSequence._dialog3._answer -Context.PneumaticManipulator.AutomatSequence._externalClose -Context.PneumaticManipulator.AutomatSequence._dialog3._edgeDetected -Context.PneumaticManipulator.AutomatSequence._dialog3._testClose +#Context.PneumaticManipulator.AutomatSequence._dialog3._closeSignal +#Context.PneumaticManipulator.AutomatSequence._dialog3._answer +#Context.PneumaticManipulator.AutomatSequence._externalClose +#Context.PneumaticManipulator.AutomatSequence._dialog3._edgeDetected +#Context.PneumaticManipulator.AutomatSequence._dialog3._testClose +Context.PneumaticManipulator.AutomatSequence.Steps[13] +Context.PneumaticManipulator.AutomatSequence._presenceInspector._data + #Context.PneumaticManipulator.AutomatSequence._dialog1 #Context.PneumaticManipulator.AutomatSequence._dialog2 diff --git a/src/templates.simple/ctrl/src/Context.st b/src/templates.simple/ctrl/src/Context.st index 3680e5518..4e8752f84 100644 --- a/src/templates.simple/ctrl/src/Context.st +++ b/src/templates.simple/ctrl/src/Context.st @@ -10,11 +10,15 @@ NAMESPACE axosimple PneumaticManipulator2 : examples.PneumaticManipulator.CU; Inputs : REF_TO axosimple.Inputs; Outputs : REF_TO axosimple.Outputs; + + ProcessDataPneumaticManipulator : examples.PneumaticManipulator.ProcessDataManger; END_VAR METHOD PROTECTED OVERRIDE Main IF(Inputs <> NULL AND Outputs <> NULL) THEN + PneumaticManipulator.ProcessData := REF(ProcessDataPneumaticManipulator); PneumaticManipulator.Run(THIS, Inputs^, Outputs^); + PneumaticManipulator2.ProcessData := REF(ProcessDataPneumaticManipulator); PneumaticManipulator2.Run(THIS, Inputs^, Outputs^); END_IF; END_METHOD diff --git a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st index 8cf50104e..421d83729 100644 --- a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st +++ b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st @@ -39,6 +39,9 @@ NAMESPACE examples.PneumaticManipulator EXTENDS AXOpen.Data.AxoDataEntity VAR PUBLIC CounterDelay : ULINT; + _presenceInspector: AXOpen.Inspectors.AxoDigitalInspector; + _valueInspector: AXOpen.Inspectors.AxoAnalogueInspector; + _dataInspector: AXOpen.Inspectors.AxoDataInspector; END_VAR END_CLASS @@ -73,7 +76,9 @@ NAMESPACE examples.PneumaticManipulator /// Handles and intializes components used by this unit. /// Components : Components; - ProcessData : ProcessDataManger; + + ProcessData : REF_TO ProcessDataManger; + /// /// Ground sequence. Contains logic that brings the unit into initial state. /// @@ -117,9 +122,9 @@ NAMESPACE examples.PneumaticManipulator // Component I/O immange and management handling. Components.Update(THIS, Inputs, Outputs); // Process data manager - ProcessData.Run(THIS); + ProcessData^.Run(THIS); // Handles ground sequence - GroundSequence.Run(REF(Components), REF(ProcessData), THIS); + GroundSequence.Run(REF(Components), ProcessData, THIS); // Restores other states when Ground executes IF (GroundSequence.IsBusy()) THEN AutomatSequence.Restore(); @@ -127,7 +132,7 @@ NAMESPACE examples.PneumaticManipulator END_IF; // Handles automatic sequence (ground must be previously done) AutomatSequence.IsDisabled := GroundSequence.Status <> eAxoTaskState#Done; - AutomatSequence.Run(REF(Components), REF(ProcessData), THIS); + AutomatSequence.Run(REF(Components), ProcessData, THIS); // Handles service/manual mode ServiceMode.Run(THIS, Components); IF ServiceMode.IsBusy() THEN @@ -150,6 +155,14 @@ NAMESPACE examples.PneumaticManipulator _dialog2 : AXOpen.Core.AxoDialog; _dialog3 : AXOpen.Core.AxoDialog; _alertDialog : AXOpen.Core.AxoAlertDialog; + _presenceInspector: AXOpen.Inspectors.AxoDigitalInspector; + _valueInspector: AXOpen.Inspectors.AxoAnalogueInspector; + _dataInspector: AXOpen.Inspectors.AxoDataInspector; + _data: AXOpen.Inspectors.AxoDigitalInspectorData; + _comprehensiveResult: AXOpen.Inspectors.AxoComprehensiveResult; + _inspectionResult:BOOL; + _inspectionValue:LREAL; + _inspectionData: STRING; _externalClose : BOOL; END_VAR VAR PRIVATE @@ -230,81 +243,92 @@ NAMESPACE examples.PneumaticManipulator //------------------------------------------------------- END_IF; + IF (Steps[16].Execute(THIS, TRUE, 'Set inpsection times')) THEN + //-------------------------------------------- - IF (Steps[20].Execute(THIS, TRUE, 'Dummy')) THEN - //------------------------------------------------------- - IF(Steps[20].Duration > T#100ms) THEN - - THIS.MoveNext(); - END_IF; - END_IF; + _valueInspector.Data()^.FailTime := TIME#3s; + _presenceInspector.Data()^.FailTime := TIME#3s; + _dataInspector.Data()^.FailTime := TIME#3s; - IF (Steps[30].Execute(THIS, TRUE, 'Show dialog 0')) THEN - //------------------------------------------------------- + _valueInspector.Data()^.PassTime := TIME#2s; + _presenceInspector.Data()^.PassTime := TIME#2s; + _dataInspector.Data()^.PassTime := TIME#2s; - IF(_dialog.Show(THIS) - .WithOk() - .WithType(eDialogType#Success) - .WithCaption('What`s next?') - .WithText('To continue click OK?').Answer() = eDialogAnswer#OK) THEN + _valueInspector.Data()^.NumberOfAllowedRetries := UINT#3; - - THIS.MoveNext(); + THIS.MoveNext(); + //-------------------------------------------- + END_IF; + + IF (Steps[20].Execute(THIS, TRUE, 'RETRY STEP 90')) THEN + + IF(Steps[20].Duration > T#2000ms) THEN + THIS.MoveNext(); END_IF; + + END_IF; - IF (Steps[40].Execute(THIS, TRUE, 'Dummy')) THEN - //------------------------------------------------------- - IF(Steps[40].Duration > T#100ms) THEN - - THIS.MoveNext(); - END_IF; - END_IF; + IF (Steps[30].Execute(THIS, TRUE, 'Example Digital inspection')) THEN + //------------------------------------------------------- + _presenceInspector.WithCoordinator(THIS).Inspect(THIS,_inspectionResult).UpdateComprehensiveResult(_comprehensiveResult).OnFail().Dialog(Steps[20], Steps[145]); + //------------------------------------------------------- + END_IF; - IF (Steps[50].Execute(THIS, TRUE, 'Show dialog 1')) THEN - //------------------------------------------------------- - IF(_dialog1.Show(THIS) - .WithYesNoCancel() - .WithType(eDialogType#Warning) - .WithCaption('YesNoCancel dialog') - .WithText('Click yes to continue?').Answer() = eDialogAnswer#Yes) THEN - - - THIS.MoveNext(); + IF (Steps[40].Execute(THIS, TRUE, 'Example Analog inspection')) THEN + //------------------------------------------------------- + - END_IF; - - END_IF; + _valueInspector.WithCoordinator(THIS).Inspect(THIS,_inspectionValue).UpdateComprehensiveResult(_comprehensiveResult).OnFail().Dialog(Steps[20], Steps[145]); - IF (Steps[60].Execute(THIS, TRUE, 'Dummy')) THEN - //------------------------------------------------------- - IF(Steps[60].Duration > T#100ms) THEN - - THIS.MoveNext(); - END_IF; + //------------------------------------------------------- + END_IF; + + + IF (Steps[50].Execute(THIS, TRUE, 'Example Data inspection')) THEN + //------------------------------------------------------- + + _dataInspector.WithCoordinator(THIS).Inspect(THIS,_inspectionData).UpdateComprehensiveResult(_comprehensiveResult).OnFail().Dialog(Steps[20], Steps[145]); + + //------------------------------------------------------- END_IF; - IF (Steps[70].Execute(THIS, TRUE, 'Show dialog 2')) THEN + + + IF (Steps[60].Execute(THIS, TRUE, 'Show dialog 0')) THEN //------------------------------------------------------- + + IF(_dialog.Show(THIS) + .WithOk() + .WithType(eDialogType#Success) + .WithCaption('What`s next?') + .WithText('To continue click OK?').Answer() = eDialogAnswer#OK) THEN - IF(_dialog2.Show(THIS) - .WithYesNo() - .WithType(eDialogType#Danger) - .WithCaption('YesNo dialog') - .WithText('Click yes to continue?').Answer() = eDialogAnswer#Yes) THEN - - THIS.MoveNext(); - END_IF; + THIS.RequestStep(Steps[149]); + //------------------------------------------------------- + END_IF; + END_IF; + + IF (Steps[145].Execute(THIS, TRUE, 'Restore origin step')) THEN + //------------------------------------------------------- + + ; + // //------------------------------------------------------- END_IF; -//------------------------------------------------------- - + + IF (Steps[149].Execute(THIS, TRUE, 'Dummy end')) THEN + //------------------------------------------------------- + THIS.MoveNext(); + + //------------------------------------------------------- + END_IF; // This will close the sequence and will return to the first step. THIS.Close(Steps[150]); END_METHOD diff --git a/src/ws.code-workspace b/src/ws.code-workspace new file mode 100644 index 000000000..2703b23dd --- /dev/null +++ b/src/ws.code-workspace @@ -0,0 +1,41 @@ +{ + "folders": [ + { + "name": "templates.simple", + "path": "templates.simple/ctrl" + }, + { + "name": "core", + "path": "core/ctrl" + }, + { + "name": "integrations", + "path": "integrations/ctrl" + }, + { + "name": "simatic1500", + "path": "simatic1500/ctrl" + }, + { + "name": "utils", + "path": "utils/ctrl" + }, + { + "name": "data", + "path": "data/ctrl" + }, + { + "name": "probers", + "path": "probers/ctrl" + }, + { + "name": "abstractions", + "path": "abstractions/ctrl" + }, + { + "name": "inspectors", + "path": "inspectors/ctrl" + } + ], + "settings": {} +} \ No newline at end of file