From 826dbeebf707ee3bbb71a67c17e38d3fb01fe47d Mon Sep 17 00:00:00 2001 From: matthewpavia99 <117348330+matthewpavia99@users.noreply.github.com> Date: Mon, 14 Oct 2024 08:49:07 +0200 Subject: [PATCH] v5.6 - Exception Handler Docs (#221) * Create exceptionHandler.md * Update exceptionHandler.md * update docs * fix link * add image * add image * Fixed table formatting * Delete framework/components/Workflows directory * Delete framework/components/.vscode directory * Update _sidebar.md * Update _sidebar.md --------- Co-authored-by: Pim Simons --- _sidebar.md | 1 + framework/components/exceptionHandler.md | 232 ++++++++++++++++++ .../components/exceptionhandler.drawio.svg | 74 ++++++ .../exceptionhandler-logic-app-dashboard.png | Bin 0 -> 7595 bytes images/exceptionhandler-logic-app.png | Bin 0 -> 18556 bytes 5 files changed, 307 insertions(+) create mode 100644 framework/components/exceptionHandler.md create mode 100644 framework/components/exceptionhandler.drawio.svg create mode 100644 images/exceptionhandler-logic-app-dashboard.png create mode 100644 images/exceptionhandler-logic-app.png diff --git a/_sidebar.md b/_sidebar.md index 0dcff90..e0c95d3 100644 --- a/_sidebar.md +++ b/_sidebar.md @@ -56,6 +56,7 @@ * [Regex translator](/framework/components/regextranslation.md) * [XML/Json convertor](/framework/components/xmljsonconverter.md) * [Sequence controller](/framework/components/sequencecontroller.md) + * [Exception Handler](/framework/components/exceptionHandler.md) * Related Documentation * [LogicApps diagnostics](/framework/logicappsdiagnostics.md) * [DataFactory diagnostics](/framework/datafactorydiagnostics.md) diff --git a/framework/components/exceptionHandler.md b/framework/components/exceptionHandler.md new file mode 100644 index 0000000..6d8951c --- /dev/null +++ b/framework/components/exceptionHandler.md @@ -0,0 +1,232 @@ +# Exception Handler + +Everyone who has worked with Logic Apps is familiar with the error `An action failed. No dependent actions succeeded`. This is a very generic error that offers no clear information on what went wrong. + +The Exception Handler function can be used to retrieve the actual error message from a Logic App and optionally translate this to a human readable text. +For more information on the translations and how to set this up see [here](#Translations). + +:thumbsup: The Exception Handler function supports both Logic App Consumption and Logic App Standard. + +## ResolveException Endpoint + +The function contains a single `ResolveException` endpoint. + +### Logic App Consumption + +If you want to resolve the exception of a Logic App Consumption use the following body: + +``` json +{ + "WorkflowRunId": "", + "WorkflowName": "", + "SubscriptionId": "", + "ResourceGroupName": "", + "Type": "Consumption" +} +``` + +An example: +``` json +{ + "WorkflowRunId": "08584773878007282344320782622CU00", + "WorkflowName": "cdt-dev-we-somelogicapp", + "SubscriptionId": "fb0519a2-b69f-4cdf-97ff-19735685b5b9", + "ResourceGroupName": "some-resource-group", + "Type": "Consumption" +} +``` + +### Logic App Standard + +If you want to resolve the exception of a Logic App Standard workflow use the following body: + +``` json +{ + "WorkflowRunId": "", + "WorkflowName": "", + "SubscriptionId": "", + "ResourceGroupName": "", + "Type": "Standard", + "SiteName": "" +} +``` + +An example: +``` json +{ + "WorkflowRunId": "08584773878007282344320782622CU00", + "WorkflowName": "ProcessMessage", + "SubscriptionId": "fb0519a2-b69f-4cdf-97ff-19735685b5b9", + "ResourceGroupName": "some-resource-group", + "Type": "Standard", + "SiteName": "cdt-dev-we-somelogicapp" +} +``` + +### Response +The function will respond with a list of errors for the failed actions, for example: +``` json +{ + "status": "Failed", + "code": "InvalidURL", + "description": "Http request failed with status code 'HostNotFound' and status message: 'No such host is known.'.", + "errors": [ + { + "code": "InvalidURL", + "description": "Http request failed with status code 'HostNotFound' and status message: 'No such host is known.'." + } + ] +} +``` + +## Access Rights + +The ExceptionHandler function requires the role `Logic App Contributor` and additionally `Website Contributor` (for Logic App Standard) to operate correctly. These must be assigned on the ExceptionHandler function to the resource group where the Logic Apps are located. + +## Translations + +:bulb: The ExceptionHandler function makes use of the [RegexTranslator](https://github.com/invictus-integration/docs-ifa/blob/master/framework/components/regextranslation.md) component to translate the original error from the Logic App. + +:flashlight: To show what we mean by translating the error to a human readable text let's take the following example. + +We have a Logic App that used to return the generic `An action failed. No dependent actions succeeded` error, by using the Exception Handler we have now improved this to the actual error which is `Http request failed with status code 'HostNotFound' and status message: 'No such host is known.'.`. + +However, we have a business user that does not really understand what this means. By using the translation functionality of the Exception Handler function we can translate this error to something like `Application is not reachable` which the business user can clearly understand. + +These translations must be set up in the `RegexTranslator` table in your Invictus storage account. Translations need to be added in the table as follows: + +### Logic App Consumption + +| PartitionKey | RowKey | MatchPattern | OutputPattern | +|-------------------------|------------|----------------------------------------|---------------------------------------------------------| +| logicappname.actionname | Any RowKey | The pattern to be matched in the error | code(YourTranslationCode)The output translation pattern | + +Some examples: + +| PartitionKey | RowKey | MatchPattern | OutputPattern | +|------------------------------------------------|--------|---------------------------------------------------------------------------------|--------------------------------------------------------------| +| cdt-dev-we-somelogicapp.CallHTTP | 1 | No such host is known | code(Availability)Application is not reachable | +| cdt-dev-we-somelogicapp.Create | 1 | cannot be evaluated because array index '0' cannot be selected from empty array | code(Account)The accountid for the debtor could not be found | +| cdt-dev-we-somelogicapp.ParseJSON | 1 | Invalid JSON schema type: int | code(Data)The field is not an integer | +| cdt-dev-we-somelogicapp.ExecuteStoredProcedure | 1 | Procedure or function 'upsertData' expects parameter '@Ordernumber' | code(Data)Ordernumber is not supplied but is required | + +### Logic App Standard + +| PartitionKey | RowKey | MatchPattern | OutputPattern | +|----------------------------------|------------|----------------------------------------|---------------------------------------------------------| +| sitename.workflowname.actionname | Any RowKey | The pattern to be matched in the error | code(YourTranslationCode)The output translation pattern | + +Some examples: + +| PartitionKey | RowKey | MatchPattern | OutputPattern | +|---------------------------------------------------------------|--------|---------------------------------------------------------------------------------|--------------------------------------------------------------| +| cdt-dev-we-somelogicapp.ProcessMessage.CallHTTP | 1 | No such host is known | code(Availability)Application is not reachable | +| cdt-dev-we-somelogicapp.ProcessMessage.Create | 1 | cannot be evaluated because array index '0' cannot be selected from empty array | code(Account)The accountid for the debtor could not be found | +| cdt-dev-we-somelogicapp.ProcessMessage.ParseJSON | 1 | Invalid JSON schema type: int | code(Data)The field is not an integer | +| cdt-dev-we-somelogicapp.ProcessMessage.ExecuteStoredProcedure | 1 | Procedure or function 'upsertData' expects parameter '@Ordernumber' | code(Data)Ordernumber is not supplied but is required | + +### Response With Translation + +By using the translation functionality we will get back the following response: + +``` json +{ + "status": "Failed", + "code": "Availability", + "description": "Application is not reachable", + "errors": [ + { + "code": "Availability", + "description": "Application is not reachable" + } + ] +} +``` + +### Ignoring Errors + +By using the translation functionality we can also ignore errors. This can be very usefull for scenario's where Logic Apps can generate an error that is not relevant to the business and the flow can be seen as successfull. + +Let's take an example where we have a Logic App that picks up a file from a network location and after it has been published will delete the file. We have seen situations at customers where this delete action will fail because the file has already been removed by another instance of the Logic App, this error can be safely ignored since the message is processed anyway. + +To achieve this we can configure the translation as follows: + +| PartitionKey | RowKey | MatchPattern | OutputPattern | +|------------------------------------|--------|----------------------------|---------------| +| cdt-dev-we-somelogicapp.DeleteFile | 1 | There is no file with name | ignore | + +This will result in the following response: + +``` json +{ + "status": "Succeeded", + "code": "NoCodeSpecified", + "description": "", + "errors": [] +} +``` + +## Guideline On How To Implement The Exception Handler + +A good way to implement the Exception Handler is to create a common exception handler Logic App that will call the Exception Handler function and return the response. This common Logic App can then be called by all other Logic Apps, this is a nice way to centralize your exception handling functionality. + +:bulb: use a webhook to call the common exception handler Logic App so that if anything fails in the common Logic App you can resubmit this and return the response asynchronously. + +![diagram](exceptionhandler.drawio.svg) + +See an example of how to call the common exception handler Logic App and process the response: + +![logic-app](../../images/exceptionhandler-logic-app.png) + +The code for the `Scope Exception Handling` is shown below, pay attention to the `Terminate` action as this uses the information from the Exception Handler function and is nicely shown in the Invictus for Azure dashboard. + +![dashboard](../../images/exceptionhandler-logic-app-dashboard.png) + +``` json +"Scope_ExceptionHandling": { + "actions": { + "ResolveException": { + "inputs": { + "subscribe": { + "body": { + "callbackurl": "@{listCallbackUrl()}", + "logicApp": "@{workflow().name}", + "resourceGroup": "@{parameters('resourceGroupName')}", + "run": "@{workflow()['run']['name']}", + "subscription": "@{parameters('subscriptionId')}", + "correlationId": "@trigger().clientTrackingId" + }, + "method": "POST", + "uri": "[listCallbackUrl(resourceId(variables('exceptionHandlerResourceGroupName'), 'Microsoft.Logic/workflows/triggers', variables('exceptionHandlerLogicAppName'), 'manual'), providers('Microsoft.Logic', 'workflows').apiVersions[0]).value]" + }, + "unsubscribe": {} + }, + "runAfter": {}, + "type": "HttpWebhook" + }, + "Terminate": { + "inputs": { + "runError": { + "code": "@{if(equals(body('ResolveException').Status, 'Failed'), body('ResolveException').code, null)}", + "message": "@{if(equals(body('ResolveException').Status, 'Failed'), body('ResolveException').description, null)}" + }, + "runStatus": "@{body('ResolveException').Status}" + }, + "runAfter": { + "ResolveException": [ + "Succeeded" + ] + }, + "type": "Terminate" + } + }, + "runAfter": { + "Scope": [ + "Failed", + "Skipped", + "TimedOut" + ] + }, + "type": "Scope" +} +``` diff --git a/framework/components/exceptionhandler.drawio.svg b/framework/components/exceptionhandler.drawio.svg new file mode 100644 index 0000000..e8aab72 --- /dev/null +++ b/framework/components/exceptionhandler.drawio.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + +
+
+
+ Generic Exception Handler +
+
+
+
+ + Generic Exc... + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Invictus for Azure Exeption Handler +
+
+
+
+ + Invictus fo... + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/images/exceptionhandler-logic-app-dashboard.png b/images/exceptionhandler-logic-app-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..9faa5b4beb429e8590f58eee7690c4b3979e9b26 GIT binary patch literal 7595 zcmd6MWl&r}vo<6^a3?qfcMDD+1c%_d$O3^4gaqB-x_Gdl!7UKn3A(rw+Ab~KFQ|&ljHJ(RCFqs{#zm)Vks#CSb4Hl8T73o_hv$#MV?Mdu5kI{`2PCx zAQ%5t|DeDG%r0-OtRy?+E6Q32b4Wp(-@{;nICSywB89H ze8KPR^++a6O7^dKfSx@hhWwTDz&=reKN6F{C(1(qN5=V?xBsKtvyt{!Q*k6Ijp(oH zE_s~eUrl-m&_}husyXjehC}}uEs0crqgdHgR`p{pZc{K`s<^h_`k%p^grp3na^1*x z|4%vMe`5syD@Ol+(;A7&h?5>`mU}##)JH;r3AdozJ?GKC^^O3_{GG9mcj&Icso~~_ z!(_*xsuyX*dKKRVR?m_DL0xRbW)Pqx}#`c^hQ zw5P^X+Wh4j!=M)fS%wQUt72;~Vjs#{Tdgoa+Dq@`!NQtjOW6qO+VI`6%!`xl8K32aI+!8;w3nK>il`95oQ$u!SuL(A~BAF?oC{zs;#0db+DM|J|!-shq%ix8SsQf;KnVX_SihNiEw{r9;^l~$x` z>7V7K%_LPa#%Wv%0&e&gc(>O-&$=EXt#RJrAH2uqS0J5br0$s0v3H_9Kz@(a_vxg& zaiH=}7A3nJ_VmL)NZ`*n;C@Yd(0T7In1+6Y?dmj)Xh=Ch&uXSn5T?V$h==8u7RY*= zOb7Vl#>y!S2CFv}v3`K#vaEZVEr`}T-QrK$hc39$grYKQu#;FVos30Mu06HuqLEE2 zQvAz!jmDwca8M5A906jhMv2V$yGlFaB)rmiN;+2`0g2J#wj$)2;qlkve_vM<2(2(< zc)NN@09A_(YP4-zQs#J~ z9#G-sW;(bxhar&y?VQ}v)VdkedWx~z;1}(b+6I#;izAcXq1RCOM-IJ~Cv)ssttwT8 z*Q|2Vi8Sv$9ph>lrjdRUnKDMBOmhSJN7tSO>G77^_(c3?)!upOsy#SK^t3pub91_7 z#3%v*RW*dXTx~5g;fu%qJ>$*aXbqurh4VUq4wJN|FL>H?c&>XwxZ2XdmAz%sEc@yJ?<{1M=ieMQ zNTFQ++}W%0zMsX?=J#O`4roqeSw@*#xdQ&)q6+Tl+l)}NM#Y?VRgSt*BzXPVW&#~Hwga%F?OcJ)8}rqT?DT;VdT+$ zzrDv;{`U)kMCN&HnsBM-h&XG>ObMx@$^@yx!g8F&EH|@KYqhr<)P}pb(U20Knh|;cQ+d0j8NV;+BBfmyT#(PcC%bx3*6H~@CK-%3 zN1ps6zTd^+(&aYZITSfjdZt-6rsE!^Fj0lkE* z?{+ub>Qfs_;MuDihoxiufs;}}?D_Mcpj=TEYZnCmZ*r$z|IUPphQpLY(ljx2)&-gMrtRF zU)r5_%bwt++m-C#B0aI-m5lhl=rrD?bO}y8-tn_mbfueo&}yGl5`R8cL`TBf1kOxO zX%ULqX{?!5#x-T0w>y4V8~(Y=j}C~d_`E`BHtoxMbyIyRgOIpLIH-c2N_p8J-0^fE z`)l16sJd6zX32rb)?^>q-bf~EWH$tM#h`Z(nP^mabIKr;du=WYw~S6%jBNM&Y<;r8 z1U0bm))B;aTcahq&Qdper?0dS(phONxt6aTMbin`!DDGmV`98QDZrBX1^ zpZ9Q|5B1OTuY2%@r{SADaVXA{L&RU$0^kMX9R?81I5Hm~aPR7U9b8NLhy_Z~| zz@V-1W|`3M@g`;{hslS1-0+fO5q8F{u%kHqYdu#1er1`B$~X}hF%mQrW4_hJ7%S%1 z$31K0^4eqra<(ozV%}oR=cj>lrDRk@wP0o_uDEAp`=qeMrqFXD;U@7iY6m4m8fY7= zyX#M5ui9IEw8vJfn}#t1i!w?CZ|MtY(IVlMD=24Df^`ej?}-58Ln}+Qsh1Z}9<;Bz zonnfS1du$dPXJTeK+;dR?a^8@yBr=r+d7ZMxM^B~)8DOuTYVgzIH!7k3{pK6;@;t> zLy6pt(K0o6v>Em3(ix=9I;tw-5wdIMErWn^GKoNxpQv6ynh386f`t=P2g~h5GeT7eIG;zTJ@x2w<`WQJa`bn6c#q@U8N0a!~0;(iS3^p8MPjCW} z1rD3rb9-bMoRVQgYP*%=FS|(vWJfvHdF6j>v+ESu7u_8_>OBY_e@Pua9OPIIc56Ma zXQS(_-h3577_8ZWu_{5ZTVb_CO|;~$yMB+f*){mJa9Y37`6TUlDbMX8Dz5I6m0;TqVWPsHo|j_Fs(&z?U>RvNyLRuoBHfXPUA znPoZPKzdA`01eleE@;mc)aZqV$c{>HevmwhdM4nCqGjHhQ@Eb@vo6NLM^aDi22Zc# z0XcP=vy;@bOnP@C^i6tMosd-fP%--Q9akQt_GxOMZONTEn@?+YAgJncURbA!SH6D) ziw^=l7Tp&%Ke;ho9nrC_#@W@qqbz3%T+P2AjZVPZ$TyCD=?XVE2~wdFfsml$h>uCF zGr!|OK-<}ckykyt$H}P>437ZxBP$!IyB5hDCa2D5WxeZ3B14|`jNIFX-`w42PK^Xm zI$EW7NGWq$ZkG>&5HE}H%NC`N{b90ikC0@&equZ=Cjd1PI&Rx2IQd~UoX;HIBZc`r z9_=i}A2SkMuf^@vQe7b_xXxjZG7G9?AHwTItCeb=1R+Ll1}gMm)2BSgeGQ7@4*QX2 z0fKS7jxdQTimJqd>sGgRJK&G1K)?dc>AvpS<(aRo8nF*TN6=1)>w(JJHSLv6EbQx} zEi|QBA@!r;yRB4iMgPgFArxd?uXtF)|{9yvF!3&h9K@`o`%a754S1&+17wy>e`k!>3x!jC?&Y;K6%CH$ z`B%mLp$h9UVLet$bGo{I=z+#6pDGnNuw&Kp8(l90AIB106o2S<{V+R%Xnn9r%(oTx z2T;-?rt9#hxikTaYsD@^y>(?><6Hzq*)rOQn)j%lU?M%|teVg?4v}VnBc_eGi<~Jb zA%}2vqV)&qo=Y;ur?cPOStOx(lwPTZ^fzmBvAcKR1;Cs8R!GQJR$-Y}^yv@`>-iF}tUwKKM^2C{(x(~Jm4cAzX55axdY_TBMi}fgmkQQ5PJkz1b zT!z(p`3L?>hTVi{k(rtpj-mu_IC5Bt#7Wec@yh1cq8D}EkA-L^BdiUs9>O{^DSEk% zwAjB3UQ?{>B7s&t!QUtK7rgc;F!wy^cEEN>iH;=O52Ldg_#Aa;c;KJ2E{FPupWCOz zl||}{k90LID#3EruAZzsnLT2q;O|dNRZ=3OX5QOK@Ss+v+(gH4cWEFLMqg!IMH7TS zE>1LyhuH_E3g3!}wa?e5t!oW|**NO3z%jf- zqoi;6IAh)>tXp9NtbnAKyuNYE-`Ey4pO{CR&!Utzguat79-CSq=;s&{`Ko3|d`~92 z&F@unWNkD19M93RB?z!E+t0HnPauL#%WV)SNU3MmnVsxre~n+w2In3z*bRvROg-0n z9`o2pfK|}>w(p>QF8s<2zR8o$Bxi5xW?=E`vf#RC@AT)V>OcmXj_=)Wy5d1hvnHX^ z#g@6;IQTH7UejEjh{)Hy)cT!EO59lA?O76`K4M#!)NMU#H=n{WXQu_994*Ry0dfOy zsANJx#`<)myB&OEPXnm`HT!Aq9gpn#KP44FD6P+fuG|wC>Gk(jA@r=cI^}R35!#lrI|R zof~};D<)}y0sD#ON0Xssf*&Yqdtix_Rt4{#*t^%rf+*?Ihvb8&&rezE;9ieD?t6Z1 z#{Xo}V#nL+O>VZSwyAd}^>hPl`FJw_~}!`vFhB8v}pcO4HL;Hj)8%m%zxelgi; z{B|*V;8A#kMciBa8xLt0rzaFc?2L=~ZL=k@?>hw@u%|G)Q6|aq56 zyu|8GE%){xNwDu-O%k7dg40#a=3NakRwe0C*^#AozX(;TYzRLV>~N#ibV+WIy`@u3 z1ZlHw-SP5~jO0mX`3m!aWswf5hRqhjcuxE(XhHHLZJCC`{o0ka)~w|cT66VZ%u}4u zCzLO=Yi_ZY2M&M#UKU&y<@Q0TJ!+i;!1JOdRFc$j0*MAU(HdWUUALb>4+U>suGvQ? zpWJ!6b?^z}=KI8$O7n{d^UAwS(r_+$pzr}UcPrFfqDO9YOLG}0$hMzdCt4s@H8{(Z z3|gtF4oh^WFwJs=`od`y{R;#`IUU`=cRW9JY5 zD!$zXUBk`TF=V%+vkx*q$~o%r__g3`)-e?O_&=qp7w$)rP_J@RsqE^6jFjT;5zkK(O9_ZBU-r8mkI?2pmh8HPjNU}0#_XeNzy z8eDwmE_=6b7egZMzq$JZlhi5WSg4_~z-0P#6zy=?N8!TYW8+Jc;Ci1UjXAa-V$kp> zKk+YHaXjiy*r0X>n7?3J>BdJ!;&d*2BdFL zGKss|`fkE(tbx`t>NuWICCG?(DQ$`~`iM{nZ3P)3h}m^vL7 zgl9L-)pJjY)94OTjk))yx@o?qn(FO+YOvi|p*@BD!^hVP9aLwmj;PUOnQWL3SXR&J z1rMwQjR8`i*$b6(uDp-lKON#*NnhRJJSs}1^EPVM|kgCp+DQo^vUZw1YqT`?g?!PfxV4!G0jU^4@Bv^{&0s21kx0%#1z*}r@? zTtOb}Q-M!e%h{E0FCeqGYDE`6q1mBVvP^&{1NTdU+K>ow-XMVtm%3t(fl$BTNzg3e zGCEIqX3YUZ1U&oIRx&lh&URB6saPMo7B22*wDr=>d24}e!HB{AX+i9V$E@Xn>%yh` z-%2%S`pJUxoHf^<`1kzZhX>AbrbHw*AfT+b;#9vd-3W?JslJh|l-Y;y3U^yPwQ~Bd*4`3dTzQC5&Nq_~ zO1%v4n2QMBp}Vjqd6{`a2s`Vjv|ZHu8SE8R$Y^=*X6r{rw2Ejthh z3o=%)>ns_#Yi2Lf-~6f>HI~E^>Ai};J@@iGTZVj^8fPLFqe-n=Hal^B z2cD_q=n21RJfOyo@97h>DH}Gpze_#ojNxQ$XriNT#0h84PMkBK;@CdAa@TA;>6L+~ zjFKgWdI|%?xu^I9ZG-&APYgqT61`{>+r^*eT>dtJ_ouRPex=vT!keRSGGnlD(07^= zhEO@3S4}fNK&Sk6Q%_x%for6SNm~8E9Oqk;fNa;|7mfjzCAs-IwED9|4~pA3M+e9D z&SIr`CI4PU&f9nRr?n&9k^`a)_w{1x4}|LyL=~2&uc=7jYRjWk?seH<0}cnNq{|C3 zw;l+KG2~!$@CgoQ#T<~`gSF+i+fJIw2DsNgmk=^QO@(3`O*){n?^6Q z`&oZEo5{5l)cleY(=nRL*aYY-AtZP#LEHz@N_2ZUT(3i0{vGt^X!JgkaKgFXz0$W& zRQD@^$6$)znCe4EFvfsD-l?Q$=?1WjL;1zO8k+~rZc5tBd}EDvH*EPBVcrL+ T?S)?jRwN}kHQ6%hH~#+x38;}3 literal 0 HcmV?d00001 diff --git a/images/exceptionhandler-logic-app.png b/images/exceptionhandler-logic-app.png new file mode 100644 index 0000000000000000000000000000000000000000..a123972fd223bbbcf6c7f0b43727a1dad7981ff8 GIT binary patch literal 18556 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 WnKhvI0sqCISJLA0Vr3!*{{Ij6F2~UT literal 0 HcmV?d00001