Harbs, Alex, I just pushed implementation of computeFinalClassNames to branch feature/type_names_class_name_issue124. You can review implementation in this commit [1] and example of usage in Card and Button.
I have tested with Harbs example [3] and with Card by changing orders. It's working. [1] http://bit.ly/2HTHaFQ [2] http://bit.ly/2oJgKOf [3] http://bit.ly/2F734nx Waiting for your review. Thanks, Piotr 2018-02-28 23:31 GMT+01:00 Piotr Zarzycki <[email protected]>: > Let me play with implementation of that function. It seems to me that will > be much cleaner than current solution. > > If user actually wanted to do anythin with className - let the overriding > speaks. > > > > On Wed, Feb 28, 2018, 21:51 Alex Harui <[email protected]> wrote: > >> On 2/28/18, 12:27 PM, "Harbs" <[email protected]> wrote: >> >> >OK. I think that will work for DML components, but what if there’s a bead >> >which needs to add class names? What would be the “right” way to do that? >> >A bead cannot override the function on the strand. >> >> Do we have beads that manipulate className? >> >> IMO, the principle behind how to handle that is knowing whether you are >> sharing something or not. There may not be one right way to handle it, >> but if I had to handle it, I would have the bead set something in the >> model or presentation model of the component. And the component would >> override computeFinalClassNames to take that into account. >> >> >> Although having just written that, maybe this computeFinalClassNames >> should be in the view instead of on the base class so it is replaceable >> instead of overridable. >> >> Thoughts? >> -Alex >> > >> >> On Feb 28, 2018, at 10:17 PM, Alex Harui <[email protected]> >> >>wrote: >> >> >> >> I think you are missing that the element.className is set to >> >> computeFinalClassNames. So the user is welcome to manipulate the >> >> UIBase.className however they see fit. They can assign it a whole new >> >> space-delimited list if they want. But what gets set on >> >>element.className >> >> is computed from typeNames and className by default, and MDL would >> >> override it to factor in fab, raised, colored into the computing of the >> >> final classnames. >> >> >> >> I would prefer that we don't make requirements on users as to what they >> >> can or can't do with the className property, like requiring them to use >> >> addClassName/removeClassNames. MXML and States might set className, >> as >> >> could any other AS logic. I think folks may even be used to setting >> >> className in JavaScript. So letting UIBase.className be the "variable" >> >> part and having computeFinalClassNames be the way the "fixed" part is >> >> handled makes sense to me. >> >> >> >> Of course, I could be wrong... >> >> -Alex >> >> >> >> On 2/28/18, 12:03 PM, "Harbs" <[email protected]> wrote: >> >> >> >>> The problem which sparked this whole issue is like this: >> >>> >> >>> 1. We have some components (i.e. in MDL) which add “pieces” to the >> >>>class >> >>> names (such as “fab”, “raised”, “colored”, etc. >> >>> 2. The client might subsequently set the className to something else. >> >>> 3. When the component sets the “pieces” first and the client sets the >> >>> className later, the client will overwrite these “pieces” which were >> >>> added by the component. >> >>> >> >>> My suggestion to have addClassName() and removeClassName() was to have >> >>>a >> >>> “safe” way to add class names which would get computed together with >> >>>the >> >>> className when the className is replaced. >> >>> >> >>> The way you have it seems to just be modifying the existing className >> >>> property. If that’s overwritten by a client, the logic falls apart. >> >>> >> >>> It feels like only having typeNames which are set inside the component >> >>> and className which is set outside the component is not really enough. >> >>> (Unless I’m missing something.) >> >>> >> >>> Harbs >> >>> >> >>>> On Feb 28, 2018, at 9:31 PM, Alex Harui <[email protected]> >> >>>> wrote: >> >>>> >> >>>> On 2/28/18, 10:44 AM, "Harbs" <[email protected]> wrote: >> >>>> >> >>>>> If it’s not public, I don’t see how a utility method could call it >> >>>>> though. >> >>>> >> >>>> I didn't think the utility methods like addClassName/removeClassName >> >>>> would >> >>>> need to alter computeFinalClassNames(). >> >>>> >> >>>> AIUI, for most UIBase subclasses, the final element.className is a >> mix >> >>>> of >> >>>> the className property and the typeNames. The typenames are thought >> >>>>to >> >>>> be >> >>>> "fixed" and the space-delimited list of names in className are the >> >>>>ones >> >>>> the user wants to manipulate in their code. So, I would expect them >> >>>>to >> >>>> write: >> >>>> >> >>>> org.apache.royale.utils.addClassName(myComponent, "pinkStyles"); >> >>>> >> >>>> >> >>>> addClassName should just do something like: >> >>>> >> >>>> myComponent.className += value; >> >>>> >> >>>> That will call the className setter that will run: >> >>>> >> >>>> element.className = computeFinalClassNames(); >> >>>> >> >>>> If you call >> >>>> >> >>>> org.apache.royale.utils.removeClassName(myComponent, "pinkStyles"); >> >>>> >> >>>> removeClassName should just do something like: >> >>>> >> >>>> Var s:String = myComponent.className; >> >>>> Var c:int = s.indexOf(nameToRemove + " "); >> >>>> If (c != -1) >> >>>> s = s.substr(0, c) + s.substr(c + nameToRemove.length + 1); >> >>>> Else >> >>>> { >> >>>> c= s.indexOf(" " + nameToRemove); >> >>>> if (c != -1) >> >>>> s = s.substr(0, c); // remove last item >> >>>> } >> >>>> myComponent.className = s; >> >>>> >> >>>> >> >>>> >> >>>> It seems like it should be that simple. What am I missing? >> >>>> >> >>>> -Alex >> >>>> >> >>>> >> >>>>> >> >>>>>> On Feb 28, 2018, at 8:21 PM, Alex Harui <[email protected]> >> >>>>>> wrote: >> >>>>>> >> >>>>>> >> >>>>>> >> >>>>>> On 2/28/18, 9:50 AM, "Piotr Zarzycki" <[email protected] >> >>>>>> <mailto:[email protected]>> wrote: >> >>>>>> >> >>>>>>> Ok Understand, but do you agree that computeFinalClassNames - is >> >>>>>>> something >> >>>>>>> which is in the UIBase ? >> >>>>>> >> >>>>>> Yes, and probably protected instead of public. The one in UIBase >> >>>>>>just >> >>>>>> appends typenames to className. It gets overridden in MDL where >> >>>>>> needed >> >>>>>> for shadow and other attributes. >> >>>>>> >> >>>>>> My 2 cents, >> >>>>>> -Alex >> >>>>>>> >> >>>>>>> 2018-02-28 18:47 GMT+01:00 Alex Harui <[email protected]>: >> >>>>>>> >> >>>>>>>> I think that in the shadow setter, it would change _shadow and >> >>>>>>>>call >> >>>>>>>> setClassName(computeFinalClassNames()); >> >>>>>>>> >> >>>>>>>> On 2/28/18, 9:33 AM, "Piotr Zarzycki" <[email protected] >> > >> >>>>>>>> wrote: >> >>>>>>>> >> >>>>>>>>> Alex, >> >>>>>>>>> >> >>>>>>>>> So we are getting back to the idea where you proposed to have >> >>>>>>>>> function >> >>>>>>>>> which computes everything. >> >>>>>>>>> >> >>>>>>>>> override public function computeFinalClassNames():String >> >>>>>>>>> { >> >>>>>>>>> return super.computeFinalClassNames() + " " + _shadow; >> >>>>>>>>> } >> >>>>>>>>> >> >>>>>>>>> Where does that function should be placed ? Does that function >> >>>>>>>>> should >> >>>>>>>> be >> >>>>>>>>> called in addedToParent plus whenever someone change _shadow ? - >> >>>>>>>>> >> >>>>>>>>> Because I really don't know how to handle scenario where you >> have >> >>>>>>>>> some >> >>>>>>>>> property isActive = true/false and I need to add/remove class. - >> >>>>>>>>>In >> >>>>>>>>> the >> >>>>>>>>> first launch I use computeFinalClassNames, but how to handle >> >>>>>>>>> changing >> >>>>>>>> ? >> >>>>>>>>> >> >>>>>>>>> Thanks, Piotr >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> 2018-02-28 18:26 GMT+01:00 Alex Harui <[email protected] >> >: >> >>>>>>>>> >> >>>>>>>>>> Hi Piotr, >> >>>>>>>>>> >> >>>>>>>>>> I think am I not communicating the principles effectively. >> >>>>>>>>>> >> >>>>>>>>>> First, IMO, addClassName and removeClassName should not be in >> >>>>>>>>>> UIBase. >> >>>>>>>>>> Lots of apps can be written without needing these methods. I >> >>>>>>>>>> think >> >>>>>>>> they >> >>>>>>>>>> can be written as utility functions. >> >>>>>>>>>> >> >>>>>>>>>> Second, the computation of the final element.className should >> >>>>>>>> represent >> >>>>>>>>>> the state of the component, so I don't get why you need an >> >>>>>>>>>> _internalClassName or should ever set it to "". The >> computation >> >>>>>>>>>> for >> >>>>>>>> a >> >>>>>>>>>> component with a shadow would be to check the shadow property >> >>>>>>>>>>and >> >>>>>>>>>> if >> >>>>>>>> it >> >>>>>>>>>> is >> >>>>>>>>>> true, add a className for the shadow to the list. Then I think >> >>>>>>>>>> you >> >>>>>>>>>> wouldn't have the problem you showed in the animated GIF. When >> >>>>>>>>>> the >> >>>>>>>>>> classname property is set from the outside by >> >>>>>>>>>>MXMLDataInterpreter >> >>>>>>>>>> or >> >>>>>>>>>> even >> >>>>>>>>>> user-written code, those classNames are added to the list with >> >>>>>>>>>>the >> >>>>>>>>>> typeNames and the shadow className if shadow is true and then >> >>>>>>>>>>set >> >>>>>>>>>> on >> >>>>>>>> the >> >>>>>>>>>> element. >> >>>>>>>>>> >> >>>>>>>>>> Finally, for addClassName and removeClassName, and all other >> >>>>>>>>>> Royale >> >>>>>>>>>> code, >> >>>>>>>>>> we don't want to do much if any parameter checking. That is >> >>>>>>>>>>also >> >>>>>>>>>> just-in-case code. The production code should not be passing >> in >> >>>>>>>> null or >> >>>>>>>>>> other bad values. And once you fix that, then the checks that >> >>>>>>>>>>you >> >>>>>>>> have >> >>>>>>>>>> written do not add value. I have proposed that there are >> >>>>>>>>>> debug-only >> >>>>>>>>>> code >> >>>>>>>>>> that does parameter checking. There is a goog.DEBUG flag you >> >>>>>>>>>>can >> >>>>>>>>>> use >> >>>>>>>>>> for >> >>>>>>>>>> that. >> >>>>>>>>>> >> >>>>>>>>>> HTH, >> >>>>>>>>>> -Alex >> >>>>>>>>>> >> >>>>>>>>>> On 2/28/18, 12:40 AM, "Piotr Zarzycki" >> >>>>>>>>>><[email protected]> >> >>>>>>>>>> wrote: >> >>>>>>>>>> >> >>>>>>>>>>> Hi Alex, >> >>>>>>>>>>> >> >>>>>>>>>>> Sorry about that. Let me show you code and I recorded GIF with >> >>>>>>>> problem >> >>>>>>>>>>> debugging. >> >>>>>>>>>>> >> >>>>>>>>>>> *Code in UIBase which I have implemented:* >> >>>>>>>>>>> addClassName and removeClassName [1]. >> >>>>>>>>>>> addedToParent what is happen with internal field which I have >> >>>>>>>>>>> added >> >>>>>>>> [2] >> >>>>>>>>>>> >> >>>>>>>>>>> *Code for Testing* [3] - I'm adding first className, than >> >>>>>>>>>>>shadow. >> >>>>>>>>>>> >> >>>>>>>>>>> *GIF* [4] We are starting from the constructor. Pay attention >> >>>>>>>>>>>to >> >>>>>>>>>>> the >> >>>>>>>>>>> moment >> >>>>>>>>>>> where className is being wiped out, later I have to use my >> >>>>>>>>>>> internal >> >>>>>>>>>>> variable to get it back. >> >>>>>>>>>>> >> >>>>>>>>>>> Does that more clean now ? >> >>>>>>>>>>> >> >>>>>>>>>>> [1] >> >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>> https%3A%2F%2Fpaste.apa >> >>>>>>>>>>> che.org%2FEumG&data=02%7C01%7Caharui%40adobe.com% >> >>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d >> >>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >> >>>>>>>>>> 7C636554040718214998& >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>>sdata=cDT88OF63TdBMPxYY2vwMSIRxD%2FP3DvwHupj%2BQHsofw%3D& >> reserve >> >>>>>>>>>>>d= >> >>>>>>>>>>> 0 >> >>>>>>>>>>> [2] >> >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>> https%3A%2F%2Fpaste.apa >> >>>>>>>>>>> che.org%2FArmU&data=02%7C01%7Caharui%40adobe.com% >> >>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d >> >>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >> >>>>>>>>>> 7C636554040718214998& >> >>>>>>>>>>> sdata=m6whImrP70u7kzRxCbErlxCHWef8TK >> Nejwm4Sr7bw7g%3D&reserved=0 >> >>>>>>>>>>> [3] >> >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>> https%3A%2F%2Fpaste.apa >> >>>>>>>>>>> che.org%2FKrxq&data=02%7C01%7Caharui%40adobe.com% >> >>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d >> >>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >> >>>>>>>>>> 7C636554040718214998& >> >>>>>>>>>>> sdata=tpeUYSQIXGXtES8hyr7zSeet528ZTc >> zSltcNccqRGDo%3D&reserved=0 >> >>>>>>>>>>> [4] >> >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>> https%3A%2F%2F1drv.ms%2 >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>>Fu%2Fs!ApVpLyjpHDC2hPtoCi65kIZZPwjSpQ >> &data=02%7C01%7Caharui%40ad >> >>>>>>>>>>>ob >> >>>>>>>>>>> e >> >>>>>>>> .com >> >>>>>>>>>> %7C >> >>>>>>>>>>> ee5c84b4e3ff4ddb578008d57e87046f% >> 7Cfa7b1b5a7b34438794aed2c178de >> >>>>>>>>>> cee1%7C0%7C >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>>0%7C636554040718214998&sdata=eX%2FgZ0MA% >> 2BdQJjcpYtMkk1pw3r0iVkdR >> >>>>>>>>>>>a% >> >>>>>>>>>> 2F6TWRTG >> >>>>>>>>>>> 10OY%3D&reserved=0 >> >>>>>>>>>>> >> >>>>>>>>>>> Thanks, >> >>>>>>>>>>> Piotr >> >>>>>>>>>>> >> >>>>>>>>>>> 2018-02-27 23:31 GMT+01:00 Alex Harui >> >>>>>>>>>>><[email protected]>: >> >>>>>>>>>>> >> >>>>>>>>>>>> Hi Piotr, >> >>>>>>>>>>>> >> >>>>>>>>>>>> I could not understand this explanation. Might be better to >> >>>>>>>>>>>>show >> >>>>>>>>>> actual >> >>>>>>>>>>>> code. For example in #3, there is a cssClass variable that I >> >>>>>>>> don't >> >>>>>>>>>> know >> >>>>>>>>>>>> about. Also you mention at the bottom setting something as >> >>>>>>>>>>>> empty, >> >>>>>>>>>> but >> >>>>>>>>>>>> I'm >> >>>>>>>>>>>> not sure what that is. >> >>>>>>>>>>>> >> >>>>>>>>>>>> However, IMO, this code should be in utility functions, not >> in >> >>>>>>>>>> UIBase. >> >>>>>>>>>>>> I >> >>>>>>>>>>>> think plenty of useful applications can be built without >> >>>>>>>>>>>> changing >> >>>>>>>>>>>> classNames at runtime. >> >>>>>>>>>>>> >> >>>>>>>>>>>> I'm off-line for the next several hours so we can pick this >> up >> >>>>>>>> again >> >>>>>>>>>> in >> >>>>>>>>>>>> your morning. >> >>>>>>>>>>>> >> >>>>>>>>>>>> Thanks for working on it, >> >>>>>>>>>>>> -Alex >> >>>>>>>>>>>> >> >>>>>>>>>>>> On 2/27/18, 2:21 PM, "Piotr Zarzycki" >> >>>>>>>>>>>> <[email protected]> >> >>>>>>>>>> wrote: >> >>>>>>>>>>>> >> >>>>>>>>>>>>> Here is how I'm thinking to resolve that issue. I would take >> >>>>>>>> Harb's >> >>>>>>>>>>>>> proposition and add to UIBase addClassName() and >> >>>>>>>> removeClassName(). >> >>>>>>>>>>>> Next >> >>>>>>>>>>>>> I >> >>>>>>>>>>>>> would add internal field _internalClassName:String. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> addClassName(value): >> >>>>>>>>>>>>> 1) Will check if provided class name exits in _className and >> >>>>>>>>>>>>>in >> >>>>>>>>>>>>> _internalClassName. >> >>>>>>>>>>>>> 2) Will add to _internalClassName += value >> >>>>>>>>>>>>> 3) Assign to the element.className in the following way: >> >>>>>>>>>>>> element.className >> >>>>>>>>>>>>> = cssClass + " " + _className + " " + typeNames; >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> removeClassName(value) >> >>>>>>>>>>>>> 1) Will check if provided classs name exists in _className >> >>>>>>>>>>>>>or >> >>>>>>>>>>>>> in >> >>>>>>>>>>>>> _internalClassName >> >>>>>>>>>>>>> 2) Make a replace to empty string if css class name exists. >> >>>>>>>>>>>>> _className.replace(value, ""); >> >>>>>>>>>>>>> 3) Assign to the element.className: element.className = >> >>>>>>>> _className >> >>>>>>>>>> + " >> >>>>>>>>>>>> " + >> >>>>>>>>>>>>> typeNames; >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> In added to parent we are computing _internalClassName with >> >>>>>>>>>> _className >> >>>>>>>>>>>> and >> >>>>>>>>>>>>> typeNames. Then it's being set as empty. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> element.className = _internalClassName + " " + _className >> >>>>>>>>>>>>>+ " >> >>>>>>>> " + >> >>>>>>>>>>>>> typeNames; >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> I have implemented it and it seems to be working. Waiting >> for >> >>>>>>>> your >> >>>>>>>>>>>>> thoughts >> >>>>>>>>>>>>> on that solution. The last step where we are adding all >> three >> >>>>>>>>>> fields is >> >>>>>>>>>>>>> the >> >>>>>>>>>>>>> most important. Points 3 in addClassName and removeClassName >> >>>>>>>>>>>>> are >> >>>>>>>>>>>>> necessary, >> >>>>>>>>>>>>> because user may want to more dynamically manipulate classes >> >>>>>>>>>>>>> once >> >>>>>>>>>>>>> component >> >>>>>>>>>>>>> is created. Ex. "is-active" class is removed and added on >> >>>>>>>>>>>>> demand. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Thanks, Piotr >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> 2018-02-27 13:38 GMT+01:00 Piotr Zarzycki >> >>>>>>>>>> <[email protected]>: >> >>>>>>>>>>>>> >> >>>>>>>>>>>>>> I think I have analyzed everything and have some >> >>>>>>>>>>>>>> implementation >> >>>>>>>>>>>>>> proposition. I will try to provide it later today. >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> Thanks, Piotr >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> 2018-02-27 13:35 GMT+01:00 Harbs <[email protected]>: >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> ExpandableSearch broke too. >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> On Feb 25, 2018, at 6:15 PM, Piotr Zarzycki >> >>>>>>>>>>>>>>> <[email protected]> >> >>>>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> Harbs, >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> If you are using something more than MDL Dialog in your >> >>>>>>>>>>>> application >> >>>>>>>>>>>>>>> it >> >>>>>>>>>>>>>>>> would be great to get feedback whether I didn't break for >> >>>>>>>> you >> >>>>>>>>>>>>>>> anything. >> >>>>>>>>>>>>>>> :) >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> -- >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> Piotr Zarzycki >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> Patreon: >> >>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>>>> https%3A%2F%2Fwww.pat >> >>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >> >>>>>>>>>>>> %7C45a065853ba1 >> >>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >> >>>>>>>>>>>> cee1%7C0%7C0%7C6365536 >> >>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >> >>>>>>>>>>>> 9liXcy%2BPg%3D&rese >> >>>>>>>>>>>>>> rved=0 >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>>>> https%3A%2F%2Fwww.pat >> >>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >> >>>>>>>>>>>> %7C45a065853ba1 >> >>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >> >>>>>>>>>>>> cee1%7C0%7C0%7C6365536 >> >>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >> >>>>>>>>>>>> 9liXcy%2BPg%3D&rese >> >>>>>>>>>>>>>> rved=0>* >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> -- >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Piotr Zarzycki >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Patreon: >> >>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>>>> https%3A%2F%2Fwww.patr >> >>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >> >>>>>>>>>>>> 7C45a065853ba14a >> >>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >> >>>>>>>>>>>> cee1%7C0%7C0%7C6365536694 >> >>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >> >>>>>>>>>>>> 9liXcy%2BPg%3D&reserved >> >>>>>>>>>>>>> =0 >> >>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>>>> https%3A%2F%2Fwww.patr >> >>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >> >>>>>>>>>>>> 7C45a065853ba14a >> >>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >> >>>>>>>>>>>> cee1%7C0%7C0%7C6365536694 >> >>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >> >>>>>>>>>>>> 9liXcy%2BPg%3D&reserved >> >>>>>>>>>>>>> =0>* >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> -- >> >>>>>>>>>>> >> >>>>>>>>>>> Piotr Zarzycki >> >>>>>>>>>>> >> >>>>>>>>>>> Patreon: >> >>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>> https%3A%2F%2Fwww.patr >> >>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >> >>>>>>>>>> 7Cee5c84b4e3ff4d >> >>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de >> >>>>>>>>>> cee1%7C0%7C0%7C6365540407 >> >>>>>>>>>>> >> >>>>>>>>>>>18214998&sdata=VYtgB8rsurZAHpO%2FVs% >> 2FqOkmxROz58p7VvQ%2B0EK8VPPc >> >>>>>>>>>>>% >> >>>>>>>>>> 3D&reserv >> >>>>>>>>>>> ed=0 >> >>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>>>> https%3A%2F%2Fwww.patr >> >>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >> >>>>>>>>>> 7Cee5c84b4e3ff4d >> >>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de >> >>>>>>>>>> cee1%7C0%7C0%7C6365540407 >> >>>>>>>>>>> >> >>>>>>>>>>>18214998&sdata=VYtgB8rsurZAHpO%2FVs% >> 2FqOkmxROz58p7VvQ%2B0EK8VPPc >> >>>>>>>>>>>% >> >>>>>>>>>> 3D&reserv >> >>>>>>>>>>> ed=0>* >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> -- >> >>>>>>>>> >> >>>>>>>>> Piotr Zarzycki >> >>>>>>>>> >> >>>>>>>>> Patreon: >> >>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>> https%3A%2F%2Fwww.patr >> >>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >> >>>>>>>> 7Cda0fd75922c94d >> >>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de >> >>>>>>>> cee1%7C0%7C0%7C6365543602 >> >>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>>95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0 >> oJqA6J42ZuhcA%3D&rese >> >>>>>>>>>rv >> >>>>>>>>> ed >> >>>>>>>>> =0 >> >>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >> >>>>>>>> https%3A%2F%2Fwww.patr >> >>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >> >>>>>>>> 7Cda0fd75922c94d >> >>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de >> >>>>>>>> cee1%7C0%7C0%7C6365543602 >> >>>>>>>>> 95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0 >> >>>>>>>> oJqA6J42ZuhcA%3D&reserved=0>* >> >>>>>>>> >> >>>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> -- >> >>>>>>> >> >>>>>>> Piotr Zarzycki >> >>>>>>> >> >>>>>>> Patreon: >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>>*https://na01.safelinks.protection.outlook. >> com/?url=https%3A%2F%2Fww >> >>>>>>>w. >> >>>>>>> pa >> >>>>>>> tr >> >>>>>>> >> >>>>>>> >> >>>>>>><https://na01.safelinks.protection.outlook. >> com/?url=https%3A%2F%2Fww >> >>>>>>>w. >> >>>>>>> pa >> >>>>>>> tr> >> >>>>>>> eon.com >> >>>>>>> >> >>>>>>> >> >>>>>>><https://na01.safelinks.protection.outlook. >> com/?url=http%3A%2F%2Feon >> >>>>>>>.c >> >>>>>>> om >> >>>>>>> >> >>>>>>> >> >>>>>>>%2F&data=02%7C01%7Caharui%40adobe.com% >> 7C75519f53f52b4fde36b108d57edb >> >>>>>>>59 >> >>>>>>> 03 >> >>>>>>> >> >>>>>>> >> >>>>>>>%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >> 7C636554402926763835&sda >> >>>>>>>ta >> >>>>>>> =G >> >>>>>>> >> >>>>>>> >> >>>>>>>P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>% >> 2Fpiotrzar >> >>>>>>>zy >> >>>>>>> ck >> >>>>>>> i&data=02%7C01%7Caharui%40adobe.com >> >>>>>>> >> >>>>>>> >> >>>>>>><https://na01.safelinks.protection.outlook. >> com/?url=http%3A%2F%2F40a >> >>>>>>>do >> >>>>>>> be >> >>>>>>> >> >>>>>>> >> >>>>>>>.com%2F&data=02%7C01%7Caharui%40adobe.com% >> 7C75519f53f52b4fde36b108d5 >> >>>>>>>7e >> >>>>>>> db >> >>>>>>> >> >>>>>>> >> >>>>>>>5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >> 7C636554402926763835 >> >>>>>>>&s >> >>>>>>> da >> >>>>>>> >> >>>>>>> >> >>>>>>>ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D& >> reserved=0>%7Cf2 >> >>>>>>>5d >> >>>>>>> bf >> >>>>>>> 20138f47 >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>>186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178de >> cee1%7C0%7C0%7C6365 >> >>>>>>>54 >> >>>>>>> 37 >> >>>>>>> 41 >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>>87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQS >> etW7oghI4s%3D&rese >> >>>>>>>rv >> >>>>>>> ed >> >>>>>>> =0 >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>><https://na01.safelinks.protection.outlook. >> com/?url=https%3A%2F%2Fww >> >>>>>>>w. >> >>>>>>> pa >> >>>>>>> tr >> >>>>>>> >> >>>>>>> >> >>>>>>><https://na01.safelinks.protection.outlook. >> com/?url=https%3A%2F%2Fww >> >>>>>>>w. >> >>>>>>> pa >> >>>>>>> tr> >> >>>>>>> eon.com >> >>>>>>> >> >>>>>>> >> >>>>>>><https://na01.safelinks.protection.outlook. >> com/?url=http%3A%2F%2Feon >> >>>>>>>.c >> >>>>>>> om >> >>>>>>> >> >>>>>>> >> >>>>>>>%2F&data=02%7C01%7Caharui%40adobe.com% >> 7C75519f53f52b4fde36b108d57edb >> >>>>>>>59 >> >>>>>>> 03 >> >>>>>>> >> >>>>>>> >> >>>>>>>%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >> 7C636554402926763835&sda >> >>>>>>>ta >> >>>>>>> =G >> >>>>>>> >> >>>>>>> >> >>>>>>>P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>% >> 2Fpiotrzar >> >>>>>>>zy >> >>>>>>> ck >> >>>>>>> i&data=02%7C01%7Caharui%40adobe.com >> >>>>>>> >> >>>>>>> >> >>>>>>><https://na01.safelinks.protection.outlook. >> com/?url=http%3A%2F%2F40a >> >>>>>>>do >> >>>>>>> be >> >>>>>>> >> >>>>>>> >> >>>>>>>.com%2F&data=02%7C01%7Caharui%40adobe.com% >> 7C75519f53f52b4fde36b108d5 >> >>>>>>>7e >> >>>>>>> db >> >>>>>>> >> >>>>>>> >> >>>>>>>5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >> 7C636554402926763835 >> >>>>>>>&s >> >>>>>>> da >> >>>>>>> >> >>>>>>> >> >>>>>>>ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D& >> reserved=0>%7Cf2 >> >>>>>>>5d >> >>>>>>> bf >> >>>>>>> 20138f47 >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>>186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178de >> cee1%7C0%7C0%7C6365 >> >>>>>>>54 >> >>>>>>> 37 >> >>>>>>> 41 >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>>87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQS >> etW7oghI4s%3D&rese >> >>>>>>>rv >> >>>>>>> ed >> >>>>>>> =0 >> >>>>>>>> * >> >>>>> >> >>>> >> >>> >> >> >> > >> >> -- Piotr Zarzycki Patreon: *https://www.patreon.com/piotrzarzycki <https://www.patreon.com/piotrzarzycki>*
