ok On 1/3/18, 3:33 PM, "Alex Harui" <aha...@adobe.com.INVALID> wrote:
>Peter, > >I'm not convinced you need itemAdding events. And item can be added and >removed without impacting selection. Selection management should be >independent of changes to the data provider, and it is up to selection >management to interpret itemAdded/itemRemoved to some selection change. >It is that selection management code that needs to dispatch a "changing" >before "change" or "selectionChanging" before "selectionChange". > >My 2 cents, >-Alex > >On 1/3/18, 11:39 AM, "Peter Ent" <p...@adobe.com.INVALID> wrote: > >>Well, that bead only dispatches "dataProvidedChanged" regardless of the >>reason. And it does so after the data as changed. We want to know before >>the data changes so we can save the selection and then after the data >>changes so it can be restored, if possible. We need something to send out >>an event prior to the changes. >> >>ArrayList only sends post-change events. If we listen for when the >>selectedIndex changes, then we can keep a reference to the item selected. >>When ArrayList is updated and sends, say a "itemAdded" event, the model >>must not change the selectedIndex (thus dispatching a event and wiping >>out >>our save). >> >>I think the right way to do this is: >> >>ArrayList - sends itemAdded, itemRemoved, itemUpdated events. This is >>what >>it does now. >> >>DynamicArrayList - extends ArrayList, and sends itemAdding, itemRemoving, >>and itemUpdating events prior to making the changes and then calls the >>super function to dispatch the normal post-change event. >> >>DynamicArrayListSelectionModel listens for the "-ing" events and saves >>the >>current selection. When it receives the "-ed" event, it restores the >>selection. >> >>I think this will work and should not be disruptive. >> >>On 1/3/18, 12:26 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> wrote: >> >>>Hi Peter, >>> >>>What about DataProviderItemsChangeNotifier - It exactly doing what you >>>are >>>saying and what that restoration bead needs. What do you think ? >>> >>>Thanks, Piotr >>> >>> >>>2018-01-03 18:05 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: >>> >>>> I've spent this morning wrestling with this. >>>> >>>> Right now when a model (eg, ArraySelectionModel, >>>>ArrayListSelectionModel) >>>> has its dataProvider replaced, it will set the selectedIndex to -1 >>>>(and >>>> selectedItem to null) if the dataProvider is being set to null; >>>>otherwise >>>> it leaves the values unchanged unless the current value exceeds the >>>>size >>>> of the new dataProvider. >>>> >>>> A typical way to change things is to update the dataProvider and then >>>>set >>>> the list.dataProvider to null (selectedIndex becomes -1, dispatches >>>> "selectedIndexChanged") followed setting list.dataProvider back to the >>>> original dataProvider. This is done because we did not have a dynamic >>>> system. Reseting the selection in this cause falls on the application >>>> writer. >>>> >>>> For dynamic data, I think we also need a dynamic model (eg, >>>> DynamicCollectionViewSelectionModel) which is tuned into the needs of >>>>a >>>> dynamic system. >>>> >>>> Before changing a dataProvider, the >>>>DyanmicCollectionViewSelectionModel >>>> will dispatch a "dataProviderChanging" event. This would give a >>>>selection >>>> restoration bead the opportunity to store the current selection. Then >>>>upon >>>> receiving the "dataProviderChanged" event, restore the selection. >>>> >>>> Unfortunately, the selection restoration bead still does not know when >>>>an >>>> item will be added or removed. While the model can listen for a >>>>complete >>>> replacement of the dataProvider and warning with a >>>>"dataProviderChanging" >>>> event, then is no "itemAdding" or "itemRemoving" event prior to an >>>>item >>>> being added or removed. To do this, we will need to having a new >>>> collection view that extends ArrayList and dispatches those extra >>>>events. >>>> Then the selection restoration bead can operate correctly. >>>> >>>> This is my current thinking. >>>> >>>> —peter >>>> >>>> >>>> On 1/2/18, 4:43 PM, "Alex Harui" <aha...@adobe.com.INVALID> wrote: >>>> >>>> >And this one reason we have beads as a pattern. There is no one >>>>right >>>>way >>>> >to preserve selection and selection should not always be preserved >>>>for >>>> >certain kinds of data provider changes. So, create a bead that >>>>performs >>>> >the selection preservation you need and give it a name that makes it >>>>clear >>>> >what it does. Then others can create similar beads for other >>>>strategies. >>>> > >>>> >My 2 cents, >>>> >-Alex >>>> > >>>> >On 1/2/18, 1:26 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> >>>>wrote: >>>> > >>>> >>Peter, >>>> >> >>>> >>You didn't misread, but my thoughts probably didn't far away into >>>>problem >>>> >>resolution. That's why I was surprise why I haven't thought about >>>> >>preserving selection. :) >>>> >> >>>> >>Thanks, Piotr >>>> >> >>>> >> >>>> >>2018-01-02 22:10 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: >>>> >> >>>> >>> I thought because you mentioned that rollover and selection were >>>>messed >>>> >>> up, that was the thing needing attention. I must have misread your >>>> >>>email; >>>> >>> I'll go back. >>>> >>> >>>> >>> In the meantime, I have a Button that inserts an item into the >>>> >>> dataProvider. Before doing this I am: >>>> >>> >>>> >>> var oldSelection:Object = list.selectedItem; // or selectedIndex?? >>>> >>> >>>> >>> >>>> >>> then update the dataProvider by inserting an item into it. For a >>>>List >>>> >>>with >>>> >>> the standard bead set, I have to: >>>> >>> >>>> >>> list.dataProvider = null; >>>> >>> list.dataProvider = applicationModel.dataProvider; >>>> >>> >>>> >>> After that, I just restore the selection: list.dataProvider = >>>> >>>oldSelection >>>> >>> >>>> >>> Need to figure out if the dataProvider will change, save the >>>>selection, >>>> >>> allow the change, then restore it. >>>> >>> >>>> >>> —peter >>>> >>> >>>> >>> On 1/2/18, 3:58 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> >>>> wrote: >>>> >>> >>>> >>> >How are you doing that preservation, by simply saving item >>>>somewhere >>>> >>> >before >>>> >>> >remove/add operation ? >>>> >>> > >>>> >>> >I'm not following the part where we you wanted some opinion. >>>>Actually >>>> >>>in >>>> >>> >case of refreshing I didn't even thing about saving selection, >>>>but >>>> >>>it's >>>> >>> >true that it should happen! It's surprises me that in my app I >>>>forgot >>>> >>> >about >>>> >>> >that. :) >>>> >>> > >>>> >>> >Thanks, Piotr >>>> >>> > >>>> >>> > >>>> >>> >2018-01-02 21:44 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: >>>> >>> > >>>> >>> >> The first task is to determine if a list's selectedIndex or >>>> >>>selectedItem >>>> >>> >> should be preserved. >>>> >>> >> >>>> >>> >> For selectedIndex, adding or removing an item will get the same >>>>row >>>> >>> >> selected until that row no longer exists. >>>> >>> >> >>>> >>> >> For selectedItem, adding or removing an item will keep the same >>>>item >>>> >>> >> selected until that item no longer exists. For example, if the >>>>4th >>>> >>>item >>>> >>> >>is >>>> >>> >> "red" and you insert an item at position 2, "red" remains >>>>selected >>>> >>>by >>>> >>> >> shifts down a row. >>>> >>> >> >>>> >>> >> I can see this working both ways. >>>> >>> >> >>>> >>> >> In either case, first preserving the selection (index or item) >>>> >>>before >>>> >>> >>the >>>> >>> >> add or remove and then restoring it works fine - I did this in >>>> >>> >>application >>>> >>> >> code, not in framework code. Works very nicely, as a matter of >>>>fact. >>>> >>> >>Works >>>> >>> >> for both traditional lists and dynamic lists with the new beads >>>> >>>(yours, >>>> >>> >> Piotr, or my new collection ones). Its *very simple* code. >>>> >>> >> >>>> >>> >> So once we decide which selection is preserved, we need to >>>>decide >>>> >>>where >>>> >>> >> that goes. Even though this code is just a couple of lines, in >>>>the >>>> >>>PAYG >>>> >>> >> world, not every app needs this so it must go into additional >>>>beads >>>> >>> >>since >>>> >>> >> it is added functionality. >>>> >>> >> >>>> >>> >> —peter >>>> >>> >> >>>> >>> >> >>>> >>> >> >>>> >>> >> >>>> >>> >> >>>> >>> >> On 1/2/18, 1:31 PM, "Piotr Zarzycki" >>>><piotrzarzyck...@gmail.com> >>>> >>>wrote: >>>> >>> >> >>>> >>> >> >Hi Peter, >>>> >>> >> > >>>> >>> >> >Welcome after vacation! I sense all ideas when I'm working >>>>with >>>> >>>that >>>> >>> >> >stuff. >>>> >>> >> >I think you will see the issue with indexes, even if it's not >>>>the >>>> >>>case >>>> >>> >> >with >>>> >>> >> >removing from the list. I will wait for your review with that >>>>index >>>> >>> >> >refresh. >>>> >>> >> > >>>> >>> >> >Thank you so much! :) >>>> >>> >> > >>>> >>> >> > >>>> >>> >> >2018-01-02 19:10 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: >>>> >>> >> > >>>> >>> >> >> Hi, >>>> >>> >> >> >>>> >>> >> >> Catching up and building stuff. I'm going to repeat some >>>>things >>>> >>>for >>>> >>> >>the >>>> >>> >> >> befit of anyone joining Royale for 2018 (and to refresh my >>>>own >>>> >>> >>thoughts >>>> >>> >> >> coming off of holiday!). >>>> >>> >> >> >>>> >>> >> >> The initial idea of List and related classes was their beads >>>>were >>>> >>>to >>>> >>> >>be >>>> >>> >> >> almost static. You'd have data that you would use to create >>>>the >>>> >>> >> >> dataProvider to the list and when set, would cause the >>>> >>>itemRenderers >>>> >>> >>to >>>> >>> >> >>be >>>> >>> >> >> deleted and replaced. Even something as simple as adding new >>>>data >>>> >>>to >>>> >>> >>the >>>> >>> >> >> end of the dataProvider would require this reset: you'd have >>>>to >>>> >>>clear >>>> >>> >> >>the >>>> >>> >> >> dataProvider (list.dataProver = null) and set it again or >>>>create >>>> >>>a >>>> >>> >> >> completely new dataProvider and set that to the list. >>>> >>> >> >> >>>> >>> >> >> The selected item and index should, in this case, be >>>>cleared. >>>>I'd >>>> >>> >>have >>>> >>> >> >>to >>>> >>> >> >> run a test to see if that really happens as I don't >>>>remember. >>>>If >>>> >>>you >>>> >>> >> >>want >>>> >>> >> >> to reset them back (assuming that index still existed) you >>>>would >>>> >>> >>write a >>>> >>> >> >> bead to do it. >>>> >>> >> >> >>>> >>> >> >> Now we are at the dynamic stage where we want to handle >>>>runtime >>>> >>> >>updates >>>> >>> >> >>to >>>> >>> >> >> the dataProvider and create just new itemRenderers and >>>>insert >>>> >>>them or >>>> >>> >> >> remove itemRenderers when data is deleted from the >>>>dataProvider. >>>> >>> >> >> >>>> >>> >> >> Alex believes that the initial creation and insertions are >>>>the >>>> >>>most >>>> >>> >> >>common >>>> >>> >> >> of the dynamic actions; removals being less common. As such >>>>in >>>> >>>the >>>> >>> >>PAYG >>>> >>> >> >> world you would have a bead that handled a replacement of >>>>the >>>> >>> >> >>dataProvider >>>> >>> >> >> (which covers the initialization step) and a bead which >>>>handled >>>> >>> >> >>additions >>>> >>> >> >> and a bead to handle removals. There's a lot of duplication >>>>of >>>> >>>code >>>> >>> >>in >>>> >>> >> >> these and under a non-PAYG system you'd just combine these >>>>into a >>>> >>> >>single >>>> >>> >> >> bead to do initialize, add, and removal. >>>> >>> >> >> >>>> >>> >> >> In the dynamic beads, the selection should be preserved. >>>>That >>>> >>> >> >>information >>>> >>> >> >> is stored in the model. The model doesn't do much else >>>>accept >>>> >>>keep >>>> >>> >>the >>>> >>> >> >> data. The standard view bead would not know about these >>>>extra >>>> >>>events >>>> >>> >>so >>>> >>> >> >> yes, we'd need another view bead to intercept those events >>>>and >>>> >>> >>re-apply >>>> >>> >> >>or >>>> >>> >> >> adjust the selection. >>>> >>> >> >> >>>> >>> >> >> ‹peter >>>> >>> >> >> >>>> >>> >> >> On 12/30/17, 4:29 PM, "Piotr Zarzycki" >>>> >>><piotrzarzyck...@gmail.com> >>>> >>> >> >>wrote: >>>> >>> >> >> >>>> >>> >> >> >Peter, >>>> >>> >> >> > >>>> >>> >> >> >I have figure out what is wrong in case of List. I reported >>>>in >>>> >>>the >>>> >>> >> >> >previous >>>> >>> >> >> >email that in the ListExample once you remove one item, >>>> >>>something is >>>> >>> >> >>wrong >>>> >>> >> >> >with selection. Issue happened when you removing item in >>>>the >>>> >>>middle >>>> >>> >>of >>>> >>> >> >> >collection. >>>> >>> >> >> > >>>> >>> >> >> >Let's say that you have 5 items and you are removing item >>>>with >>>> >>> >>index = >>>> >>> >> >>2. >>>> >>> >> >> >Removing will work properly, but StringItemRenderer -> >>>> >>> >> >> >DataItemRenderer -> UIItemRendererBase >>>> >>> >> >> ><- has property "index" which is basically not being >>>>refreshed >>>> >>>after >>>> >>> >> >> >remove. In the result renderers has following indexes: >>>> >>> >> >> > >>>> >>> >> >> >0, >>>> >>> >> >> >1, >>>> >>> >> >> >3, >>>> >>> >> >> >4 >>>> >>> >> >> > >>>> >>> >> >> >Which is messes up selection and roll over color changes. >>>>How >>>> >>> >>actually >>>> >>> >> >>fix >>>> >>> >> >> >that ? My first thought was that ListView should listen for >>>> >>> >> >>"layoutNeeded" >>>> >>> >> >> >(we are dispatching that event after remove, add etc.) and >>>> >>>refresh >>>> >>> >> >>indexes >>>> >>> >> >> >of all renderers. >>>> >>> >> >> > >>>> >>> >> >> >The second thought is that ListView should listen for >>>>remove >>>> >>>event, >>>> >>> >> >>where >>>> >>> >> >> >we will have index of removed row, so we will be able loop >>>> >>>through >>>> >>> >> >>part of >>>> >>> >> >> >the collection and refresh rest of the indexes. It is more >>>> >>> >>efficient, >>>> >>> >> >>but >>>> >>> >> >> >maybe this is job for new type of View (bead) - >>>>ListRemoveView >>>> >>>bead >>>> >>> >>? >>>> >>> >> >> > >>>> >>> >> >> >Looking forward to your thought once you get back from >>>>Vacation. >>>> >>>:) >>>> >>> >> >> > >>>> >>> >> >> >Thanks, Piotr >>>> >>> >> >> > >>>> >>> >> >> > >>>> >>> >> >> > >>>> >>> >> >> >2017-12-22 15:05 GMT+01:00 Piotr Zarzycki >>>> >>> >><piotrzarzyck...@gmail.com>: >>>> >>> >> >> > >>>> >>> >> >> >> Hi Peter, >>>> >>> >> >> >> >>>> >>> >> >> >> I haven't checked your branch yet, but I just pushed >>>>couple of >>>> >>> >> >>things to >>>> >>> >> >> >> the develop which I needed for my examples. Here is the >>>>list >>>> >>>of >>>> >>> >>beads >>>> >>> >> >> >>which >>>> >>> >> >> >> we currently have and can be used for List. I think names >>>>are >>>> >>>self >>>> >>> >> >> >> explanatory. >>>> >>> >> >> >> >>>> >>> >> >> >> DynamicAddItemRendererForArrayListData >>>> >>> >> >> >> >>>> >>> >> >> >> DynamicUpdateItemRendererForArrayListData >>>> >>> >> >> >> >>>> >>> >> >> >> DynamicRemoveItemRendererForArrayListData >>>> >>> >> >> >> >>>> >>> >> >> >> DynamicRemoveAllItemRendererForArrayListData >>>> >>> >> >> >> >>>> >>> >> >> >> DynamicRemoveAllByNullItemRendererForArrayListData >>>> >>> >> >> >> >>>> >>> >> >> >> All beads above should be used once you set for your >>>>list: >>>> >>> >> >> >>IDataProviderItemRendererMapper: >>>> >>> >> >> >>ClassReference("org.apache.royale.html.beads. >>>> >>> >> >> DataItemRendererFactoryForAr >>>> >>> >> >> >>rayList") >>>> >>> >> >> >> >>>> >>> >> >> >> We have also DynamicItemsRendererFactoryForArrayListData >>>>- >>>> >>>which >>>> >>> >>is >>>> >>> >> >> >>doing actually two things. Create all items once someone >>>>set >>>> >>> >> >> >>dataProvider (the same logic as in >>>> >>> >> >>DataItemRendererFactoryForArrayList) >>>> >>> >> >> >>AND handle adding to >>>> >>> >> >> >> >>>> >>> >> >> >> ArrayList (the same logic as in >>>> >>> >> >>DynamicAddItemRendererForArrayListData) >>>> >>> >> >> >>- It duplicates logic from those both beads. >>>> >>> >> >> >> >>>> >>> >> >> >> >>>> >>> >> >> >> Two Scenarios with >>>> >>>DynamicItemsRendererFactoryForArrayListData: >>>> >>> >> >> >> >>>> >>> >> >> >> 1) If we use DynamicItemsRendererFactoryForArrayListData >>>> >>>simply >>>> >>> in >>>> >>> >> >>the >>>> >>> >> >> >>List as it is in our ListExample [1] we don't have to >>>>remember >>>> >>>to >>>> >>> >> >>setup: >>>> >>> >> >> >> >>>> >>> >> >> >> IDataProviderItemRendererMapper: >>>> >>> >> >> >>ClassReference("org.apache.royale.html.beads. >>>> >>> >> >> DataItemRendererFactoryForAr >>>> >>> >> >> >>rayList"). >>>> >>> >> >> >> >>>> >>> >> >> >> However in that scenario we will have in List totally >>>>useless >>>> >>>bead >>>> >>> >> >> >>DataItemRendererFactoryForArray which is being added >>>>default >>>> to >>>> >>> the >>>> >>> >> >> List. >>>> >>> >> >> >> >>>> >>> >> >> >> 2) If we use DynamicItemsRendererFactoryForArrayListData >>>>and >>>> >>>we >>>> >>> >>add >>>> >>> >> >>in >>>> >>> >> >> >>CSS IDataProviderItemRendererMapper: >>>> >>> >> >> >>ClassReference("org.apache.royale.html.beads. >>>> >>> >> >> DataItemRendererFactoryForAr >>>> >>> >> >> >>rayList") >>>> >>> >> >> >> >>>> >>> >> >> >> I'm not sure what can happen actually, cause both beads >>>>are >>>> >>>using >>>> >>> >>the >>>> >>> >> >> >>same logic to create item renderers. Can be situation when >>>>one >>>> >>> >>bead is >>>> >>> >> >> >>create renderers and second one re do this work again ? :) >>>> >>> >> >> >> >>>> >>> >> >> >> >>>> >>> >> >> >> Thanks, Piotr >>>> >>> >> >> >> >>>> >>> >> >> >> >>>> >>> >> >> >> >>>> >>> >> >> >> [1] >>>> >>> >> >> >>https://na01.safelinks.protection.outlook.com/?url= >>>> >>> >> >> https%3A%2F%2Fgithub.c >>>> >>> >> >> >>om%2Fapache%2Froyale-asjs%2Fblob% >>>> 2F24b09c787fc1da2d0a19895a2b2d >>>> >>> >> >> 4a440e26c5 >>>> >>> >> >> >>97%2Fexamples%2Froyale%2FListExample%2Fsrc%2Fmain% >>>> >>> >> >> 2Froyale%2FMyInitialVie >>>> >>> >> >> >>w.mxml%23L69&data=02%7C01%7Cpent%40adobe.com% >>>> >>> >> >> 7C94d879f8f6054e10c75508d54f >>>> >>> >> >> >>cc6fe8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>> >>> >> >> 7C636502661827506659&sd >>>> >>> >> >> >>ata=W4Ih5Q0IGhGNvOX9jrmn580Qw4ljo%2BavjqABV4%2BJr%2Bc%3D& >>>> >>> reserved=0 >>>> >>> >> >> >> >>>> >>> >> >> >> >>>> >>> >> >> >> >>>> >>> >> >> >> 2017-12-19 20:35 GMT+01:00 Olaf Krueger >>>> >>><m...@olafkrueger.net>: >>>> >>> >> >> >> >>>> >>> >> >> >>> Peter, great to read something about these "Collections" >>>>and >>>> >>> >> >> >>>"Hierarchical >>>> >>> >> >> >>> data" stuff here! >>>> >>> >> >> >>> Thanks for working on this, have a nice time and enjoy >>>>your >>>> >>> >>break! >>>> >>> >> >> >>> >>>> >>> >> >> >>> Olaf >>>> >>> >> >> >>> >>>> >>> >> >> >>> >>>> >>> >> >> >>> >>>> >>> >> >> >>> -- >>>> >>> >> >> >>> Sent from: >>>> >>> >> >> >>>https://na01.safelinks.protection.outlook.com/?url= >>>> >>> >> >> http%3A%2F%2Fapache-r >>>> >>> >> >> >>>>>>>oyale-development.20373.n8.nabble.com%2F&data=02%7C01%7Cpent% >>>> >>> >> >> 40adobe.com >>>> >>> >> >> >>>%7C94d879f8f6054e10c75508d54fcc6fe8% >>>> >>> 7Cfa7b1b5a7b34438794aed2c178de >>>> >>> >> >> cee1%7 >>>> >>> >> >> >>>> >>>>>>C0%7C0%7C636502661827506659&sdata=Zb1nVaD5dUx1Y89Q1jj4LxqBhtlxoZ >>>> >>> >> >> FlwDFJAq >>>> >>> >> >> >>>ruTsY%3D&reserved=0 >>>> >>> >> >> >>> >>>> >>> >> >> >> >>>> >>> >> >> >> >>>> >>> >> >> >> >>>> >>> >> >> >> -- >>>> >>> >> >> >> >>>> >>> >> >> >> Piotr Zarzycki >>>> >>> >> >> >> >>>> >>> >> >> >> Patreon: >>>> >>> >> >> >>*https://na01.safelinks.protection.outlook.com/?url= >>>> >>> >> >> https%3A%2F%2Fwww.pat >>>> >>> >> >> >>reon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com >>>> >>> >> >> %7C94d879f8f6054e >>>> >>> >> >> >>10c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de >>>> >>> >> >> cee1%7C0%7C0%7C636502661 >>>> >>> >> >> >>>>>>827506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg >>>> >>> >> >> FXtA%3D&reserv >>>> >>> >> >> >>ed=0 >>>> >>> >> >> >> >>>> >>> >> >> >><https://na01.safelinks.protection.outlook.com/?url= >>>> >>> >> >> https%3A%2F%2Fwww.pat >>>> >>> >> >> >>reon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com >>>> >>> >> >> %7C94d879f8f6054e >>>> >>> >> >> >>10c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de >>>> >>> >> >> cee1%7C0%7C0%7C636502661 >>>> >>> >> >> >>>>>>827506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg >>>> >>> >> >> FXtA%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%7Cpent%40adobe.com% >>>> >>> >> >> 7C94d879f8f6054e10 >>>> >>> >> >> >c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de >>>> >>> >> >> cee1%7C0%7C0%7C636502661827 >>>> >>> >> >> >506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg >>>> >>> >> >> FXtA%3D&reserved=0 >>>> >>> >> >> ><https://na01.safelinks.protection.outlook.com/?url= >>>> >>> >> >> https%3A%2F%2Fwww.patr >>>> >>> >> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% >>>> >>> >> >> 7C94d879f8f6054e10 >>>> >>> >> >> >c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de >>>> >>> >> >> cee1%7C0%7C0%7C636502661827 >>>> >>> >> >> >506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg >>>> >>> >> >> FXtA%3D&reserved=0 >>>> >>> >> >> >>* >>>> >>> >> >> >>>> >>> >> >> >>>> >>> >> > >>>> >>> >> > >>>> >>> >> >-- >>>> >>> >> > >>>> >>> >> >Piotr Zarzycki >>>> >>> >> > >>>> >>> >> >Patreon: >>>> >>> >> >*https://na01.safelinks.protection.outlook.com/?url= >>>> >>> >> https%3A%2F%2Fwww.patr >>>> >>> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% >>>> >>> >> 7C96bb80bb6fef4b94 >>>> >>> >> >089008d5520f1a9f%7Cfa7b1b5a7b34438794aed2c178de >>>> >>> >> cee1%7C0%7C0%7C636505147194 >>>> >>> >> >>>> >>> >>>474371&sdata=D3%2FGi2wtNJLEO716RK18TbD1VMFdB3V >>>> >>> Kv3Br5KkZfFI%3D&reserved=0 >>>> >>> >> ><https://na01.safelinks.protection.outlook.com/?url= >>>> >>> >> https%3A%2F%2Fwww.patr >>>> >>> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% >>>> >>> >> 7C96bb80bb6fef4b94 >>>> >>> >> >089008d5520f1a9f%7Cfa7b1b5a7b34438794aed2c178de >>>> >>> >> cee1%7C0%7C0%7C636505147194 >>>> >>> >> >474371&sdata=D3%2FGi2wtNJLEO716RK18TbD1VMFdB3V >>>> >>> >> Kv3Br5KkZfFI%3D&reserved=0>* >>>> >>> >> >>>> >>> >> >>>> >>> > >>>> >>> > >>>> >>> >-- >>>> >>> > >>>> >>> >Piotr Zarzycki >>>> >>> > >>>> >>> >Patreon: >>>> >>> >*https://na01.safelinks.protection.outlook.com/?url= >>>> >>> https%3A%2F%2Fwww.patr >>>> >>> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% >>>> >>> 7C61ec983f6a9747bd >>>> >>> >cd7d08d552239493%7Cfa7b1b5a7b34438794aed2c178de >>>> >>> cee1%7C0%7C0%7C636505235128 >>>> >>> >887083&sdata=Y%2BHjYn%2BGj%2Bhb0VVVy7fSW%2BGEvQo2% >>>> >>> 2FUjH2EhucTbxR8Q%3D&rese >>>> >>> >rved=0 >>>> >>> ><https://na01.safelinks.protection.outlook.com/?url= >>>> >>> https%3A%2F%2Fwww.patr >>>> >>> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% >>>> >>> 7C61ec983f6a9747bd >>>> >>> >cd7d08d552239493%7Cfa7b1b5a7b34438794aed2c178de >>>> >>> cee1%7C0%7C0%7C636505235128 >>>> >>> >887083&sdata=Y%2BHjYn%2BGj%2Bhb0VVVy7fSW%2BGEvQo2% >>>> >>> 2FUjH2EhucTbxR8Q%3D&rese >>>> >>> >rved=0>* >>>> >>> >>>> >>> >>>> >> >>>> >> >>>> >>-- >>>> >> >>>> >>Piotr Zarzycki >>>> >> >>>> >>Patreon: >>>> >>*https://na01.safelinks.protection.outlook.com/?url= >>>> https%3A%2F%2Fwww.pat >>>> >>r >>>> >>eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >>>> %7C4ed02057c74e4 >>>> >>5 >>>> >>0da30908d552277e71%7Cfa7b1b5a7b34438794aed2c178de >>>> cee1%7C0%7C0%7C636505251 >>>> >>9 >>>> >>>>>>40120787&sdata=aJzPBX5fyLQVXr21gO9aLOIIQhVMgf3QaT4qEcsnWE4%3D&reserve >>>>>>d >>>>>>= >>>>>>0 >>>> >><https://na01.safelinks.protection.outlook.com/?url= >>>> https%3A%2F%2Fwww.pat >>>> >>r >>>> >>eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >>>> %7C4ed02057c74e4 >>>> >>5 >>>> >>0da30908d552277e71%7Cfa7b1b5a7b34438794aed2c178de >>>> cee1%7C0%7C0%7C636505251 >>>> >>9 >>>> >>40120787&sdata=aJzPBX5fyLQVXr21gO9aLOIIQhVMgf >>>> 3QaT4qEcsnWE4%3D&reserved=0> >>>> >>* >>>> > >>>> >>>> >>> >>> >>>-- >>> >>>Piotr Zarzycki >>> >>>Patreon: >>>*https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.pa >>>t >>>r >>>eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com%7Cbc91b6fdde6b49 >>>0 >>>b >>>314408d552cf1a3d%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C6365059718 >>>6 >>>0 >>>386569&sdata=6jY4KSQS6PyNDnWtW3XBVP69nGU%2FHJYfyxHdhurBwh0%3D&reserved=0 >>><https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.pa >>>t >>>r >>>eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com%7Cbc91b6fdde6b49 >>>0 >>>b >>>314408d552cf1a3d%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C6365059718 >>>6 >>>0 >>>386569&sdata=6jY4KSQS6PyNDnWtW3XBVP69nGU%2FHJYfyxHdhurBwh0%3D&reserved=0 >>>> >>>* >> >