From 331ee449781aecaaf5b2e82236e2729eb488fdeb Mon Sep 17 00:00:00 2001 From: Bernhard Elsner <40762178+bame-da@users.noreply.github.com> Date: Thu, 24 Sep 2020 16:40:57 +0200 Subject: [PATCH] Documentation of our support and compatibility framework (#7458) * Documentation of our support and compatibility framework CHANGELOG_BEGIN CHANGELOG_END * Update docs/source/daml-integration-kit/index.rst Co-authored-by: Moritz Kiefer * Update docs/source/support/component-statuses.rst Co-authored-by: Moritz Kiefer * Address feedback * Update docs/source/support/compatibility.rst Co-authored-by: Gerolf Seitz * Add Deprecations and address feedback * Fix short title underline * Apply suggestions from code review Co-authored-by: Gerolf Seitz * Improve sentence on Integration Kit * Imprive SemVer TLDR * Uncapitalize release candidate * Fix release timeline image * Make the DAML Language Server CLI a Labs feature Co-authored-by: Moritz Kiefer Co-authored-by: Gerolf Seitz --- compiler/damlc/lib/DA/Cli/Damlc.hs | 6 +- .../damlc/lib/DA/Cli/Damlc/Command/Damldoc.hs | 2 +- .../daml-helper/src/DA/Daml/Helper/Main.hs | 2 +- .../daml/lf/engine/script/RunnerConfig.scala | 2 +- docs/configs/pdf/index.rst | 11 +- docs/redirects.map | 6 +- docs/source/app-dev/bindings-java/index.rst | 142 +++---- docs/source/app-dev/bindings-js.rst | 2 + docs/source/app-dev/bindings-scala/index.rst | 2 + docs/source/daml-integration-kit/index.rst | 8 +- docs/source/getting-started/installation.rst | 2 + docs/source/index.rst | 9 +- docs/source/support/architecture.png | Bin 0 -> 51973 bytes docs/source/support/compatibility.rst | 57 +++ docs/source/support/component-statuses.rst | 349 ++++++++++++++++++ docs/source/support/overview.rst | 65 ++++ docs/source/support/release-notes.rst | 7 - docs/source/support/release-timeline.png | Bin 0 -> 26723 bytes docs/source/support/releases.rst | 86 +++++ docs/source/support/roadmap.rst | 8 - docs/source/support/status-definitions.rst | 127 +++++++ docs/source/support/support.rst | 4 +- docs/source/tools/extractor.rst | 2 + docs/source/tools/navigator/console.rst | 2 + docs/source/tools/navigator/database.rst | 1 + docs/source/tools/trigger-service.rst | 2 +- docs/source/tools/visual.rst | 2 + docs/source/triggers/index.rst | 3 +- .../navigator/config/Arguments.scala | 4 +- release/sdk-config.yaml.tmpl | 2 +- 30 files changed, 804 insertions(+), 111 deletions(-) create mode 100644 docs/source/support/architecture.png create mode 100644 docs/source/support/compatibility.rst create mode 100644 docs/source/support/component-statuses.rst create mode 100644 docs/source/support/overview.rst delete mode 100644 docs/source/support/release-notes.rst create mode 100644 docs/source/support/release-timeline.png create mode 100644 docs/source/support/releases.rst delete mode 100644 docs/source/support/roadmap.rst create mode 100644 docs/source/support/status-definitions.rst diff --git a/compiler/damlc/lib/DA/Cli/Damlc.hs b/compiler/damlc/lib/DA/Cli/Damlc.hs index 0dceea82add..8a351538622 100644 --- a/compiler/damlc/lib/DA/Cli/Damlc.hs +++ b/compiler/damlc/lib/DA/Cli/Damlc.hs @@ -224,14 +224,14 @@ cmdInspect = cmdVisual :: Mod CommandFields Command cmdVisual = - command "visual" $ info (helper <*> cmd) $ progDesc "Generate visual from dar (early access)" <> fullDesc + command "visual" $ info (helper <*> cmd) $ progDesc "Early Access (Labs). Generate visual from dar" <> fullDesc where cmd = vis <$> inputDarOpt <*> dotFileOpt vis a b = Command Visual Nothing $ execVisual a b cmdVisualWeb :: Mod CommandFields Command cmdVisualWeb = - command "visual-web" $ info (helper <*> cmd) $ progDesc "Generate D3-Web Visual from dar (early access)" <> fullDesc + command "visual-web" $ info (helper <*> cmd) $ progDesc "Early Access (Labs). Generate D3-Web Visual from dar" <> fullDesc where cmd = vis <$> inputDarOpt <*> htmlOutFile <*> openBrowser vis a b browser = Command Visual Nothing $ execVisualHtml a b browser @@ -408,7 +408,7 @@ cmdDocTest :: Int -> Mod CommandFields Command cmdDocTest numProcessors = command "doctest" $ info (helper <*> cmd) $ - progDesc "doc tests" <> fullDesc + progDesc "Early Access (Labs). doc tests" <> fullDesc where cmd = execDocTest <$> optionsParser numProcessors (EnableScenarioService True) optPackageName diff --git a/compiler/damlc/lib/DA/Cli/Damlc/Command/Damldoc.hs b/compiler/damlc/lib/DA/Cli/Damlc/Command/Damldoc.hs index 40eea69de4a..46dbccca54d 100644 --- a/compiler/damlc/lib/DA/Cli/Damlc/Command/Damldoc.hs +++ b/compiler/damlc/lib/DA/Cli/Damlc/Command/Damldoc.hs @@ -22,7 +22,7 @@ import qualified Data.Set as Set cmd :: Int -> (CmdArgs -> a) -> Mod CommandFields a cmd numProcessors f = command "docs" $ info (helper <*> (f <$> documentation numProcessors)) $ - progDesc "Generate documentation for the given DAML program." + progDesc "Early Access (Labs). Generate documentation for the given DAML program." <> fullDesc documentation :: Int -> Parser CmdArgs diff --git a/daml-assistant/daml-helper/src/DA/Daml/Helper/Main.hs b/daml-assistant/daml-helper/src/DA/Daml/Helper/Main.hs index cdd9985724e..331a15f3ad0 100644 --- a/daml-assistant/daml-helper/src/DA/Daml/Helper/Main.hs +++ b/daml-assistant/daml-helper/src/DA/Daml/Helper/Main.hs @@ -165,7 +165,7 @@ commandParser = subparser $ fold <*> (JsonApiOptions <$> many (strOption (long "json-api-option" <> metavar "JSON_API_OPTION" <> help "Pass option to HTTP JSON API"))) <*> (ScriptOptions <$> many (strOption (long "script-option" <> metavar "SCRIPT_OPTION" <> help "Pass option to DAML script interpreter"))) <*> stdinCloseOpt - <*> (SandboxClassic <$> switch (long "sandbox-classic" <> help "Run with Sandbox Classic.")) + <*> (SandboxClassic <$> switch (long "sandbox-classic" <> help "Deprecated. Run with Sandbox Classic.")) navigatorFlag = -- We do not use flagYesNoAuto here since that doesn’t allow us to differentiate diff --git a/daml-script/runner/src/main/scala/com/digitalasset/daml/lf/engine/script/RunnerConfig.scala b/daml-script/runner/src/main/scala/com/digitalasset/daml/lf/engine/script/RunnerConfig.scala index 04981b2dac1..0d9c6f3aea8 100644 --- a/daml-script/runner/src/main/scala/com/digitalasset/daml/lf/engine/script/RunnerConfig.scala +++ b/daml-script/runner/src/main/scala/com/digitalasset/daml/lf/engine/script/RunnerConfig.scala @@ -108,7 +108,7 @@ object RunnerConfig { .action { (_, c) => c.copy(jsonApi = true) } - .text("Run DAML Script via the HTTP JSON API instead of via gRPC (experimental).") + .text("Run DAML Script via the HTTP JSON API instead of via gRPC.") opt[Int]("max-inbound-message-size") .action((x, c) => c.copy(maxInboundMessageSize = x)) diff --git a/docs/configs/pdf/index.rst b/docs/configs/pdf/index.rst index fb99dab6bac..b41e1398677 100644 --- a/docs/configs/pdf/index.rst +++ b/docs/configs/pdf/index.rst @@ -100,13 +100,14 @@ Early Access Features triggers/index tools/visual -Support and updates -------------------- +DAML Ecosystem +-------------- .. toctree:: :titlesonly: :maxdepth: 2 - support/support - support/release-notes - Roadmap + support/overview + support/releases + support/compatibility + support/support \ No newline at end of file diff --git a/docs/redirects.map b/docs/redirects.map index 80ad7f611e1..62a2fa6aa27 100644 --- a/docs/redirects.map +++ b/docs/redirects.map @@ -1,9 +1,7 @@ app-arch/index.html -> /app-dev/app-arch.html -release-notes.html -> /support/release-notes.html tools/extractor.html integration.html -> /app-dev/app-arch.html index.html -support.html -> /support/support.html daml.html -> /daml/reference/index.html daml/reference/template-reference.html -> /daml/reference/index.html daml/anti-patterns.html @@ -815,3 +813,7 @@ app-dev/authentication.html -> /app-dev/authorization.html daml/intro/2_Scenario.html -> /daml/intro/2_DamlScript.html daml-script/daml-script-docs.html -> /daml-script/api/index.html triggers/trigger-docs.html -> /triggers/api/index.html +support.html -> /support/support.html +release-notes.html -> support/releases.html#release-notes +support/release-notes.html -> support/releases.html#release-notes +support/roadmap.html -> support/releases.html#roadmap \ No newline at end of file diff --git a/docs/source/app-dev/bindings-java/index.rst b/docs/source/app-dev/bindings-java/index.rst index 2bfc2cc0db7..c38310ce089 100644 --- a/docs/source/app-dev/bindings-java/index.rst +++ b/docs/source/app-dev/bindings-java/index.rst @@ -42,7 +42,7 @@ The Java bindings library is composed of: Can be found in the java package ``com.daml.ledger.rxjava``. - The Reactive Components - A set of optional components you can use to assemble DAML Ledger applications. + A set of optional components you can use to assemble DAML Ledger applications. These components are deprecated as of 2020-10-14. The most important components are: @@ -67,73 +67,6 @@ Connections to the ledger are made by creating instance of classes that implemen This class provides access to the ledgerId, and all clients that give access to the various ledger services, such as the active contract set, the transaction service, the time service, etc. This is described :ref:`below `. Consult the `JavaDoc for DamlLedgerClient `_ for full details. -Accessing data on the ledger: LedgerView -======================================== - -The ``LedgerView`` of an application is the "copy" of the ledger that the application has locally. You can query it to obtain the contracts that are active on the Ledger and not pending. - -.. note:: - - - A contract is *active* if it exists in the Ledger and has not yet been archived. - - A contract is *pending* if the application has sent a consuming command to the Ledger and has yet - to receive an completion for the command (that is, if the command has succeeded or not). - -The ``LedgerView`` is updated every time: - -- a new event is received from the Ledger -- new commands are sent to the Ledger -- a command has failed to be processed - -For instance, if an incoming transaction is received with a create event for a contract that is relevant -for the application, the application ``LedgerView`` is updated to contain that contract too. - -Writing automations: Bot -======================== - -The ``Bot`` is an abstraction used to write automation for a DAML Ledger. It is conceptually -defined by two aspects: - -- the ``LedgerView`` -- the logic that produces commands, given a ``LedgerView`` - -When the ``LedgerView`` is updated, to see if the bot has new commands to submit based on the -updated view, the logic of the bot is run. - -The logic of the bot is a Java function from the bot's ``LedgerView`` to a ``Flowable``. -Each ``CommandsAndPendingSet`` contains: - -- the commands to send to the Ledger -- the set of contractIds that should be considered pending while the command is in-flight - (that is, sent by the client but not yet processed by the Ledger) - -You can wire a ``Bot`` to a ``LedgerClient`` implementation using ``Bot.wire``: - -.. code-block:: java - - Bot.wire(String applicationId, - LedgerClient ledgerClient, - TransactionFilter transactionFilter, - Function, Flowable> bot, - Function transform) - -In the above: - -- ``applicationId`` - The id used by the Ledger to identify all the queries from the same application. -- ``ledgerClient`` - The connection to the Ledger. -- ``transactionFilter`` - The server-side filter to the incoming transactions. Used to reduce the traffic between - Ledger and application and make an application more efficient. -- ``bot`` - The logic of the application, -- ``transform`` - The function that, given a new contract, returns which information for - that contracts are useful for the application. Can be used to reduce space used - by discarding all the info not required by the application. The input to the function - contains the ``templateId``, the arguments of the contract created and the context of - the created contract. The context contains the ``workflowId``. - Reference documentation *********************** @@ -212,7 +145,80 @@ Advanced connection settings Sometimes the default settings for gRPC connections/channels are not suitable for a given situation. These use cases are supported by creating a a custom `NettyChannelBuilder `_ object and passing the it to the ``newBuilder`` static method defined over `DamlLedgerClient `_. +Reactive Components +=================== + +The Reactive Components are deprecated as of 2020-10-14. + +Accessing data on the ledger: LedgerView +---------------------------------------- + +The ``LedgerView`` of an application is the "copy" of the ledger that the application has locally. You can query it to obtain the contracts that are active on the Ledger and not pending. + +.. note:: + + - A contract is *active* if it exists in the Ledger and has not yet been archived. + - A contract is *pending* if the application has sent a consuming command to the Ledger and has yet + to receive an completion for the command (that is, if the command has succeeded or not). + +The ``LedgerView`` is updated every time: + +- a new event is received from the Ledger +- new commands are sent to the Ledger +- a command has failed to be processed + +For instance, if an incoming transaction is received with a create event for a contract that is relevant +for the application, the application ``LedgerView`` is updated to contain that contract too. + +Writing automations: Bot +------------------------ + +The ``Bot`` is an abstraction used to write automation for a DAML Ledger. It is conceptually +defined by two aspects: + +- the ``LedgerView`` +- the logic that produces commands, given a ``LedgerView`` + +When the ``LedgerView`` is updated, to see if the bot has new commands to submit based on the +updated view, the logic of the bot is run. + +The logic of the bot is a Java function from the bot's ``LedgerView`` to a ``Flowable``. +Each ``CommandsAndPendingSet`` contains: + +- the commands to send to the Ledger +- the set of contractIds that should be considered pending while the command is in-flight + (that is, sent by the client but not yet processed by the Ledger) + +You can wire a ``Bot`` to a ``LedgerClient`` implementation using ``Bot.wire``: + +.. code-block:: java + + Bot.wire(String applicationId, + LedgerClient ledgerClient, + TransactionFilter transactionFilter, + Function, Flowable> bot, + Function transform) + +In the above: + +- ``applicationId`` + The id used by the Ledger to identify all the queries from the same application. +- ``ledgerClient`` + The connection to the Ledger. +- ``transactionFilter`` + The server-side filter to the incoming transactions. Used to reduce the traffic between + Ledger and application and make an application more efficient. +- ``bot`` + The logic of the application, +- ``transform`` + The function that, given a new contract, returns which information for + that contracts are useful for the application. Can be used to reduce space used + by discarding all the info not required by the application. The input to the function + contains the ``templateId``, the arguments of the contract created and the context of + the created contract. The context contains the ``workflowId``. + Example project *************** Example projects using the Java bindings are available on `GitHub `__. :doc:`Read more about them here `. + diff --git a/docs/source/app-dev/bindings-js.rst b/docs/source/app-dev/bindings-js.rst index 19586c983a9..d9880ffda0f 100644 --- a/docs/source/app-dev/bindings-js.rst +++ b/docs/source/app-dev/bindings-js.rst @@ -4,6 +4,8 @@ Node.js bindings ################ +The Node.js bindings are deprecated as of 2020-10-14. + The documentation for the Node.js bindings has been moved to `digital-asset.github.io/daml-js `__. You can also try the Node.js bindings tutorial, which is at `github.com/digital-asset/ex-tutorial-nodejs `__. diff --git a/docs/source/app-dev/bindings-scala/index.rst b/docs/source/app-dev/bindings-scala/index.rst index 7ea48b58298..6c29e55a21d 100644 --- a/docs/source/app-dev/bindings-scala/index.rst +++ b/docs/source/app-dev/bindings-scala/index.rst @@ -6,6 +6,8 @@ Scala bindings ############## +The Scala bindings are deprecated as of 2020-10-14. + This page provides a basic Scala programmer's introduction to working with DAML Ledgers, using the Scala programming language and the **Ledger API**. diff --git a/docs/source/daml-integration-kit/index.rst b/docs/source/daml-integration-kit/index.rst index f93a251e13d..f10e198ec46 100644 --- a/docs/source/daml-integration-kit/index.rst +++ b/docs/source/daml-integration-kit/index.rst @@ -1,8 +1,10 @@ .. Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. .. SPDX-License-Identifier: Apache-2.0 -DAML Integration Kit - ALPHA -############################ +DAML Integration Kit +#################### + +The DAML Integration Kit is currently an :doc:`Early Access Feature in Labs status `. It comprises the components needed to build your own :ref:`DAML Drivers `. .. toctree:: :hidden: @@ -228,7 +230,7 @@ Library infrastructure overview To help you implement your server and validator, we provide the following four Scala libraries as part of the DAML SDK. Changes -to them are explained as part of the :doc:`/support/release-notes`. +to them are explained as part of the :ref:`release-notes`. As explained in :ref:`integration-kit_writing_code`, this section is best read jointly with the code in diff --git a/docs/source/getting-started/installation.rst b/docs/source/getting-started/installation.rst index cf9cbd538ed..ee23986bc80 100644 --- a/docs/source/getting-started/installation.rst +++ b/docs/source/getting-started/installation.rst @@ -24,6 +24,8 @@ Windows 10 Download and run the installer_, which will install DAML and set up your PATH. +.. _mac-linux-sdk: + Mac and Linux ============= diff --git a/docs/source/index.rst b/docs/source/index.rst index 9eff3e88afb..0c6de2455df 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -112,8 +112,9 @@ DAML SDK documentation :titlesonly: :maxdepth: 2 :hidden: - :caption: Support and updates + :caption: DAML Ecosystem - support/support - support/release-notes - Roadmap + support/overview + support/releases + support/compatibility + support/support \ No newline at end of file diff --git a/docs/source/support/architecture.png b/docs/source/support/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..02ae1cc7baee50faa7840f3f98e7751065385928 GIT binary patch literal 51973 zcmeFZc{J4h|39pfbVVgf_N!DC!uFvwl&+k6xKEHGB`~2pQ>s%-AdA(n+=kxX49?!>f zZrH*sCI68BLqtSG^5~Jn_97x;7!eUsEpajMFGB-6W<*3Ti5xwA=)}d|v3{HDiqsgj z8K+JdaqrcpK3CZTo9Em zbyds>hja5yokkGV7D(%jk`-V>|L61n2MK)c?&I5fKY@jp_m5=Vuj%XL4C|@mgWipP z;BBE*q86o>3r~4>l)YdhAV0D9jbTN0kY;Q%S8V*!`bnoUi+cCRceJQVQAVwn0|{#V zBVX)EL9)h5OX4}VL3w8dqiyv4Ft14dwP9^TI9>tTA1|xIu#Uu_vu!S_jPq)POx1)B zU#fb(Vu2mJ- zh;b7Ob+3z^kWfDjBy?0?6DuuJ#JOUr{=}+dnaHy~ox6Jv<>#)(%)QR2!otO@rRKgJ z$sLjIJ}xIuJWr777z$XE4byER`na_gW_yuMaUI#5IM^jvFy`F(pkwMoQ_>=z^C<4G zMW3W>MJBc%X{~O>-N{mbVjxXJ3wH>`j)Ia7zIm|Bq0Xu7fXdLQmzG1NYAf)(*>`+f zHm{Qe1anaB1#EwJ_kc)Ba;uHVXHER8xYfsswUP1#;k#tc`RbVJQ>vRUri8J~tH_(n~wl9+gI zMC|J*$m;NxYMT|gr)Ou5o?4v!z&k`2)mt|8rRg+P;Zoabk%Kv8Tk|6yb#gbwe36YE zWlYfcw@n1wL>Pr8bL}>D&OtjB8_{pW6A04$_pG-u)Ucop2V4#377Ec6%4RBh(mOVC zH~Wckac&h3o>PVGI9k?Mb}qJ3=i}&6h;gVoq*m#`0=z?TAT9 zUOU%?;3u;)k^}tL5MsXH&b*o%SFMx)3+dDGZ=^UO5OL>B)fU{OU*FC@)08zn)uxUs zVy;Q;Wf8u#5TxvbbeZLRly2w;wXA^JQR8*Q*Tm*2yhVy1gTDj0{K2K!?_L2c$%AxJ zk%z6G&bA*R$J8yBhpC>iE9wY%{h$o7c&CuY&tn#1J8bvfVMZAIf${w;L-kADoz1qe zIA8B+w(OJ=#vxPApu5LS)P-_yAZW~qF?}_}u;zZEZ5_q?%lpn}+b!1*?Zi6aVW%<~ zM%b47Xd>fOAf4TZC{kGVk=Q)PBHk}Z=;un=2fW)R+|z1I+raQOSP+dwEZBlTbGjV5 z>gpEfm_)|;7{TJgP$ew}<#61Gmav_cIm7EE$F5orT_!ST*ewO^`kb$&kw~t#{_{=~ z$NH3`B|OaN)rlgNRI>QvKuav#U$s)d+-eMR<)LBrj2s!U;+c4fhs;ULxxF#1lnoo3 z$b??cWL7=b^MKRpH6@D!x&dcsrEl4+(r?DhBl{NI40IsKg53K9{)}4wX3;0ni{`Tn z&ovO43TrU1n$*i}S(Ecl57Wt^(B~f_%apLv!98m3v&}c3ViiuijaX#PvQn{Om8^~g zt%RO|hT52gxygw^awZ~rqCP?mH-QqBn{c_)N~!Y`uke#nT$mx7WLLC6Xwg&sAt@`* z*L0HBRnC&$q9!MYnrs$HtRDv-BeV{-nc`|G_M*xGbykk!9S6!?`Yq#+v(m$LY8l}& z(4nXcRCoM*4BfKGYAFI_X*{8&T)`VG$ASWdrpuLmC#9!v@cM zeE&|jA;TbN*7zGge7IxTiw@~$bH%q#&u$rr*xJ_JldMUGJ)V4H2osHi73C8pZ+w5W z`w;wQ#*JHQ%Wp>4rfg>1ZyP1lPkiX7Wg=o`T`zH`M>`BwV*=r#am#lIb)4{NB;+X; zegXz}5_>XtVZPfNTH z+bN^ahO|@?tA5ZE&Ke^0hD|A-M(4i!@O{N4>1V?V+OuDj)ik6In%A?#)(+?*3n0}u zY0P9z>TF;F>@jy=@Z^`Kl3r??I4)3H*L+5%<0EIK{lt7t1Ut$MC;m9zLb`sgG}Wb2 zsTfX4@}drT+*`FyIa)T_TCO5JH)gAUS@qGN_8Z2pY;c^@%a0TtghBQGo*^A#^M}JilL;34`pl-_1|{Iy32J+n#Wsyj9+#p8K4(%a4l6=F<%_B%V*w zJdR!3j$HnEr_D?4!v(ZkJ~pQr2?3fW;AWy#7<_p>;0+vE0q5UZ%}1DoYdySMPy#EZ z1l)7eTAs97-2um7Mp-BhMM*_<+Brz&l`nJbPH#6V%?XsYuMc_44%<~tTClth{6>Wn zF80aN2|0am1wc+h5;vipj*n2Q2e3jX_UCY3PmtFO?JX ziq4u>UvQ1&3$Xd$^AwMhVkzj@Y1Fc3bJEWwV)NFnQeK1c{eHsaAyqmbz4k%$%=1F7 z?g2?xid7E8OTH>_8?y1w-OE#Z0!2^ipU#)G*}DFQ=R5b^l;k?Uogb|gM`f15G!&>G zM2e`Qr_AuGW*BkL$%UuOK0O#}FvUf$)1G<1_i4)8#_xNwTian1(I*sSy3$|)bQx+B zYXn{8yZ-JLkCIHmT7B(3sTIT=*(I%ZkA%F#!egXfaPenj8=bmP>J_h!OuspN@b=}C z+?6bCWTVs}&jqVefy9$Zr#XwgL-eAH*7{ouwAM3@=|OZ)`#2{n9VhWX0z%KT!ON;V zqz?D>Z-NdbplODcrLgS1V}75%y~%W~s5~jAt<%+Y%qGf zwTN*)c=y#J-DeDHtg^S!qJER)HCQRTM9xTt`VO_feoEg|V?`x5`(#+0J!OAEzHtWI z%;2Z>#PNyHPhq@h8Hemo zMqjrS=^DuL@ujD$w6P2;ISTroO#XK-NmenNbjVd&wEqCI;ESc`&Wcc^t-(hhDlx5E z4htXmJa$RDyq`4qpt{eN-YFZO+~2Cso|S1Dq2t2Sdz|R$9e;3H_}yntDd}{{!mRJL ztdE0CTDD%tOv8)4ko68Hf)hWbIA#)tJxj-vs;JqMs(M z3uElL>}~_f~y$*)jsn>fQ#ZB$}^U2^lgQ01;tepkevrfR1i!NsRW`=E6Ql z$a-HSMFQio>qVgS+4{MP>T~iny3zTevx=V%cvoTD)M=Teql~XTp(o(Q5|zVoFjlF9 ze*J*ci)~0#U{1j`Xl1@4RMH`CTLo>KyuDvG>9hwfHzAki)hv_E|I90$q zImzXXFL$gcSh{Qay}tgB;qm8KAr0cif#>Mys)cilu1voA(*B>Rfc@J_#T-^S?%YoM z2wNc=OTNH~u{Jwn6NnqnWwCFN8OEXf3cNRc=6Rl#Lnc2l=Hb(x;hv}om$-n^F+%X3 zx%-oPb8g;fSE;S_C@TH zBaMj5(|~|bJ5d3jH{U69=9D60(Yc&=rn=<_E}9rHLxJV*{BbN3wDK_}KmDMQcdjiO zxewi2Ry&Cvm0Bxl9VVOFyc)wu)?`)&&6(nQ!q?sys0@mq`R*ml3ZSBIRa@`e@ak~f zHmU31jy#ojL#kro3V$6wzmeK#cSy%}bVod_ib%@;+WXz#KhA-a0VN`o;fkJ^fs%N$ z3mFQ3U_u2_iC!0FsEKtKdg~M=H^z?C9ZCr;NTsMxYKt@1-1v%48Vc<^QIwVYYI1WN zOz5dHm{YdLl+5cWPwdw?rd+8Wk>0H4zCz7i-zGrROh+d1mOAbgvnIsLRrht?=1`ZB zs{Zf`A9Nr0>f%b)A-Xp}yKJB0d)xJ?rZ{m8?a%LnA4^(;dn(s(^V*+sRu#Ev1${75 zcHsU=^{W`e?jB3j1Gq4i@|deNY?&jS6_I%bN8_tQ*A-Q}q1Z(|mWU%V_{yNz325kv zthUv{(xC0A`huIOT38#Wh(G&OEqJ*ua`{P1#V{j?)6EfIr*teFGGUSFiG>s2dsPmd zyK5YM>Nx#`S(^BMj{{bs(i0K1bX2JohOs9G&-=3gUR59d=WkC-%-HGN90qT>h?=``^rt$m*pKapIA89-FZKqxtlSp6Fvl)YP6ZM5qM=GGlXed= zu~^T4N?RlH;1Y|O!2XmMAMbBW>(qs3dZzaND%v!6ufSp3_2dle(@~s>y1A?zS0f&% z1epx)dDom&R{aI3llAPa3Z?M;6OjZD5EE)|6~nu#vtQH z-F|lksvGJ9yi&H#^13X$|C5%WQLTx|TYgE^WEnMg9gW{l{=zbYJZT!KyjQJ=>KqUe zhLSnMa0jWc$gDIg&!&pY_M-bf;cvY|lU%PE7(Y`k956H((brdpXv-qboYF=U(UCGlUE8#Z8B^+yV-X)bt7gBHR$CHsE05wK^yWz>;%w50LD z@~Dw4nhHmQ5`R=m*J#vOX-imlS>Ky=oIFEiP67YG)2}JNOZAdnW`E7-Ly*3>#3nma zIqfcW`dl|VYgj8&=`=^0MxRHtSo%c++<)$`T6xX)%hg7HJ3{y8Smsv?P;3o;+G ztSfr=s#BVtjXvTZaAD|DKd?Yyl>2CMpK1>GF>%=s3mPj3{bq|o05d-{@m+11v$!Jz?>S!ZO<;{$oS#Q@-A0e!-cK zqr*JeX6=y`P38w3R^*B2v_P>P1LeQa4p)a17$eGJP1jy^i@CGGf92-(s?&Szj?{=_ zLZLO`RT8lPbis~(AC8Byh*|N+=%8!{%EHFZ7}FkzX5S%e?~EGIaDMZ+teM?<-wRgL zYI%6bcyVY$K{dntOXa^Z`@7aO7qyg0g6?68hiBmbc5 zw11@}X6yB+Zgi9l?!jNFMn1osM@^Bqedy_`!2L#Uq8d^!J4c5Z&?%UCPzSKXF5CqGGoJ?(;M5|)54^YPxM$@;xOiY8x`4T4){Kdb;>lgzy^p*yVdB~slKd9C&}BBv*CY`_^yH@xbCD90m-hY*tGMDoV$1)edyKA|vYh}y;&+3(45)BR%#1}(M}$ot<0#K(Zzs6?ism~v!pF?T z!@3uur|oG6qFL9UN?`hEJ~qF-UT>i!CVlCq`9f4k`t|(_Xhw6624w(%o9f`!ybPtdFa6J&-+xKjf}ArE&|(YI<%LgxPoXMu1GF?6 zB@I=7BJ`^wB1I`}N9k`TS=RK&=^H?F5fOO?HC4k(H&sHgx9yLCj8{bDB|{toUPb%$ zD)3KB3+c4z*6$(w>vNmdU|Nhj&EcT#7|32w3#n2MEG4eSq}%_%bx&H-%bn;lTRMgg z5PBgQm(R}hG@)vs+R@67x)zKX`YE@YjkBi}olzRCm1DV7|G`f$`P_3;r*qcT zvMalP9sVUt8o<~EZKDHut)m0S1eslwRLJmSYD^HfSw;Q}#c`QO6 z>SZh4T6cc=BggHV-@7xcKf#Q{d!;p9!&O$~t5X@(t!B8X4K204F(v`sU?+-3(*^#5 zm@=2Z5$jI_Nzd_)LwYT0Bo#CA$3S*b^ex06KoQ{dKzA?a%+yA5jy2c7K6UKCp#3OS z=JmwD*ua2&XUE6PMvN9*i+crK-M6!YM|ZIIU25}bHN}zEWqKREYKmNa?DdWDFekwh#I4}9Pjp#erM=wd=Z8(Ehc%sxceRJu;NiblTpshK&O}1Ia2%x zFi#+MV51^`B16%SIvHlTvD?)>(|e5kOfenfgXbTXeT+rgnLaABHe$yI4SqjY#+u60 zDhi@;*7SwN=b*A4K4mMj;QV}8wT<^CU+*>d<)IjEk(y96yZ^vU&MJP4(%q0Pf$pi@ zJoE5gS@GPm2s}UfZa`EQ+W1O-&`$Q$_*6c-L>h`oRcs;z9|fTjxC#(2L9(_AAs83T zQ8EQz1dE7OIf7KdkfmeO{7BBi(0~$3u_Hj4S~trRG!2<7cnfA2IA(IL1g0e`<~bo~ zEYe1$EvZ>sZ3WtmHD)Zk0)0M=#uK~pAnBaRNI!>dG*CHy`!cBl+m@fw618^KtkE3^%oB59T7rKr+@Ma;~C*Rbt-K@QhnutAz=*V79YMy+Q z7} z6lD|FAVn`aGU!h|d4S#T4QuZ#ED@ZP;fa~zZeJ!-7Yoa*U6DC9T@YLj!@PB(k3EMQ z^TTcOXD;E_et2GM6-^@gdY=~7ini)YXF!EYa2Rpw z9Fc2ATB~lXrSj1xd_A;lU1O9+rZjIKftVCH@8s%NUYHSoLg3ULhg0J1tC)jw`A=n~mN~l8owOVQDU;0dZ!~0+kUjN z{clHZz-?1se#?o(N>3sC>TPHO?TqlMsMyC&JCqBXB$Ic6LOfIMk24{5moQ3ACx1Yct3I^OfH%Nu0KBZsv4+Tfb{_|cKj z=i_Y$qWX1|TZ8k7VfAH!G4vBb5h2>aeP+Dp(3)2$iC`iu`0~er1Q$p8vQXOfb7r}?(7FqGt%cOq zV4RqXoZAp#zklM8uO6t)P~s907p8~6S5kk{Y{^J zYPfyJvm1Zn2F`g$^|}JJ76-!pt5TsK3)u_Jb)K~G(emr0gWH01_Q{YQmyLI% zMPmoHJ{nM42%YL9psgfx-KNKKi7Oj=xV?jVN~d;Mo;30qNGMaNC5up)qOv0SFVR)yI(#PZxwC~Ie7pLaY=F1iB0 zTSWz>G6l`=w-gJhN{z1Lk00NTtlsFIwf9@m>QkCxuQQV_lY7bRfVpyy11E0ofMT8% z2f90>Q%8&%a{`oGSvk5*YXh_@_i^XjLLEZ2iRf1SC`Kg5BckQ z-1(F45N)j*kgy3|?b>E}&?GrbxMsweH?WxQoLYDxcHQraM9$p!?1|kx$bqfCV^H^F z2OSX3j(H`1>~(i2E@n+#{M}vZD-wLiz7ihm4<4@rxkD^KJ zd4m?-;Jjhx`-f-G$F;Xrw5DI$ZYf$%YRE`prqu3u|FVe4^}$z7UZnCKDvcgEaN6hC zP&Laq-V~?bA^rzOMDISZgumKu4E0h;qq?-OQQtqm8loU#(X*^d+8>y}eaOV5g4&*@ zGz&Xcy|ad_?3u_{xB2<9)|{>0)OwE?v*59Kpo5n zTJw$aobU?-FO9kYw~I?fq7iFcK_>g`y;_eB&0sz%Y zX#t4yO@7yEGa6BQDnRK*o*J;9RW7F(MfP{b`>;?O$plufC%x$c>s_8s%NT%M+`X3! zMY^e?5)Itw9HS7gSvNbJ)l?Y-&JeyCIwTn|_-Lo*rAL#?^WD}DnV*h3SeiUP>}HrP zd$fw>qD$C6ZB44C<>T=!%T%`5jcL7kG*?_71^*(^rhS5W|K*;{CdwVzt5niT^`#5^ zp@P7?9TlUz#p(fnB(rX^uVw(Tv!#D<@QY z_ie#zO8(EQ#nAyF#J?!(O8wn-caf_n%`1D(1>%(v#KnAy2le$c`41J$Vbou#AmMg@ z{OeYR@5I83wMa8xm-?()2vTh{ZyeJ$Du#u}TXGbl_2<;Jq9?bi)iqbLvcme`(VuXg z(=H4vv<4XwAPvprsjoVM64^iF;^;+>z? zZrz(-wzKo$NYLyGBy{826CZ9yn8Tx9oWPf*kn<;7`ZYm?K z`d44}9H54fFij0?voh6hNUGF}a>_0#?oF1rKl0?*eu5ljl_wwHag!W!6Ro}{MKx6? zM#X^C=VojY=F5)KKvV4WpUjkuzuJwwVvxDu21=JzwlA%rpoAzhQ+skEzgDF)R=`#k z$A|&^A}MFCxi)ZrmkaTsZw@<(^r{Ck>C<=w7vA~NDXjUycNQ~cP}#WzbAc376Fe5C z1g9g9uv|bT2hdXJeWr}waGN@_IU#BiJC5=@D9qh_zcl9aVg#`Qd@AEn32X~wI-rV6 zvS2|LeP5=(f)hsrl%&${&>m-j*2DQn;xPoYbSY6Th~L}$Y|op=;m-PZ+?5d|*@-=` zN+~~5WALgC&{u#_QQ?Mu`U5vLRqJ4uMz8`TJD6eH&qIetIq~D|CvZ5rn8mW>m8Lq# z``RCUkAdI_HPppeID-D%kte!){cvxX3e65?g@z=i)r5BxabY$#4g^QN10YJq!S=rC zG%gi?s2uYYHK4tD^tY}H~Cn;vH6kP)SF)WpWRb{)<@}U?=DnEIbM0pt*BpQR_h!Q zCLIV@oHAmp&Nx%`@uXhfK--UZ-!-K_?zBsQ1qd2CFTD!Qs0lQpirPMub^$vxr6X@Y zJW8M5ck#W5`tm#CUR(V~*VucUwG}%mH(Y+kCS`e|`;LqowmS$2TtgDg(*(^-anQ)g z&C~8o^ep(|WRQ$dwwxc!%GPr8t{pJ!o-wjG%TYoU_ZM7!wM_Z89r`rBe4}fa*^UG$*drR%DQO?7Lt|1_=toZ?Nbbm0%{HS)GX{B)Hw&j(zs1rSRF{9W{LjAuxzoW-X?ZrU= zVubz%G5ScJHO4odsgGwt+d`tkS{+8dQVL(FvHDP>e_%d;-rOu&GxqDM{KO_MQ6sD< zYC6GlmV$4K4hJW5V!4@)spRvxi-y^$b(qvv{6)c6v<&oBf!zQ2Z8<&3}WE`o{RR^%1(N=D<+kb>oG@i*^$R?;;7OY&Jg9)5zl_?=pv)^ zEtg5?W!2M4t>!Vy06g96nO#ksF*2>a$X9AhtvmBd6Zbx$ z#vRq4+-aIG;iT=951$$el?x5avfcS6S0ZJuyIIO%{ba9fAlemf2rrS2lBqX>X`Ex~$O)ub$K;T{ zhZ5&@6M@-4np=*S2$^*9prOy4Rvv8QdTev(4=SO+1~c({EN!g&vw_DbXm7grZ1Uwd}#*x1qvd0=YL!&k9qsAwlEuOem6th5*7f>`46@~KHS1@P z$W%&qz?Bz@t~wE@S*OZLA7N8stmv25+3^!S45aNtQ`91y1C~%;MZ5p@S5q}1A1Fl_zD?CK{Qj=zs*J0s z{{VSYp8dzJ5ZM>hpA6p-phSWP|I->?uUOjBf4ubn326IY(O=ePA(mDC69ASMCS(5< z0M=9NUkjxkG7$D5BN+DTI)x&ihku2;pAA!|o9hn=;pXGNZ_aw?Wnh2q`&vfNG(^@3 zyhNVe{&hA5Q#IjQ8V&kJpcmv+{YxP6ZL5LsMUp~b>wp)^82@E#Tae4a(l0$8bX;v) zed&o1WL*-mIA)3Kw0UG&n1PS}e{=b}n4FF}G@m<34XW#ZPapwyW)q$?=Zm}-!5(mB z;k)@f_B!soHev;k$;rN7*5XOTuvqo(E;q-ost9Jtj?xDcYGc^GUtOTN`kp4D-?EO)A3&J>Ne#TqUB1U$ z=W3hcdW3u}ns5EiC59sV259(F*QcX&nUT^`3}EuP#7s3q9AigjC#_qKj>N&FqUzbF zCL%~A*KAoblNqiD)u7eXW?%PAM!$`WiNAOOzi(!`4m93HP?UcjUh3wzmF|@Q{*OMs zFJ*fk>uyxhzQ&zeiyp)mA~zFhQxp2K6(RdR1+4xWuld;T`$pNkAJvAH!DxEwvuy;p zrOr@Q_ybi+n%eBO{2AiHM~5PKs~^}A8ve1~vwz2jQH7P#{8WZQa#uvr#Qs*=1&g@S z(eDK7JDG@sNrO!O^3%pD>@%pFA+CRsP0HC1O1D_fmyXd zM33A2it9A>h#*b@VsUa^q_bH)uX)RvxRo2AeQeoKqCC*DhgtkJ39S`8kO0 z#Kx&si8RK}#}ej@%u?;RDj)iZ6{UtGy^QE0g?s%E*-q3?YrnEdFN?F8sjdp&{Kjht zPe=G1Vls;Wmup~`CPzs`Mzi*jjR%dM;&-Q%j;m6VnOSpg_0WK4J<7*Zx(g_ZRYZAF z4huqXtoz_d8>ymFx$ND*|G|D6r=mAqMs_{N1M9Xv8I5|*_6Tew^d{AouFo^-uGLG* zskuMCr4Flye5KDZh0?M}0F@(fzwTMobx06q`o0F3T_p^IpcavBEoOrgie9%<$*qbG zC*Gtm<6$A$In;L-7U#A<*NaVA7+Pdjg&1`^5sbRIN&c+JXk$0az>3NF=$4%i=G=xd z*^{MF60ZAKUX;8wxsbZh05xMagigfNS4Sp0;0xzcwr3VnwpJBONbfK5w5(Lt>HIx53jpQ>EI(;JI zYMVMC3!z&SyXN5sRA@kax0rHu@-uIJT?$yK{;j_Ril(6C|E=eSp+*$n<) zloKpYb9&g+L^Q?|E=%CQV|CeTA&&P4)t1afp!V#K5Tj$jD!t*FH@eE@dW? zq^w+}H*k{k3MhL$$sgUA60Y#Bg}|EOdo@A^2CDy`7l*``9IE`(J5;S*@3!b_DQ4Y& za^Bc$S5n|tYj38@cj`DV{md!Hz;Wupx5{|a$Yq;k-&DD{oEV;Gz%?zXS^G!0eH|co z6j7|egf;Te`T0agdxZGj>H5MdRZRSNEVR5iswF!&yhH(d?ZxoB{K7#)RHJwviLb(O z_5Q|zksQ&vNqM417ff-b6lHvfhK4^5!rl>gI5L&0&TC--u_#9UN^Fuj5rmOzZf@Ho zTxW*NEs1x}Tj~zgTfz8y!kOa(^uQ`k>rZkjF#H8+3DXUP zuXn9Tiwd!OlS)#bV3bSE?x~a41Tv1fU7B+1erQq1GRL}CJ+k&g=3jbb9 zO4c2u74#23VAY43@j*Tn{2S_pbbtD!EUOb@m)Wsx+V$ZuI-ar8+ReXQHZ3xZ60ya= z%b6xvMz`-Km1mS~Df$wVk69`S zS-*?Rp4OnT`fDegUGK4L_wd9`m(Z)VSK3D7Lw%Xzm_XoiEip|;w9;enX0X|njq7JtHca_j%b0M#1e}(c=ZWg?EiGBHxOrFn7(jxW9>(y)j z2~ehGBCE{kq96?YT^f|uWgDZbb&!c(LQE6%M}E{08h^WoSYpgVlpkHD2@qU`GL~4P zaQHo3vJ~z+GIsgmHa-xKviW{PABPYSQM~c8Hg)9{OFaxdy`>838S=Nkegm2& zSJ|-Y!HA!N2EzCkLF-8X$bNqOu|dqLA4?qh&m|TY`2So2nV){&K_qzUw=YT<1S3|C zD}U(fS)90#k@F8he!1?$u_{hj5;Ncr0YwQ5%1WIk%G31wjzDeTvld{d|DAbM=_!tx z7ntTp=Is9U=vt3|uSn^CZu)m7)BoB-UjbjG%sS-lZ?sTYJwva{uEvbVJ{{@L>nQ02 zlLe)Z1P{iG$2fhbf5SyWveeqI&VZU!le(oNYaQn?KXUJs{}gX%xK!uji%27XpI@au z7+~#cKNMYvh2IQre5U>ycYAmijHrG`#=0wbXNB3U$~I7%T#~- z{UJ?V2TCi-q07!iZbt>5PUU4y4m`;4H1-*IQw9T;{F7NCBH}I>{gYJDmM^AW4BhBP zLn5mN%;Bte`7S)SvIUnwM=G;Aby?e|bNzrWI9JVp!g&~`#ldjnV2Q&2P)rBY%hDCq znzvbLy7q)*P)l{|ihM%LeO9IKOj#1kb-HM(fT|2NdQi%~n3^4yvnphK^dCFJ{?D=Zo^^Acb|JI46s-uEO}EtKC3 zG$H*i_v*|^Gu*9?wxJ`~vgSdl=ZEi3=JBHs*v3QlNh0F*tM!vnJG;JnAEP5XSY2(5 z=(2Hh{c-s}yw-=+jc^eD-9!r7I1#XNqqjM{16;P=-hbO)6kX=>(RgFCu=b)0y+!a9 z+0d;!S71(pfo&v8E2`Tlh#=Q;pVBqXw>~AXE@M|)^^f1y`OVQ1at48jIBn{fFq3te zTMtJPW{oUFlas&R7*P($NX?%E+}oC#))j@NWPAh@_h9uLZhB+W*~7XO<$$gTl+&u_w_8}$0MAM`}VdM18x*gG?J;%irz4f#heN<`$l zoYGqW69omC;%e~X>M?Aa#ra7{EI$Gtvj}L_T7o$aZC22Cq@F+h#bmHB2Tqy&(o{!` z7LFW8PSAPymjX2CsWH=F$})mL zY@Mk6k#%|kMW zoD7v)*}E=ofTCqsdc9L%JQ9Qi@X-)9B0Xlg1bpshWy6cXvm6Qn5yNLy7D`|U*N#bD zd9W~vpH2x+Y}xZYW!rx$exCEX)0K&P%;Zk0)vZFGuEyNm)Nl=EG zqmsiFSP<%@b?-BfD*y-JCk^7f6N$+31ASLV1UhWC8A5X*0etH-;4P$AH;ZR6t>Cgu zbMs4S*kkiSi!1eiln<`H;R@$MX*p~dR#(Y2nKxtN9Oi;12E&{unY4VNQO-`DuW@AVz^jmxYkR;wJ% z?kP6kK64yhq?xIjR#HY3hlhTOHhi5f-%y@96smLm{m|AI@9hqU(M)FEH`xpnI%&Sa z>Xk?Yf>}nzumfs+Hv&c$C((&Ha(jpNeIpFgo+&$0q^m3N`!j+Bd)978CUQ5iGHOkdK z=wtbZ7r+eQI)4J9xml)OMl~B7d=4~-6-y6{kemYOUCKd$evFU+6o#+co4+719mrJg zbu2Gq3dgv>+eIQk|BwZ`OAfo(tHRi^^EB?HK;4WdRiK*a>*bzy#^L7u8^O6J9rNBc zu_OXaR-|PGYFSRc<%aI61D;t)y;EnIotP<=+b`zCLg|4KN@mst!Q=45a4@%c1k6#7 z?@uixWuLB!!88OTj2$2KE1DVr-WhoFULlRp-dFYxoZZjAnlnBmfQQD}8H7Gn8cknj z5f71bpI)hBCwG1NnjtzB01^79anv|9Fd#ax3Jl)$64(+iLaP*6T`&y9D~i}d?u^Yc z*@d#ZzT zGktW;-d-?~h717>B4!{yDoOnQq|xSH zgqXh^bZC((<;0qf;zzOb^gEbCMh{A;y4Ltr|DxKZ9yKRSgYC(0Zrd8eUAaLjzWlQJ zfXY+iI$J}P*5rP(eD(woZ7LpyaKwp!IG7(4MUsfa`la#YXX619Y#$6BIdLXtkx%lG)W1Z-)ZxssodCdGW%n6lJMitKRUk{LD!O+pdG>sH6)5om+`sp`x7x z5Psnl_A!w=WU3~@EPqC>sUr8UUJ;GVtVv~x`oh|M$otXe09BkJM8U5h$G#pThe}lS}iz#dG^fmQ^1Jp7KfZG`sf$a!LjhFdp39Cwlg80|Cy!7zTmNj_6Nz4E9(Ekn*D1o7l|AoQ@(%oOR zw)fhSfqe!<#3kMT=za+^Vj&k7==w(w3uy1xG{%ogc1fK-0{YMH*Wc3_KZgxPM4Xg< zn8(k)**_Y8Kc*Fh+2zmB_M;{CkLiv7O&jU%s9GHFuW1UZTj172@wqIw+7w}5DpUBQ zBSWBt<*nl9T2f*{Aq13@%K{Kp(esCY7=yBq3IYUFn%%+?j|jy)6_4V+5;C?NE~Icc zOp0S_m)9c?gNZ)H(&!RlpXw;vwHTlZh?Q38CbG>B2Qs$hr-YcJE~)O@Om9gX=59eI zrX38?K*TO^zIi6wSuFiD2-Ez$%*MKr!3(dm#gnV|9CA@6ci?R53`!KScbLM?)KYN^ zw2~l1OF){{05zc0T)wp3^r1vZull!8->TBl(Y(Oj=C;ygZCz--QMUxL_hCWGX@IyJ%T z8x;{Y_`rn#&B3KwIYkxxs7eBWBTyUT&IYF+I&MhO>3G-GeoU_0>eI=@HZSUd*#39Z zQBsDSWUKqT-aL{ZdeqnfOxUS%p^^@$*VKuaZ#$nwe|QJh0}G3+`I*p#7=j-Qku(V{ zs8+O-S!PeMQkB)VEy#@~1QZ4aQPHW@+4&;-JKraM-}$qL;Pq@%ZgyTAY~ucf@{>yM zyW(N9rw8?z{0+>kB`yWHqyLnIzIN0I4p}LM9G2 z+1a_SF8qPK|6|9cq!v!?DmyWKPWEA)q8oqa`z_B2KMPNZZXEprE=Oh|{G+vgcfi*f zFma@CG`)kK>@bk)OEtpGO<#kdRm-cJ-)VF(e}p2ZyFVb28Ddr3?GS#KN#7Hg|2js|1+$hO59{C^2W2rurx=rG>I#r>2Qp4AcGM4*iI6i zr|2h1{8}Zyyq=)_!k4|zVQ3;X`FSJj8_-qnVl|ec&_}zfA zU$LMoUM1|F#PzQOR&pfd_L= zI~om_eqQtQ9Y=n?quPLSsOE>%6u19$B@tQ{l(*OK5vr|6qG%V!rQ&{7bmG4s$h*nB z&sPj6RPXq3`R8AQ%YO>JkN5)}O$_@1>H#M$L?FS`UGl>BnTf&om*E;~et8?!Uz!?_ zLFILufn5nR3HLQW-^3sMR~Qr+{Iy?eO@PjRF<|{Kc>tkOoPVYtJt}xa-GDsw7k2v3 zFHH_*BG!t*CKQFw3cq9}gf@XDJ?o+uIFze^VzcVk-oV8BQb_C30zV_AB!T&=zXUOY zFWvp6qBB;d-o8t-`5>9U`fF#vo6@2;LF+w*zXJwB;fv~`B>wS2=54RUo4)p&Ufb#!4sPli|NCitx>)4X24)zP(g!yqYZPuFSP)!Zyedki) zgWrwfF)a#f;VZWEird5GL9qEedcV(9#R5XIIW&bM32Y6Bf3!CJK#!WO`*VlG@b4Zk z584v?IjTb;?ul&tVtOjLZ~fEAGfQywRzJ0mhrbDIneV`oLUyPBpE~;N3Uuu})WM4i3G7YzgBM3%=sFg zK}evujcw0}a2Pi0;-$g0_!6J?Y=IU*1b$?F#X|LHAb+xoD{0deqRdw^Vq) z$%Tz?vr4iW19ta@HN8lnirtoc_Tqp-Vb}g`LT!l(&z=diAw1Ga13CV<1sz8nV-hPe zs&H32w%9kLqGutqE?~flqGsJL`jXQzM#>BiTUg-GGQ;P_zG;1q3q(yWngEV$9*X2= zv#=mn%cIfesWe1Y`tneOHUs4D9+;9;k6V0UTM#0^t}`N`J|s14hElcZy4@5q$;k|YlK<%QW63rYg1%O8P` zQ1W-^!Elt;(SmvSvV+7`hnd(`PPBYFea?S$jREcSms2;5y+fpS5}EX=B;&(PP7_LN ztGq|2hvN-k;Q$oFg6?O;D73Zxl0b2|0d3t3FATD3MsAv}BEL|P#0)ZT9CLnmO4T*R zSg-qwIfAR>*BVY@&I#mbkqe6A!pte4nbWC(Kmvj_-)-fnA3pQRrEb3kR0spyy_cW% zEBT%0(Li}r$7PSvHO68|DKSs(RByRcXp~>RWz%hZH2&7}0=x62{?vTXYAF6vE54;Q zlQjJPNkO&c-L+pVlu#u9-Loj4$t4H!?A>1{S-fqmx?B6c4UVFVG@pm<#I6FZ^LBa` zSvrrdJ!dtqODnSd?F93r70ha3m@$N1IK5<8PgOv?yFdWpiR{ikkY1BMH=08yA+jwp zYzy>+Elypx>=!cDNg`c&WKM)_`mNl# z<+*n4C8~a{Iny3IdMOMQpKnL^0I>Gv)9?_uY2K{$^<%3%nurwQwAzj$tQpal=bI%>Hzmi(=fLt$2*DzQ4qQJdq5W_&mLGMGv${WjXzw(mrKB8_kHN zjL6BI<50AT$4c!O+q=ssryk_)?_4l=^;jepaK}j_raKPjnr?Aub>DOCmanq@Sx7$={pwl6CsWkxZf}><|F52hJDM%3=aSh zK`)O3Rp@^{H2Pv!`jQS+{4uAcG;qLwZDl|9d9i{JXj;wYpWeB|`2*5Fh_h5l&&LAQp0ER|(njjr`B{eEe2ivKU)^HDVs zlKl+_Wx>RhI~e=1AY8gy=iKCuZy_lO_^^Z1;SQuBR#;ySGEaWY;o-Z;=-NG7!Nf_C zOO#lz2TJCl;ik{;zGqAjK&;f414BaAU3NlPb|PdlF0J%xhB&lRfYN;@g2aP&8(ABS zuGRk*3>#%bmgDutVgAt3T_91o)K^!Cl0q}=k z9ytoedy-CB3<7VbzrC9Ub`Z<~G6T;|0#Eh2Y49E}gkcT?tv~)XcJuzFJ%Y^lSA+LJ ze`C<8k%yfdN%hPy;LS6{krfzuZ?*T@er5VwZeb?&tl*50Uu;wZq=U(#+ z$AX1G0+vBoHJONMZ#ropHRsp8+7Hg1nuXUi`Rp^Ne2s8C1v*VCF_FFu}_ zU5A%PS}!{T5Rag={wtqeWlzW%VB`zShsxwy*_De&>1P%LU0opFgX#LU?#|OAeM|!- z6bboNVSUXYxW(M8)Ouo9O2)4Ei&t)#O4T3il}Ktlo)J=5%cW0^VCib!Pb~&q5Gn=9 zA~8et>Tg=TTun#UV2f+hduFisILz03peGl@B`$RJ;-UKcQIPfo*Bdr72Bg=OhCF$f#1<$i-^h=p~b2|>?%*|k$S7EcoZjm=#KCBXh`@Nj}Bpx)r zQ?tV~6tC4G-g74Uwl=i-{0D+Yil@)*ymnv55R{{J??1xr1x2uktJVa643U4B?o9Lv zaiaS;Pp;cw0@#I#m{At(U3-iWd*ccMyNCEOpiG~hW==%q43V5~B^tzYu$V(Z zYvScSiaa?f*v$)QvC<)pG?4rV$%Vg5Sf9yk3z@#J_kD^P>s|_E*_BXFfCj#94!L$8 zJ>u;C^vrK13P!b$?RDWqX}wZh5JM?BQapjP4oT3z$?>mQMtN$6idg5aKs>6iFZ+fm zs@7rGb1BGYXaBB^q%&J8_db32$oT9AsASQ8@NJvIBuQ}XUhogIqQqM~+-wei{+Ms}s$*qiPc4L|W?M+zCZY=Iyr?+o*5_A7Z{_!`gRsxj z2lD9oxq9)ZU;}fv)c;+q3s?B+zlvL~e)C$=ECTUxmZ!B-VP|}O3#J=Ksi`xU{$#OG z>u*a$CESz^p_FeH$Xy=wc!*_$)ee(HTF82Lt;W{X+VxR;XQV^Krg+}EW$yBRw|SDwhk;X+5^wi%_R45^>={*umpm!)`Y+}cL`-)DT% zXz}7N)c9uS99MhsCL@OlwCq2}-1=WU)?;%X`!N{6CXh+9gyhw>UHrSMd71cQ8J>Nve^dR>a_oMZ(ccc|1^2RNORM~+ z8r~S~%v34{fYm=GkoZ?4-Wk`aB0_DcQ@AX7_9ze{W}_8fEX^1|a z?fk22-lcn<*5`OamM(=IT>m#CE-qiPS^H}}cLvWo77_+rKpF+3iVii-(@iTRo1acD>f6{weJn9I8#s?ldykV~&Gz?2&-8f~wR7>{aO31M z%;tHnwSPLLj$f&HBbFST`UcUhYY!P>)5?frK+ij3aSY~?IriOb?;KE=+5;~|Uw)V{ z`rtipy3?!zt-Jx5iA(kQlngQvFZK{%9tyIa<9FYYdIIq|1@RR$pZ;WU537?^HSD>M zRG$k&qEhw&1HNnNJqH%w0$#S5T?qNYAcO0vBzkt;`Qt&HHwSg!#d=7laa@;U962P1XQ z=%rS1v0`64$5W6GF}DtOhj;q;$Vq%InbV-8Z8N7oeNViu zq42yoK?+F?Cl8O;^mU+}uBA!PgPv)hYnM?ho1mwrF*QRmNBmt=6S2BTBX~Fwi}4lq zi%mGwTv-@+3X;cwGn0W;T>9+*0FJSks4f!oRVI(w_ft3DvUw(JtSI+-Gis+Sj%|3R z2dVFAg?;&woATY?$}{R6p}66)qeH`N)wd79eTJURpLQ|LXVg>Dm!o{or2~?G#vJiH zexl~>kw=UL%8IZ7$FL{9RH6+&pg-E%PE~l3KDD_(Y0B$$X&7uzBXL ztbN|9xOcSR_Eozz?qNxN)#x6vTRqqNfsY97<+Sp2=#NvjA{|&bi0tMGGRq3U6y?S8 z2y!NlSAWUQ(|XxHA~B`gX=ivK%*)p4OB<0~9rF->+4}ksDOkGbbyLh$uZe(HGuWK@ z_8B%nsGx3r+v(Z`82>TO_IKK2sXF&O5g~hbDRkm9-jOcA^IIAG)BWLfZ(6ETcJa~) zXJzp1#Had5D_E(2z5eG%?~wIPuK$oX9WCvR_MmZaWg^L{kk`**%(EVcpvL=*R?T(E z<+Hl66ntSyX^r)7>YDmUg1=k}Eo2;KPxUCopVuX7)Ijaaz>mt(pBHfb&A@P$t&vgj zg}mbx>BqlXn9kZLsFo-^Ly5dgj1EPG&G(_lswLR;>#vyYk!gpK$>dSn+fN6+>}L8D zlW@pohm~-vC78V@%@>qgJy9bwndg~+*3HrA~cKj=5h1b01_9X4-J1u8bFsle!?=#~~UNB}_qdkwC50gOK8eavv z5vDMaU?aoHb>q5YAM7Cc#t@oJZ_xur97<>eZ=QEL9iAAks6Z!17c;`Z=40YsY#*5F zJ)fGw!p&_j1fJ~@1AkXC2NZOLH9;0ibv&lidAG0aGToScMtO6$vJS}yp=dDuJPQDb z$xb8~%k}T`K!-}3#YT)io6?%I6J2Iak^m;FU5(W8^yFAl;?-_*;F~R`&VG)1Af4=5 zL0a~5p4GMO*nvL}190^$v9hw?(X4s-oVqqu~GJa=@S9E3y@}w!%y?tDUx%fOucowbtI_oPq$RNlBe_Q-1-9C zDylp@Dyj%`Gv`y24Ptmbl*ts9B-(Rg^pd^jC}}%=#O+rhLt#TU+RJOH&L`p5JK5L0 zK-w9(a*a+uOK;}%j+xziPEkVQ6jLfg$gm8HLOo=c#o8_XlB~>>8e9Fin5z?xuqbEw z+G@(869d6MZ}!*bR!)6>eQ-eRFwoNg0|PPyXoK{R+JF%j7G0SN!IkOMB23>iws~#p zA2#+H85p0}6LRZ{(63)N5MB+Q1kfM^3q{xdgQb?Ii|P376ilStGt8&JR5SxGWq0~) z`sT?nyBHkCTgZ>G(GaK;$!HJ!OW16uL;psBd9rArz#wR3T)OYjsGq|(f5vXz=9br> z=g+`Elh}d0$urkoT#88dzjX9pcUSjIJS8LKz5!$lXJ+J)-I&tkoOu!18%t=Q+sS8g zjv03FPRzM2p2Az9Hw44J8(9;;r)hUy^}Bv?p&si)U&rN7b#^5lc*v*Gw~R-OzRMOV zx*2z?)!n-$2lRjpenv#4mxz8J`s@}@XviO^m)Jf(o03;|nhx(acig_fyJ+dsO{~rc z7w66w&cP{_DhjZf9_Jd%2EUp@%so==nf~_fcQd+0DuLSPLgMtJn#chjr?WfT?)-uI zPUK%r>)<2^9|L_?7x5(ssr*;`?uU1?gx)>rxV(}{tLI>`ytywY4NgIL&`&PVH;8W! zsE8h)PY9nXeZ<5ra6L14a~$5>PW?fe1DDIvC5RWOHdW5XpxIRR+z6K7nK{eDeTI?! zjq)J$h+RXg4_O$?1MOP2(*arjW?^$Abqkzan452yuFCitM?KALr!5R{?mFX)_Z@n- zhS!#PXmD-(#ED>Yx5#?;7nBJ`@~(yUDWt*84#mh^P?S!7O;`Z9)gLtw+aG-a2FC zi{4h6+2y@Vbm;r@`pJ`1y{&{pCnWL3v^~VtH@)kEREkM!cySb5{Jzpu>@KPTufLF9 z_97z?9x}zLa_bA^rjhX&cWcj7MWkd(%ZZBGP&Nyj=_!9V?X%?DYumFEqV<-1mK=a+ z|A2;NFO0qbizw|-JaBCmA^jo20Mo1+Ae%cM*cWhJ4Swpxsbz<~A1>cA6bP3?b=e?n z;dRRu)xNfb8}qH^wedZv<%&4d1A$1_8q#?C>Q3$Wi7X3Yb?;BL=()1wt7b4#?QxXM zkaiOqLplY!S!*Y&n3w`YUA6-pko<-0v3dPgJf-kSpN}o6QYn+vhsU732Tsc>C*$=> zBn+_4wPQXpMu>B!pskPEJ>ey=1TuBLgZ0e-G#XiUg7bU2TGtMvG=M|QYl3_oY4RVt zRIP4q17Rk(t@reCAz7&lZ`}R5?^&~@$?})!GdC;E20RI?4E&o`88{za&1--1yqY|3 zX76p9Uu!2-^>yZ5^XF<0J#3I05%JY`r`$0Zi|#|bA3=0#Aw9y#CW92$V<=^Y4+85x zIzt9uYO-PywjqzXCG>o_2ui~#LMDI37LE}P`~}nN6?R-!iufEbnuvLNh-mI9b*AfB zGYD&upIoO0;8vu!V!k@53g-3<$8cP49Fv-yR<20lKP`1Pw!6ch{w^oma96y@PQkS0 zHfpyDOKlBi=0lR=bC`WK8BcH^p7f-T9>(zQ!q+f0LI28Pw53BX%;$=2=B^k=?#1D( z%W@#L_X{8}0a^C@1oC^~^=%+nWkaGs;2Vxs(+3*KtexyKzMO<>lXvkcs4Q38F=l&S zwKR2ed*T)FbrgdVk%wfy-1(5M{r24X<^>@*wWvg=JYTGj?%5fv#Kbaoyv%mjp6;_T z@YIjjQ&SeK&`ZGq9LRu!e-f0r@)v{~^7nHB9H8X5#kg!3iLH`?!{ktGFjPRCTn7(O zBMXv;URVGDoIkd~_>8Ef%4XbW4<=)LgYjk};YmIE^qEebM}@WVCUVEPj8L~?V00&2 zc$Cs;8}^@>@2BtU-Phj9>@l$VJ9>ekoSW3Tl%9@-L>B`T*>UH&ECS6BUZ?Zmmi#gL zXj0E=kK(MX1-6D!o}QWuaFyCu!;2@2{a>6wi8A^Qq4ex_c|||J2s}EaX9WO?D%kfz z+5vvy|CZ_Mxf>Qe<+N;39M#Tu_Q&8`I-IPeA!&)&--0pC6L43{voZu6QN_0di zgAT>#HzJe$-0J?Ul+o!90}uiUN}Xf_L}AT$=?VqF{t_3)qib|uI*|g#zh-c<(Lna~ zeR5oYz0RMtUnc6k=EQX+`1E@a<&`s%-k*^DsuG}n()*{@%Y#(z%y|FSle$Fhn?u1< zv?{C!VaUaqPZIy67G32w;K)7$jL#vBCqp{k2Jo$x@KdL`eI&i)9;`3E(xX%_zPk?} zgO7H9u-U;4Kg;VCBch&GPNB+6mOnUu8FOaHeDuN=@g@gG~4+f@Zi!ByQ8|ia^Z?!>C^TBu4;$@O5 zDIEoCj@iGxpJHSz|2yzU7NZouK+=J^Fx5^C*t901w8@mWT!r2TLo`}Y)TU_k<(aj> zvyTb`pXCrTwD8!aLI}1)uxw!j6QmU)qbS=Qhjh0^CLkT7&M}=SlezxsCUTe#Y;z?e z4ZpFPyS(bALu%<-oe7->>;45cq;icM(OPZf;JB@eoy~qy{ol|}U?>6e{of!*5Jm)+ z-cN$~pV3DsD(5Luuo%-4A6>Lp0m{8-O8*RDLS2e}n2x_%H9ti;e+c~lJKnPxRQ?go z1oH5|kIa(48+}XQ?YHRge?zywzlVDOn2^8V)8C?|-$LXdKu+EF?;-N0*2^)G@gTPQ;|~<{*Q!pR&xtD+ z&hk|JIZUX zRGm+MB_BfWtP|wHoZYlyKr$$uf7F_9l*6|X%B$iNJo3|%y-<4dvh|0rv3_%K;R{~J zHwSBY3#r-$!_~E_lRAPO6?`2mehnzeh+pXbAmS=cDk9^zhG58pqmc5yUb4Ym6HEZ zw(2I;R=rPjPs00salUlz#&2T-sEcB?|$YJady8Xgwdghu+)T{NS90(Ba~3Q&i!~56-O1XSXem z^qwNJ#NKhxDPHz$-`%tgI)}9Um?g3`DHu$DpeojTO?I366ep_N9T!h>^Cy@!O(=nq zc5EM~jZ>{0W-yY=2}(4-X+ z=KFj?B?45-!A~_ZhxC>xdmE!KnUWrY#x^mB^PgZ=V7ZqqU5ak=!rkmVcKF$>Vc8m7 z%uZOb?#J=m1LZ75ycD``0cv(ZFLdpqungl(#QOo*{=CMvL&H-q1Tu==5_9`J*`awt z`tS=DQg+0X=91mcoCA4Pw3@dQ%hQiPpVVRK2rivkr^UnVD!MiAx~WTl^X{?g!sekl zOiA5~{>Q<3F&UV2tCZAWG?8I{ybmU|HHj3~+8mDa{ZwCFO0^oj0QUMJPHO42OD~4Y z&bV&U-sWc$@H+dLj86X@y$n>!#u@@jkfhdEU0S%-A?X;#Kf}dUCZ+x_IBfV{f#0 zH#Rwzf>a5#w)dcNP2u%r7YLo?auwzi!jhA_C-eg*HFSm2@6eLnIT-igXyH*FUj$H`y#A9W zS*$mYcp`IHMVDmo>M!LqcmjIte-*`dzW*PhUcDZ#qh0xwFMYT&4Eg-i?#63%EXO)Y ztvB_~@0Xu_R!9TrEziD?$i5D|F&2Zb4`M^_uMA-1$FPC>!!7* zdHTqQ5rWVrMCfw8=yA{KyF22bj|2n zqr8==(Gm)NL;L1R(~%9?Qh5H$&@jJ4c=0m7ctODy<5XerlA}C-hc$y8c8kx0ncjgG z6G6Rrb`#u*5z!HCHHLQ45cfLUen*P`j%BPR|DTHoYcM)Hef^s2rsHTHtaoq2)!^OG zI$mDp6I#3+Qv7;EIY9vZhfW!7A;i6cPni7q!K#Kc-52@SLv!S(+3yp&Z>6!aR>AK) zfs0!u*pRKGxj2ON_aS258v2~8XaKoqGoQjU-Bu4a=u0gwvSZPxgzdnMBL7qm1r<7( zTvpErpIBe<9{Gr}oqYPxZVg6a&ToQW_H6+99n+4$^fV;kSp07nm7cImlOg^6NQC%x z(@`|AEhFknX@Ykk8#F?adipnLNJlPC&9b2^XmMG;Wi2M(I#i8ItBCIdS=nSXPD9XZ zYe_6b6aGsO$@tD*?}$cN_b!VF`z>NX-0KZAiQYqICy$yG$-`aIK>1Qk3p79F-6>5p z2QiF#^QElWtNi8WLhlYJAdV^`en%Wrgn~LbP#!E8QvXna#jGAYAv*z=Z4UBjlEH(c z?4x7s2yt~$(djigp&202Q!!^+ad=lwA{2iIxzw|}J39=)YeDoMx-zZ&-9QH}!Oh(4 zs~L}ho0@5UH1hz#{3w*@p{Or6c`o1&QTM5mWE$D6IedU)Df5_EIF}}w^02(vCsn1k zh`A<59%X~2N8nV-TJ=c!&5A%O}~#y9h6pgZ{X_qBm! zpku$$oQ3n+C4=D;>$WDOeB*L6Sa}qy-EK$g>fbNEaK-AjuG;zC& zCx6?6&|QHoaLymkG<{XkjWAe?tk@xtfnuey{B7sM z-kY$dcI05Lez&9~bjB2qN^M#R5f~tWf9>bs>*J$)LC5Va%D_r%@8&lFG4kJ&Gd8A# z>`-CZ*#%I!Fi9Mm;vnnXO@eHxV4EAZAfxn&-$9zQe)nlzB=9D+g;U{$WabFU@97{va!)pcANj6J$^RN1WM)tK*HYN zX%FzqrM=$ncSUR0tEZGg*%*py&CJJum@5ij9+P}X-Nf7hPn3kuo+-G?-BTGHMLC{5 z)|o@DuXfB%0DQw=4slNF!GT%8tPn_UbrdTc`d~%+hGh9Ai)wspS_rC)lU^f1ul@Z_ z>y;Z;MDqwZs;0ZLW_>T{r2E$vN7qgz{lw1M7V>`8a;V~3JH*qD#|pVCFLS~$oOaDgC=!^=4jo`a)pKkM37A}pSj2eBw$SaIG_-b$Jl_gj5e0p z-H=CE3M+fR_|UfVE~@a_FLu?$@larxkB6x$+|>JKSox-^)cxn9yZ1$ZH5sPTXmxWR z)^ho8fL~ysEdJ=2#di9ylBU=y!*(p26ZE39v#`B(V~0f|9lixbAs)V?{8irpd%yPu zs?h>ozuj0nJJ0PzIF}oaSip(LV|iZ;xG62TXiR%udx53LliqshJ#&e$9J4Wtw^n)G z$c6qu9-GT?ZTBCd`8TgiI02ofA;gA8 z@Z+4W&9yCUn(gbuQKlB7q_k3PTno0y>7i|0tZ})j8>3=NrI{PvetIwnhSLmR_@Z6+ z=cZDy!63_T!6P^fwlKGk{>ZU@k$u32*=?mK0s@}t=Y+tg2VxdW-{hp-84C*^47enk zYeM5Wv2pP)sn%t_XWcdu#VGl7l&8+gAkg$*sEKVCMhXn4DTijH6%V`y^}B#LGMct)}(kNA}2G zcE|eH?|x3}P@FTL&dbK#2C1_38R7H#26DXm5%pl$>~0C2#wkqWtNvX6E?4UNHsX`= z^Uv1_R?qfp2)B5r*38}G(mrwLV=)#{oa>PUY$ulO~Sp=PA(>l@PSJUoT9-=Z2A@#gv!yhOf!Xog*F5uTdD znChlkFYTCjW+6zyIb2##y3ps^UP+O;Yh)~vLQ9&pi)DFF-^ick&2b+QE?`-Q?NkU> zsEVDm3T82@3SHIjW1X4pSw}L@WzP;R%q0)rA&@v4a#q|~3?AeO4ae?87t5uzl>G^3 zXUhb!33F_biHJM+SkPlRyg!D%XT*1mqV7%b4*BGoCv7d2f-O5m&}hRxK`4KKB+@sA z1tBB6dZdEmUhwI~4I4ymn7aOUBC1kdQ^QJjR|8=CBKM zwJ<_(u#asmev^`pntFhlu=1#(SMS->-Yf~?%1OFvt^3^-Pl27=OD(OiAl;ETUX-&YCft`$~ z19?8C6imo>}in22SGxx09XY5CrLC|KKa%5W`cTeNHA>-_IeOm zyneiiM&@U9wDor$ORa(T<#?m%u6ai5t%|Gg-R1mD+`XnlT&s@a_a}|XDZ7*dvMBumqs4s zjpLld+cT4}>bwA>{egrJ;v*C&E6uZ%WCrRLUY27S+bK&l@>KBKAd=*9e*D6tE# zwpGqKO`U%hINwb;jpcXLKl`X$T~qif@e3Wb*KpyPr;7(yly!Q?$KZMGpl8B3<^=JB zg!TzX7Z(q9RV%(!7>|hj7|iL4uhUa7fpbI0nZBMTUN?mriE;BiScfUbS2t!@@EHbo zho8>1MfS#Kv<9X=;I!*o#N4@!lBFv zx7PMP={usLFXjS9dUUtivaCuB(k;braXd;F*wwne7}7&vyhz;WY1k*+#BO_5kLiy5 z>?0LX?sHc6MPg%zMnQa7@C|GN_(&gV{Q&7L3@Fr>Phgg^V{2HB8LmZ46H5uWZzW

gZAiEt-&Fu+NV?6T0kKhB)j!up8>Qx1Xqc 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 l9|eW$|9}23BY?bxmH9T8{}Wdazr+9l literal 0 HcmV?d00001 diff --git a/docs/source/support/compatibility.rst b/docs/source/support/compatibility.rst new file mode 100644 index 00000000000..57283f3d93f --- /dev/null +++ b/docs/source/support/compatibility.rst @@ -0,0 +1,57 @@ +.. Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +.. SPDX-License-Identifier: Apache-2.0 + +Portability, Compatibility, and Support Durations +================================================= + +The DAML Ecosystem offers a number of forward and backward compatibility guarantees aiming to give the Ecosystem as a whole the following properties. See :ref:`ecosystem-architecture` for the terms used here and how they fit together. + +Application Portability + + A DAML application should not depend on the underlying Database or DLT used by a DAML Network. + +Network Upgradeability + + Ledger Operators should be able to upgrade DAML Network or Participant Nodes seamlessly to stay up to date with the latest features and fixes. A DAML application should be able to operate without significant change across such Network Upgrades. + +SDK Upgradeability + + Application Developers should be able to update their developer tools seamlessly to stay up to date with the latest features and fixes, and stay able to maintain and develop their existing applications. + +Ledger API Compatibility: Application Portability +------------------------------------------------- + +Application Portability and to some extent Network Upgradeability are achieved by intermediating through the Ledger API. As per :ref:`versioning`, and :ref:`ecosystem-architecture`, the Ledger API is independently semantically versioned, and the compatibility guarantees derived from that semantic versioning extend to the entire semantics of the API, including the behavior of DAML Packages on the Ledger. Since all interaction with a DAML Ledger happens through the DAML Ledger API, a DAML Application is guaranteed to work as long as the Participant Node exposes a compatible Ledger API version. + +Specifically, if a DAML Application is built against Ledger API version X.Y.Z and a Participant Node exposes Ledger API version X.Y2.Z2, the application is guaranteed to work as long as Y2.Z2 >= Y.Z. + +Currently, the Ledger API version is the same as the version of the Integration Components used in the Participant Node. This is mostly the case because there has been no need for the versions to diverge yet. This will likely change at the latest when one part of the ecosystem moves to version 2.X. Integration Components, DAML Drivers, and Participant Nodes advertise the Ledger API version they expose. + +As a concrete example, DAML for Postgres 1.4.0 has the Participant Node integrated, and exposes Ledger API version 1.4.0 and the DAML for VMware Blockchain 1.0 Participant Nodes expose Ledger API version 1.6.0. So any application that runs on DAML for Postgres 1.4.0 will also run on DAML for VMware Blockchain 1.0. + +Driver and Participant Compatibility: Network Upgradeability +------------------------------------------------------------ + +Given the Ledger API Compatibility above, network upgrades are seamless if they preserve data, and Participant Nodes keep exposing the same or a newer minor version of the same major Ledger API Version. The semantic versioning of DAML Drivers and Participant Nodes gives this guarantee. Upgrades from one minor version to another are data preserving, and major Ledger API versions may only be removed with a new major version of Integration Components, DAML Drivers and Participant Nodes. + +As an example, from an application standpoint, the only effect of upgrading DAML for Postgres 1.4.0 to DAML for Postgres 1.6.0 is an uptick in the Ledger API version. There may be significant changes to components or database schemas, but these are not public APIs. + +SDK, Runtime Component, and Library Compatibility: SDK Upgradeability +--------------------------------------------------------------------- + +As long as a major Ledger API version is supported (see :ref:`ledger-api-support`), there will be supported versions of SDK, Runtime Components, and Libraries able to target all minor versions of that major version. This has the obvious caveat that new features may not be available with old Ledger API versions. + +For example, an application built and compiled with SDK, Libraries and Runtime Components 1.4.0 against Ledger API 1.4.0, it can still be compiled using SDK 1.6.0 and can be run against Ledger API 1.4.0 using 1.6.0 libraries and runtime components. + +.. _ledger-api-support: + +Ledger API Support Duration +--------------------------- + +Major Ledger API versions behave like stable features in :doc:`status-definitions`. They are supported from the time they are first released as "stable" to the point where they are removed from Integration Components and SDK following a 12 month deprecation cycle. The earliest point a major Ledger API version can be deprecated is with the release of the next major version. The earliest it can be removed is 12 months later with a major version release of the Integration Components. + +Other than for hotfix releases, new releases of the Integration Components will only support the latest minor/patch version of each major Ledger API version. + +As a result we can make this overall statement: + +**An application built using SDK, Libraries and Runtime Components U.V.W against Ledger API X.Y.Z can be maintained using any SDK, Library amd Runtime Components version U2.V2.W2 >= U.V.W as long as Ledger API major version X is still supported at the time of release of U2.V2.W2, and run against any DAML Network with Participant Nodes exposing Ledger API X.Y2.Z2 >= X.Y.Z.** diff --git a/docs/source/support/component-statuses.rst b/docs/source/support/component-statuses.rst new file mode 100644 index 00000000000..bb6be0b6c26 --- /dev/null +++ b/docs/source/support/component-statuses.rst @@ -0,0 +1,349 @@ +.. Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +.. SPDX-License-Identifier: Apache-2.0 + +Feature and Component Statuses +============================== + +This page gives an overview of the statuses of released components and features according to :doc:`status-definitions`. Anything not listed here implicitly has status "Labs", but it's possible that something accidentally slipped the list so if in doubt, please :doc:`contact us `. + +Ledger API +---------- + +.. list-table:: + :widths: 80 10 10 + :header-rows: 1 + + * - Component/Feature + - Status + - Deprecated on + * - :doc:`Ledger API specification ` including all semantics of >= DAML-LF 1.6 + - Stable + - + * - `Numbered (ie non-dev) Versions of Proto definitions distributed via GitHub Releases `_ + - Stable + - + * - `Dev Versions of Proto definitions distributed via GitHub Releases `_ + - Alpha + - + +Integration Components +---------------------- + +.. list-table:: + :widths: 80 10 10 + :header-rows: 1 + + * - Component/Feature + - Status + - Deprecated on + * - :doc:`Integration Kit Components ` + - Labs + - + * - CLI and test names of :doc:`/tools/ledger-api-test-tool/index` + - Beta + - + +.. _runtime-components: + +Runtime components +------------------ + +.. list-table:: + :widths: 80 10 10 + :header-rows: 1 + + * - Component / Feature + - Status + - Deprecated on + * - **JSON API** + - + - + * - HTTP endpoints under ``/v1/`` including status codes, authentication, query language and encoding. + - Stable + - + * - ``daml json-api`` CLI :ref:`for development `. (as specified using ``daml json-api --help``) + - Stable + - + * - Stand-alone distribution for production use, including CLI specified in ``--help``. + - Stable + - + * - **Triggers** + - + - + * - :doc:`DAML API of individual Triggers ` + - Beta + - + * - :doc:`Development CLI to start individual triggers in dev environment ` (``daml trigger``) + - Beta + - + * - :doc:`/tools/trigger-service` (``daml trigger-service``) + - Alpha + - + * - **Extractor** + - + - + * - :doc:`/tools/extractor` (``daml extractor``) + - Labs + - + +.. _libraries: + +Libraries +--------- + +.. list-table:: + :widths: 80 10 10 + :header-rows: 1 + + * - Component / Feature + - Status + - Deprecated on + * - **Scala Ledger API Bindings** + - + - + * - ``daml codegen scala`` :doc:`CLI and generated code ` + - Stable, Deprecated + - 2020-10-14 + * - ``bindings-scala_2.12`` :doc:`library and its public API ` + - Stable, Deprecated + - 2020-10-14 + * - **Java Ledger API Bindings** + - + - + * - ``daml codegen java`` :doc:`CLI and generated code ` + - Stable + - + * - ``bindings-java`` :doc:`library and its public API `. + - Stable + - + * - ``bindings-rxjava`` :doc:`library and its public API ` *excluding* the reactive components in package ``com.daml.ledger.rxjava.components``. + - Stable + - + * - Java Reactive Components in the ``com.daml.ledger.rxjava.components`` package of ``bindings-rxjava``. + - Stable, Deprecated + - 2020-10-14 + * - Maven artifact ``daml-lf-1.6-archive-java-proto`` + - Stable + - + * - Maven artifact ``daml-lf-1.7-archive-java-proto`` + - Stable + - + * - Maven artifact ``daml-lf-1.8-archive-java-proto`` + - Stable + - + * - Maven artifact ``daml-lf-dev-archive-java-proto`` + - Alpha + - + * - **Node.js Ledger API Bindings** + - + - + * - ``@digital-asset/bindings-js`` :doc:`Node.js library ` + - Stable, Deprecated + - 2020-10-14 + * - **JavaScript Client Libraries** + - + - + * - ``daml codegen js`` :doc:`CLI and generated code ` + - Stable + - + * - ``@daml/types`` :doc:`library and its public API ` + - Stable + - + * - ``@daml/ledger`` :doc:`library and its public API ` + - Stable + - + * - ``@daml/react`` :doc:`library and its public API ` + - Stable + - + * - **DAML Libraries** + - + - + * - :doc:`The DAML Standard Library ` + - Stable + - + * - :doc:`The DAML Script Library ` + - Stable + - + * - :doc:`The DAML Trigger Library ` + - Stable + - + +.. _dev-tools: + +Developer Tools +--------------- + +.. list-table:: + :widths: 80 10 10 + :header-rows: 1 + + * - Component / Feature + - Status + - Deprecated on + * - **SDK** + - + - + * - Windows SDK (installer_) + - Stable + - + * - :ref:`Mac SDK ` + - Stable + - + * - :ref:`Linux SDK ` + - Stable + - + * - :doc:`/tools/assistant` with top level commands + + - ``--help`` + - ``version`` + - ``install`` + - ``uninstall`` + - Stable + - + * - ``daml start`` helper command and associated CLI (``daml start --help``) + - Stable + - + * - ``daml deploy`` :doc:`helper command and associated CLI ` (``daml deploy --help``) + - Stable + - + * - Assistant commands to start Runtime Components: ``daml json-api`, ``daml trigger``, ``daml trigger-service``, and ``daml extractor``. + - See :ref:`runtime-components`. + - + * - **DAML Projects** + - + - + * - ``daml.yaml`` project specification + - Stable + - + * - Assistant commands ``new``, ``create-daml-app``, and ``init``. Note that the templates created by ``daml new`` and ``create-daml-app`` are considered example code, and are not covered by :ref:`semantic versioning `. + - Stable + - + * - **DAML Studio** + - + - + * - VSCode Extension + - Stable + - + * - ``daml studio`` assistant command + - Stable + - + * - **Code Generation** + - + - + * - ``daml codegen`` assistant commands + - See :ref:`libraries`. + - + * - **Sandbox Development Ledger** + - + - + * - ``daml sandbox`` assistant command and documented CLI under ``daml sandbox --help``. + - Stable + - + * - DAML Sandbox in Memory (ie without the ``--sql-backend-jdbcurl`` flag) + - Stable + - + * - DAML Sandbox on Postgres (iw with the ``--sql-backend-jdbcurl`` flag) + - Stable + - + * - DAML Sandbox Classic and associated CLIs ``daml sandbox-classic``, ``daml start --sandbox-classic`` + - Stable, Deprecated + - 2020-04-09 + * - **DAML Compiler** + - + - + * - ``daml build`` CLI + - Stable + - + * - ``daml damlc`` CLI + - Stable + - + * - Compilation and packaging (``daml damlc build``) + - Stable + - + * - Legacy packaging command (``daml damlc package``) + - Stable, Deprecated + - 2020-10-14 + * - In-memory Scenario/Script testing (``daml damlc test``) + - Stable + - + * - DAR File inspection (``daml damlc inspect-dar``). The exact output is only covered by :ref:`semantic versioning ` when used with the ``--json`` flag. + - Stable + - + * - DAR File validation (``daml damlc validate-dar``) + - Stable + - + * - DAML Linter (``daml damlc lint``) + - Stable + - + * - DAML REPL (``daml damlc repl``) + - See DAML REPL heading below + - + * - DAML Language Server CLI (``daml damlc ide``) + - Labs + - + * - DAML Documentation Generation (``daml damlc docs``) + - Labs + - + * - :doc:`DAML Model Visualization ` (``daml damlc visual`` and ``daml damlc visual-web``) + - Labs + - + * - ``daml doctest`` + - Labs + - + * - **Scenarios and Script** + - + - + * - Scenario DAML API + - Stable + - + * - :doc:`Script DAML API ` + - Stable + - + * - DAML Scenario IDE integration + - Stable + - + * - DAML Script IDE integration + - Stable + - + * - :doc:`DAML Script Library ` + - See :ref:`libraries` + - + * - ``daml test`` in-memory Script and Scenario test CLI + - Stable + - + * - ``daml test-script`` Sandbox-based Script Testing + - Stable + - + * - ``daml script`` :doc:`CLI to run Scripts against live ledgers. ` + - Stable + - + * - **Navigator** + - + - + * - :doc:`DAML Navigator Development UI ` (``daml navigator server``) + - Stable + - + * - Navigator Config File Creation (``daml navigator create-config``) + - Stable + - + * - :doc:`DAML Navigator Console ` (``daml navigator console``) + - Labs + - + * - Navigator graphQL Schema (``daml navigator dump-graphql-schema``) + - Labs + - + * - **DAML REPL Interactive Shell** + - + - + * - ``daml repl`` :doc:`CLI ` + - Stable + - + * - :doc:`DAML and meta-APIs of the REPL ` + - Stable + - + * - **Ledger Administration CLI** + - + - + * - ``daml ledger`` :doc:`CLI and all subcommands `. + - Stable + - diff --git a/docs/source/support/overview.rst b/docs/source/support/overview.rst new file mode 100644 index 00000000000..3002ed76f96 --- /dev/null +++ b/docs/source/support/overview.rst @@ -0,0 +1,65 @@ +.. Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +.. SPDX-License-Identifier: Apache-2.0 + +DAML Ecosystem Overview +======================= + +.. toctree:: + :hidden: + + status-definitions + component-statuses + +This page is intended to give you an overview of the components that constitute the DAML Ecosystem, what status they are in, and how they fit together. It lays out DAML's "public API" in the sense of :ref:`Semantic Versioning `, and is a prerequisite to understanding DAML's :doc:`compatibility`. + +The pages :doc:`status-definitions` and :doc:`component-statuses` give a fine-grained view of what labels like "Alpha" and "Beta" mean, which components expose public APIs and what status they are in. + +.. _ecosystem-architecture: + +Architecture +------------ + +A high level view of the architecture of a DAML application or solution is helpful to make sense of how individual components, APIs and features fit into the DAML Stack. + +.. figure:: architecture.png + +DAML Networks +............. + +At the bottom of every DAML Application is a DAML Network, a distributed, or possibly centralized persistence infrastructure together with DAML Drivers. DAML Drivers enable the persistence infrastructure to act as a consensus, messaging, and in some cases persistence layer for DAML Applications. Most DAML Drivers will have a public API, but there are no _uniform_ public APIs on DAML Drivers. This does not harm application portability since applications only interact with DAML Networks through the Participant Node. A good example of a public API of a DAML Driver is the command line interface of `DAML for Postgres `_. It's a public interface, but specific to the Postgres driver. + +Participant Nodes +................. + +On top of, or integrated into the DAML Drivers sits a Participant Node, that has the primary purpose of exposing the DAML Ledger API. In the case of _integrated_ DAML Drivers, the Participant Node usually interacts with the DAML Drivers through solution-specific APIs. In this case, Participant Nodes can only communicate with DAML Drivers of one DAML Network. In the case of _interoperable_ DAML Drivers, the Participant Node communicates with the DAML Drivers through the uniform `Canton Protocol `_. The Canton Protocol is versioned and has some cross-version compatibility guarantees, but is not a public API. So Participant nodes may have public APIs like monitoring and logging, command line interfaces or similar, but the only _uniform_ public API exposed by all Participant Nodes is the Ledger API. + +Integration Components +...................... + +DAML Drivers and Participant Nodes share a lot of components between underlying DLTs or Databases. These shared components are called the Integration Components, or sometimes the :doc:`/daml-integration-kit/index`. + +Ledger API +.......... + +The Ledger API is the primary interface that offers forward and backward compatibility between DAML Networks and Applications. As you can see in the diagram above, all interaction between components above the Participant Node and the Participant Node or DAML Network happen through the Ledger API. The Ledger API is a public API and offers the lowest level of access to DAML Ledgers supported for application use. + +Runtime Components +.................. + +Runtime components are standalone components that run alongside Participant Nodes or Applications and expose additional services like query endpoints, automations, or integrations. Each Runtime Component has public APIs, which are covered in :doc:`component-statuses`. Typically there is a command line interface, and one or more "Runtime APIs" as indicated in the above diagram. + + +Libraries +......... + +Libraries naturally provide public APIs in their target language, be it DAML, or secondary languages like JavaScript or Java. For details on available libraries and their interfaces, see :doc:`component-statuses`. + +Generated Code +.............. + +The developer tools in the SDK allow the generation of code for some languages from a DAML Model. This generated code has public APIs, but is not independently versioned, but depends on the SDK version and source of the generated code, like a DAML package. In this case, the version of the SDK used covers changes to the public API of the generated code. + +SDK +... + +The SDK consists of the developer tools used to develop user code, both DAML and in secondary languages, to generate code, and to interact with running applications via Runtime, and Ledger API. The SDK has a broad public API covering the DAML Language, CLIs, IDE, and Developer tools, but few of those APIs are intended for runtime use in a production environment. Exceptions to that are called out on :doc:`component-statuses`. diff --git a/docs/source/support/release-notes.rst b/docs/source/support/release-notes.rst deleted file mode 100644 index edcbda0aad6..00000000000 --- a/docs/source/support/release-notes.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -.. SPDX-License-Identifier: Apache-2.0 - -Release notes -############# - -Release notes are now hosted on `the DAML blog `_. diff --git a/docs/source/support/release-timeline.png b/docs/source/support/release-timeline.png new file mode 100644 index 0000000000000000000000000000000000000000..33b55e1366ea5dae7316dabf85fe7d9148bf208f GIT binary patch literal 26723 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. In short, this means that there is a well defined "public API", changes or breakages to which are indicated by the version number. + +Stable releases have versions MAJOR.MINOR.PATCH. Segments of the version are incremented according to the following rules: + +#. MAJOR version when there are incompatible API changes, +#. MINOR version when functionality is added in a backwards compatible manner, and +#. PATCH version when there are only backwards compatible bug fixes. + +DAML's "public API" is laid out in the :doc:`overview`. + +Cadence +------- + +Regular snapshot releases are made every Wednesday, with additional snapshots released as needed. These releases contain SDK, Libraries, Runtime Components, and Integration Components, both from the `daml repository `_ as well as some others. + +Stable versions are released once a month. See :ref:`release_process` below for the usual schedule. This schedule is a guide, not a guarantee, and additional releases may be made, or releases may be delayed for skipped entirely. + +No more than one major version is released every six months, barring exceptional circumstances. + +Individual DAML Drivers follow their own release cadence, using already released Integration Components as a dependency. + +.. _release-notes: + +Release Notes +------------- + +Release notes for each release are published on the `Release Notes section of the DAML Driven blog `_. + +.. _roadmap: + +Roadmap +------- + +Once a month Digital Asset publishes a community update to accompany the announcement of the release candidate for the next release. The community update contains a section outlining the next priorities for development. You can find community updates on the `DAML Driven Blog `_, or subscribe to the mailing list or social media profiles on `https://daml.com/ `_ to stay up to date. + +.. _release_process: + +Process +------- + +Weekly snapshot and monthly stable releases follow a regular process and schedule. The process is documented `in the DAML repository `_ so only the schedule for monthly releases is covered here. + +Selecting a Release Candidate + + This is done by the DAML core engineering teams on the **first Monday of every month**. + + The monthly releases are time-based, not scope-based. Furthermore, DAML development is fully HEAD-based so both the repository and every snapshot are intended to be in a fully releasable state at every point. The release process therefore starts with "selecting a release candidate". Typically the Snapshot from the preceding Wednesday is selected as the release candidate. + +Release Notes and Candidate Review + + After selecting the release candidate, Release Notes are written and reviewed with a particular view towards unintended changes and violations of :ref:`Semantic Versioning `. + +Release Candidate Refinement + + If issues surface in the initial review, the issues are resolved and different Snapshot is selected as the release candidate. + +Release Candidate Announcement + + Barring delays due to issues during initial review, the release candidate is announced publicly with accompanying Release Notes on **the Thursday following the first Monday of every Month**. + +Communications, Testing and Feedback + + In the days following the announcement, the release is presented and discussed with both commercial and community users. It is also put through its paces by integrating it in `project:DABL `_ and several ledger integrations. + +Release Candidate Refinement II + + Depending on feedback and test results, new release candidates may be issued iteratively. Depending on the severity of changes from release candidate to release candidate, the testing period is extended more or less. + +Release + + Assuming the release is not postponed due to extended test periods or newly discovered issues in the release candidate, the release is declared stable and given a regular version number on **the second Wednesday after the first Monday of the Month**. + +.. figure:: release-timeline.png + + The release process timeline illustrated by example of September 2020. diff --git a/docs/source/support/roadmap.rst b/docs/source/support/roadmap.rst deleted file mode 100644 index c655b72dde2..00000000000 --- a/docs/source/support/roadmap.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -.. SPDX-License-Identifier: Apache-2.0 - -DAML roadmap (as of July 2020) -=================================== - -A new roadmap is currently being worked on and will be published soon. -If you have requests for features, see the :doc:`/support/support` page for how to get in touch. diff --git a/docs/source/support/status-definitions.rst b/docs/source/support/status-definitions.rst new file mode 100644 index 00000000000..05648ad8b36 --- /dev/null +++ b/docs/source/support/status-definitions.rst @@ -0,0 +1,127 @@ +.. Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +.. SPDX-License-Identifier: Apache-2.0 + +Status Definitions +================== + +Throughout the documentation, we use labels to mark features of APIs not yet deemed stable. This page gives meaning to those labels. + +Early Access Features +--------------------- + +Features or components covered by these docs are :ref:`Stable ` by default. :ref:`Stable ` features and components constitute DAML's "public API" in the sense of :ref:`Semantic Versioning `. Feature and components that are not :ref:`Stable ` are called "Early Access" and called out explicitly. + +Early Access features are opt-in whenever possible, needing to be activated with special commands or flags needing to be started up separately, or requiring the use of additional endpoints, for example. + +Within the Early Access category, we distinguish three labels: + +Labs + + Labs components and features are experiments, introduced for evaluation, testing, or project-internal use. There is no intent to develop them into a stable feature other than to see whether they add value and find uptake. They can be changed or discontinued without advance notice. They may be poorly documented and it is not recommended to start relying on them. + +Alpha + + Alpha components and features are early preview versions of features being actively developed to become a stable part of the ecosystem. At the Alpha stage, they are not yet feature complete, may have poor runtime characteristics, are still subject to frequent change, and may not be fully documented. Alpha features can be evaluated, and used in PoCs, but should not yet be relied upon for large projects or production use where breakages or changes to APIs would be costly. + +Beta + + Beta components and features are preview versions of features that are close to maturity. They are characterized by being considered feature complete, and the APIs close to the final public APIs. It is relatively safe to build on Beta features as long as the documented caveats to runtime characteristics are understood and bugs and minor API adjustments are not too costly. + +Deprecation +----------- + +In addition to being labelled Early Access, features and components can also be labelled "Deprecated". Deprecation follows a deprecation cycle laid out in the table below. The date of deprecation is documented in :doc:`overview`. + +Deprecated features can be relied upon during the deprecation cycle to the same degree as their non-deprecated counterparts, but building on deprecated features may hinder an upgrade to new DAML versions following the deprecation cycle. + +.. _status_definitions: + +Comparison of Statuses +---------------------- + +The table below gives a concise overview of the labels used for DAML features and components. + +.. list-table:: Feature Maturities + :widths: 10 20 20 20 20 + :header-rows: 1 + + * - + - Stable + - Beta + - Alpha + - Labs + * - **Functionality** + - + - + - + - + * - Functional Completeness + - Functionally complete + - Considered functionally complete, but subject to change according to usability testing + - MVP-level functionality covering at least a few core use-cases + - Functionality covering one specific use-case it was made for + * - **Non-functional Requirements** + - + - + - + - + * - Performance + - Unless stated otherwise, the feature can be used without concern about system performance. + - Current performance impacts and expected performance for the stable release are documented. + - Using the feature may have significant undocumented impact on overall system performance. + - Using the feature may have significant undocumented impact on overall system performance. + * - Compatibility + - Compatibility is covered by :doc:`compatibility`. + - Compatibility is covered by :doc:`compatibility`. + - The feature may only work against specific DAML integrations, or specific API versions, including Early Access ones. + - The feature may only work against specific DAML integrations, or specific API versions, including Early Access ones. + * - Stability & Error Recovery + - The feature is long-term stable and supports recovery fit for a production system. + - No known reproducible crashes which can't be recovered from. There is still an expectation that new issues may be discovered. + - The feature may not be stable and lack error recovery. + - The feature may not be stable and lack error recovery. + * - **Releases and Support** + - + - + - + - + * - Distribution and Releases + - Distributed as part of regular :doc:`releases `. + - Distributed as part of regular :doc:`releases `. + - Distributed as part of regular :doc:`releases `. + - Releases and distribution may be separate. + * - Support + - Covered by standard commercial support terms. Hotfixes for critical bugs and security issues are available. + - Not covered by standard commercial support terms. Receives bug- and security fixes with regular releases. + - Not covered by standard commercial support terms. Receives bug- and security fixes with regular releases. + - Not covered by standard commercial support terms. Only receives fixes with low priority. + * - Deprecation + - May be removed with any new major version 12 months after the date of deprecation. + - May be removed with any new minor version 1 month after the date of deprecation. + - May be removed without warning. + - May be removed without warning. + * - Covered by :ref:`Semantic Versioning ` + - Yes, part of the "public API". + - No, but breaking changes will be documented. + - No, and changes may be poorly documented. + - No, and changes may be poorly documented. + * - **Documentation** + - + - + - + - + * - Basic Use + - Fully documented as part of main docs. + - Fully documented as part of main docs. + - Basic documentation as part of main docs. + - Documentation may be sparse and separate from the main docs. + * - API, Functionality, and Gaps + - Fully documented as part of main docs. + - Fully documented as part of main docs. + - Rough indication of targeted functionality and current limitations. + - May be undocumented. + * - Compatibility + - Covered by :doc:`compatibility`. + - Covered by :doc:`compatibility`. + - Current compatibility documented as part of main docs. + - May be undocumented. diff --git a/docs/source/support/support.rst b/docs/source/support/support.rst index ed33354487a..98d69a70d2f 100644 --- a/docs/source/support/support.rst +++ b/docs/source/support/support.rst @@ -1,8 +1,8 @@ .. Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. .. SPDX-License-Identifier: Apache-2.0 -Support -======= +Getting Help +============ Have questions or feedback? You're in the right place. diff --git a/docs/source/tools/extractor.rst b/docs/source/tools/extractor.rst index 458fe719541..930f084c20c 100644 --- a/docs/source/tools/extractor.rst +++ b/docs/source/tools/extractor.rst @@ -4,6 +4,8 @@ Extractor ######### +The Extractor is currently an :doc:`Early Access Feature in Labs status `. + Introduction ************ diff --git a/docs/source/tools/navigator/console.rst b/docs/source/tools/navigator/console.rst index adc087cb79c..10f340660c5 100644 --- a/docs/source/tools/navigator/console.rst +++ b/docs/source/tools/navigator/console.rst @@ -4,6 +4,8 @@ Navigator Console ################# +The Navigator Console is currently an :doc:`Early Access Feature in Labs status `. + .. toctree:: :hidden: diff --git a/docs/source/tools/navigator/database.rst b/docs/source/tools/navigator/database.rst index a08e3aa8c82..3b766e6c834 100644 --- a/docs/source/tools/navigator/database.rst +++ b/docs/source/tools/navigator/database.rst @@ -59,3 +59,4 @@ Filter on the content of an array if the index is specified:: Filter on the content of an array if the index is not specified:: sql select contract.id from contract, json_tree(contract.value) where atom is not null and json_tree.path like '$.template.choices[%]' and json_tree.value ='Accept' + diff --git a/docs/source/tools/trigger-service.rst b/docs/source/tools/trigger-service.rst index 7cbb692c05f..08109b987bd 100644 --- a/docs/source/tools/trigger-service.rst +++ b/docs/source/tools/trigger-service.rst @@ -4,7 +4,7 @@ Trigger Service ############### -**WARNING:** The Trigger Service is an early access feature that is actively being designed and is *subject to breaking changes*. The documentation here at this time is limited to basic usage. As more features become available the documentation will be updated to include them. We welcome feedback about the Trigger Service on our `our issue tracker `_ or `on our forum `_, or on `on Slack `_. +The Trigger Service is currently an :doc:`Early Access Feature in Alpha status `. At this time, the documentation is limited to basic usage. As more features become available the documentation will be updated to include them. We welcome feedback about the Trigger Service on our `our issue tracker `_ or `on our forum `_, or on `on Slack `_. The `DAML triggers <../triggers/index.html#running-a-daml-trigger>`_ documentation shows a simple method using the ``daml trigger`` command to arrange for the execution of a single trigger. Using this method, a dedicated process is launched to host the trigger. diff --git a/docs/source/tools/visual.rst b/docs/source/tools/visual.rst index 9cc7bfbb688..ddb066c11c8 100644 --- a/docs/source/tools/visual.rst +++ b/docs/source/tools/visual.rst @@ -4,6 +4,8 @@ Visualizing DAML Contracts ########################## +Visualizing DAML Contracts is currently an :doc:`Early Access Feature in Labs status `. + You can generate visual graphs for the contracts in your DAML project. To do this: 1. Install `Graphviz `_. diff --git a/docs/source/triggers/index.rst b/docs/source/triggers/index.rst index 630570c093e..2b718ce90c4 100644 --- a/docs/source/triggers/index.rst +++ b/docs/source/triggers/index.rst @@ -9,8 +9,7 @@ DAML Triggers - Off-Ledger Automation in DAML api/index -**WARNING:** DAML Triggers are an early access feature that is actively -being designed and is *subject to breaking changes*. +DAML Triggers are currently an :doc:`Early Access Feature in Alpha status `. We welcome feedback about DAML triggers on `our issue tracker `_, `our forum `_, or `on Slack `_. diff --git a/navigator/backend/src/main/scala/com/digitalasset/navigator/config/Arguments.scala b/navigator/backend/src/main/scala/com/digitalasset/navigator/config/Arguments.scala index ce70de85143..2023d0aabeb 100644 --- a/navigator/backend/src/main/scala/com/digitalasset/navigator/config/Arguments.scala +++ b/navigator/backend/src/main/scala/com/digitalasset/navigator/config/Arguments.scala @@ -165,7 +165,7 @@ object Arguments { .children(hostname, port) cmd("console") - .text("start the console (early access)") + .text("Early Access (Labs). Start the console") .action( (_, arguments) => arguments.copy( @@ -176,7 +176,7 @@ object Arguments { .children(hostname, port) cmd("dump-graphql-schema") - .text("Dumps the full GraphQL schema to stdout") + .text("Early Access (Labs). Dumps the full GraphQL schema to stdout") .action((_, arguments) => arguments.copy(command = DumpGraphQLSchema)) cmd("create-config") diff --git a/release/sdk-config.yaml.tmpl b/release/sdk-config.yaml.tmpl index 20effc65833..a1c3e55663a 100644 --- a/release/sdk-config.yaml.tmpl +++ b/release/sdk-config.yaml.tmpl @@ -50,7 +50,7 @@ commands: args: ["run-platform-jar", "--logback-config=sandbox-logback.xml", "sandbox"] - name: sandbox-classic path: daml-helper/daml-helper - desc: "Launch Sandbox Classic (the default Sandbox implementation for SDK <= 0.13.55)" + desc: "Deprecated. Launch Sandbox Classic (the default Sandbox implementation for SDK <= 0.13.55)" args: ["run-platform-jar", "--logback-config=sandbox-logback.xml", "sandbox-classic"] - name: navigator path: daml-helper/daml-helper