<div dir="ltr"><div class="markdown-here-wrapper" style=""><blockquote style="margin:1.2em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:0px 0px 1.2em!important">  but I would just create something like this on top of STS</p>
</blockquote>
<p style="margin:0px 0px 1.2em!important">Definitely possible (and it is how I made my PoC), but the point I was trying to make is that there should be some base TaskScope that does not touch the other constructs and for other constructs we should use a different StructuredTask implementation.<br>One can easily implement <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">StructuredTask.lambdaScopedBuilder(...)</code> (name in progress) which works as Eric’s example.</p>
<p style="margin:0px 0px 1.2em!important">Now that I re-read the mailing chain I realised that my <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">StructuredTask.stream</code> is not what Eric talked about, but I still stand by my point that if we add such a construct to the API, it should be separated from the “basic” one.</p>
<blockquote style="margin:1.2em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:0px 0px 1.2em!important">If you have a working implementation of something like this, I would be curious to see it</p>
</blockquote>
<p style="margin:0px 0px 1.2em!important">Unfortunately I only have a partial implementation at the moment, and it is sitting in a closed network. I will try to get it out/rewrite it and upload it to git to share it when I can.</p>
<blockquote style="margin:1.2em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:0px 0px 1.2em!important">Though I suspect an actual implementation has to go through some iterations</p>
</blockquote>
<p style="margin:0px 0px 1.2em!important">Definitely, in the actual API I have apart from <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">flatFork</code> also <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">fork</code> (obviously), <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">forkMulti</code>, <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">flatFanIn</code> (see bellow) (I didn’t implement <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">fanInMulti</code> yet, but conceptually it is there, although a bit more tricky to implement because of short-circuit), <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">exit</code> (anly accessible after <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">flatFanIn</code>, you put a condition  based on number of iterations and time for when to short-circuit the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">fanIn</code> mod), <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">joinAll</code> (equivalent to the standard <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">StructuredTaskScope</code>), <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">joinTillFirst</code> (equivalent to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ShutdownOnSuccess</code>), <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">joinTillFailure</code> (equivalent to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ShutdownOnFailure</code>) and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">start</code> (start can be called only after one of the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">joinX</code> was called). After a “start” call, you are left with a normal stream</p>
<p style="margin:0px 0px 1.2em!important">The API is certainly not perfect and is more of a PoC (e.g. it always saves the results and the exceptions in fanOut mod, and never in fanIn mod, apart maybe from the last task finished), also apart from heavy pipe-lines I prefer to not use this style of coding, so I never actually planned to promote this from PoC.</p>
<p style="margin:0px 0px 1.2em!important">To handle situations like you described I made the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">fanIn</code> mod, which basically just runs repeatedly till the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">exit</code> condition is met or is called to exit from one of the subtasks in creates:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-java" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)">StructuredTask.streamBuilder() <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// in actuality it is not part of "StructuredTask"</span>
                   .flatFanIn(() -> serverSocket.accept())
                   .exit((count, time, absoluteTime) -> ...) <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// count is the number of "events" fired, "time" is time since last "event", "absoluteTime" is time since entering "fanIn" mod</span>
                   .fork(ctx -> ...) <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">//in "fanIn" mod fork has a "context" of the mod, which allows an individual task to access it's `count, time, absoluteTime` as well as exiting the mod</span>
                   .joinAll()
                   .start(); <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// empty stream, because it is fanIn mod</span>
</code></pre>
<blockquote style="margin:1.2em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:0px 0px 1.2em!important">And also compare how particular cases would compare against <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Stream</code>, because your example looks like more of a candidate of parallel <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Stream</code></p>
</blockquote>
<p style="margin:0px 0px 1.2em!important">It is a similar API to a stream, it is also structured concurrency.</p>
<p style="margin:0px 0px 1.2em!important">It also has nothing (okay, maybe not <b>nothing</b>) to do with parallel stream apart from the similar function call chaining, the semantics of “parallel stream” in Java is that the parallelism works together in completing a transformation on the input (as evidenced by the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">reduce</code>and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">collect</code> methods), and in general in the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Stream</code> interface there are a lot of methods that doesn’t make sense for the StructuredTaskStream</p>
<p style="margin:0px 0px 1.2em!important">On Fri, May 19, 2023 at 10:43 PM Attila Kelemen <a href="http://mailto:attila.kelemen85@gmail.com">attila.kelemen85@gmail.com</a> wrote:</p>
<p style="margin:0px 0px 1.2em!important"></p><div class="markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">><br>
> Attila (and still Eric)<br>
> It seems like both of you don’t like the TWR part, but I find it extremely nice to have, and a lot of times prefer it over a lambda argument.<br>
> TWR allows us to propagate checked exceptions, which till we add union-types in generic levels is impossible to do with lambdas, and it doesn’t have the (justified) restrictions of lambdas.<br>
<br>
I'm not really against having the TWR way available as a low level<br>
construct, I just like to have these lambda blocks as utility to which<br>
you resort to (although tbh, it is a bit strange that scoped values<br>
give you lambda block only, while STS only TWR). Of course, checked<br>
exceptions are a nightmare in these constructs, and that is why I<br>
usually have `UnsafeFunction<T, E extends Throwable>` (and its<br>
gazillion siblings) around (and I'm pretty sure there are many-many<br>
people creating their own "Unsafe" function interfaces). In an idea<br>
world we could have constructs similar to Kotlin's inline functions,<br>
which would solve this issue (fingers crossed for it :))<br>
<br>
><br>
> var results = StructuredTask.StreamBuilder()<br>
>                                    .value<String>("USERNAME", "duke")<br>
>                                    .flatFork(() -> Stream.of(workers))<br>
>                                    .join()<br>
>                                    .throwIfFailed() // "StructuredTask.Stream" doesn't need a "strategy" because it exposes functions like this instead<br>
>                                    .map(Subtask::get) // "structured" comes into play here, you can't call terminating operators without first calling "join"<br>
>                                    .toList();<br>
><br>
<br>
This could be nice actually, but I would just create something like<br>
this on top of STS, since an API like this could easily end up with<br>
unwanted limitation. If you have a working implementation of something<br>
like this, I would be curious to see it. Though I suspect an actual<br>
implementation has to go through some iterations (at least, when I'm<br>
designing APIs like this, I always have to seriously review my<br>
original idea). In this idea - for example - I can't see how you would<br>
do a conditional termination of starting new workers in a loop. For<br>
example, if this was a server waiting for TCP connections, and then it<br>
needed to fork new tasks for each incoming connection, I'm not sure<br>
how that would look. And also compare how particular cases would<br>
compare against `Stream`, because your example looks like more of a<br>
candidate of parallel `Stream`.<br>
</blockquote><p></p></div><p style="margin:0px 0px 1.2em!important"></p>
<div title="MDH:PGRpdiBkaXI9Imx0ciIgZ21haWxfb3JpZ2luYWw9IjEiPiZndDsmbmJzcDsKCmJ1dCBJIHdvdWxk
IGp1c3QgY3JlYXRlIHNvbWV0aGluZyBsaWtlIHRoaXMgb24gdG9wIG9mIFNUUzxkaXY+PGJyPjwv
ZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+RGVmaW5pdGVseSBwb3NzaWJsZSAoYW5kIGl0IGlzIGhv
dyBJJm5ic3A7bWFkZSBteSBQb0MpLCBidXQgdGhlIHBvaW50IEkgd2FzIHRyeWluZyB0byBtYWtl
IGlzIHRoYXQgdGhlcmUgc2hvdWxkIGJlIHNvbWUgYmFzZSBUYXNrU2NvcGUgdGhhdCBkb2VzIG5v
dCB0b3VjaCB0aGUgb3RoZXIgY29uc3RydWN0cyBhbmQgZm9yIG90aGVyIGNvbnN0cnVjdHMgd2Ug
c2hvdWxkIHVzZSBhIGRpZmZlcmVudCBTdHJ1Y3R1cmVkVGFzayBpbXBsZW1lbnRhdGlvbi48L2Rp
dj48ZGl2Pk9uZSBjYW4gZWFzaWx5IGltcGxlbWVudCBgPHNwYW4gc3R5bGU9ImNvbG9yOiByZ2Io
ODAsIDAsIDgwKTsiPlN0cnVjdHVyZWRUYXNrLmxhbWJkYVNjb3BlZEJ1aWxkZXIoLi4uKWAgKG5h
bWUgaW4gcHJvZ3Jlc3MpIHdoaWNoIHdvcmtzIGFzIEVyaWMncyBleGFtcGxlLjwvc3Bhbj48L2Rp
dj48ZGl2PjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDgwLCAwLCA4MCk7Ij48YnI+PC9zcGFuPjwv
ZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoODAsIDAsIDgwKTsiPk5vdyB0aGF0IEkg
cmUtcmVhZCB0aGUgbWFpbGluZyBjaGFpbiBJIHJlYWxpc2VkIHRoYXQgbXkgYFN0cnVjdHVyZWRU
YXNrLnN0cmVhbWAgaXMgbm90IHdoYXQgRXJpYyB0YWxrZWQgYWJvdXQsIGJ1dCBJIHN0aWxsIHN0
YW5kIGJ5IG15IHBvaW50IHRoYXQgaWYgd2UgYWRkIHN1Y2ggYSBjb25zdHJ1Y3QgdG8gdGhlIEFQ
SSwgaXQgc2hvdWxkIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSAiYmFzaWMiIG9uZS48L3NwYW4+PC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj4mZ3Q7IElmIHlvdSBoYXZlIGEgd29ya2luZyBpbXBsZW1l
bnRhdGlvbiBvZiBzb21ldGhpbmcgbGlrZSB0aGlzLCBJIHdvdWxkIGJlIGN1cmlvdXMgdG8gc2Vl
IGl0PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VW5mb3J0dW5hdGVseSZuYnNwO0kgb25s
eSBoYXZlIGEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBhdCB0aGUgbW9tZW50LCBhbmQgaXQgaXMg
c2l0dGluZyBpbiBhIGNsb3NlZCBuZXR3b3JrLiBJIHdpbGwgdHJ5IHRvIGdldCBpdCBvdXQvcmV3
cml0ZSBpdCBhbmQgdXBsb2FkIGl0IHRvIGdpdCB0byBzaGFyZSBpdCB3aGVuIEkgY2FuLjwvZGl2
PjxkaXY+PGJyPjwvZGl2PjxkaXY+Jmd0OyBUaG91Z2ggSSBzdXNwZWN0IGFuIGFjdHVhbCBpbXBs
ZW1lbnRhdGlvbiBoYXMgdG8gZ28gdGhyb3VnaCBzb21lIGl0ZXJhdGlvbnM8YnI+PC9kaXY+PGRp
dj48YnI+PC9kaXY+PGRpdj5EZWZpbml0ZWx5LCBpbiB0aGUgYWN0dWFsIEFQSSBJIGhhdmUgYXBh
cnQgZnJvbSBgZmxhdEZvcmtgIGFsc28gYGZvcmtgIChvYnZpb3VzbHkpLCBgZm9ya011bHRpYCwg
YGZsYXRGYW5JbmAgKHNlZSBiZWxsb3cpIChJIGRpZG4ndCBpbXBsZW1lbnQgYGZhbkluTXVsdGlg
IHlldCwgYnV0IGNvbmNlcHR1YWxseSBpdCBpcyB0aGVyZSwgYWx0aG91Z2ggYSBiaXQgbW9yZSB0
cmlja3kgdG8gaW1wbGVtZW50IGJlY2F1c2Ugb2YgPHNwYW4gemV1bTRjOD0iUFJfNTlfMCIgZGF0
YS1kZG53YWI9IlBSXzU5XzAiIGFyaWEtaW52YWxpZD0ic3BlbGxpbmciIGNsYXNzPSJMSSBuZyI+
c2hvcnQtY3VpcmNpdDwvc3Bhbj4pLCBgZXhpdGAgKGFubHkgYWNjZXNzaWJsZSBhZnRlciBgZmxh
dEZhbkluYCwgeW91IHB1dCBhIGNvbmRpdGlvbiZuYnNwOyBiYXNlZCBvbiBudW1iZXIgb2YgaXRl
cmF0aW9ucyBhbmQgdGltZSBmb3Igd2hlbiB0byBzaG9ydC1jaXJjdWl0IHRoZSBgZmFuSW5gIG1v
ZCksIGBqb2luQWxsYCAoZXF1aXZhbGVudCB0byB0aGUgc3RhbmRhcmQgYFN0cnVjdHVyZWRUYXNr
U2NvcGVgKSwgYGpvaW5UaWxsRmlyc3RgIChlcXVpdmFsZW50IHRvIGBTaHV0ZG93bk9uU3VjY2Vz
c2ApLCBgam9pblRpbGxGYWlsdXJlYCAoZXF1aXZhbGVudCB0byBgU2h1dGRvd25PbkZhaWx1cmVg
KSBhbmQgYHN0YXJ0YCAoc3RhcnQgY2FuIGJlIGNhbGxlZCBvbmx5IGFmdGVyIG9uZSBvZiB0aGUg
YGpvaW5YYCB3YXMgY2FsbGVkKS4gQWZ0ZXIgYSAic3RhcnQiIGNhbGwsIHlvdSBhcmUgbGVmdCB3
aXRoIGEgbm9ybWFsIHN0cmVhbTwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhlIEFQSSBpcyBj
ZXJ0YWlubHkgbm90IHBlcmZlY3QgYW5kIGlzIG1vcmUgb2YgYSBQb0MgKGUuZy4gaXQgPGk+YWx3
YXlzPC9pPiZuYnNwO3NhdmVzIHRoZSByZXN1bHRzIGFuZCB0aGUgZXhjZXB0aW9ucyBpbiBmYW5P
dXQgbW9kLCBhbmQgPGk+bmV2ZXI8L2k+Jm5ic3A7aW4gZmFuSW4gbW9kLCBhcGFydCBtYXliZSBm
cm9tIHRoZSBsYXN0IHRhc2sgZmluaXNoZWQpLCBhbHNvIGFwYXJ0IGZyb20gaGVhdnkgcGlwZS1s
aW5lcyBJIHByZWZlciB0byBub3QgdXNlIHRoaXMgc3R5bGUgb2YgY29kaW5nLCBzbyBJIG5ldmVy
IGFjdHVhbGx5IHBsYW5uZWQgdG8gcHJvbW90ZSB0aGlzIGZyb20gUG9DLjwvZGl2PjxkaXY+PGJy
PjwvZGl2PjxkaXY+VG8gaGFuZGxlIHNpdHVhdGlvbnMgbGlrZSB5b3UgZGVzY3JpYmVkIEkmbmJz
cDttYWRlIHRoZSBgZmFuSW5gIG1vZCwgd2hpY2ggYmFzaWNhbGx5IGp1c3QgcnVucyByZXBlYXRl
ZGx5IHRpbGwgdGhlIGBleGl0YCBjb25kaXRpb24gaXMgbWV0IG9yIGlzIGNhbGxlZCB0byBleGl0
IGZyb20gb25lIG9mIHRoZSBzdWJ0YXNrcyBpbiBjcmVhdGVzOjwvZGl2PjxkaXY+YGBgamF2YTwv
ZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoODAsIDAsIDgwKTsiPlN0cnVjdHVyZWRU
YXNrLnN0cmVhbUJ1aWxkZXIoKSAvLyBpbiBhY3R1YWxpdHkgaXQgaXMgbm90IHBhcnQgb2YgIjwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYig4MCwgMCwgODApOyI+U3RydWN0dXJlZFRhc2si
PC9zcGFuPjxicj48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDgwLCAwLCA4MCk7
Ij4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsuZmxhdEZhbkluKCgpIC0mZ3Q7IHNlcnZlclNvY2tldC5hY2NlcHQoKSk8
L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYig4MCwgMCwgODApOyI+Jm5i
c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz
cDsgJm5ic3A7LmV4aXQoKGNvdW50LCB0aW1lLCBhYnNvbHV0ZVRpbWUpIC0mZ3Q7IC4uLikgLy8g
Y291bnQgaXMgdGhlIG51bWJlciBvZiAiZXZlbnRzIiBmaXJlZCwgInRpbWUiIGlzIHRpbWUgc2lu
Y2UgbGFzdCAiZXZlbnQiLCAiYWJzb2x1dGVUaW1lIiBpcyB0aW1lIHNpbmNlIGVudGVyaW5nICJm
YW5JbiIgbW9kPC9zcGFuPjxicj48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDgw
LCAwLCA4MCk7Ij4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz
cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsuZm9yayhjdHggLSZndDsgLi4uKSAvL2luICJmYW5JbiIg
bW9kIGZvcmsgaGFzIGEgImNvbnRleHQiIG9mIHRoZSBtb2QsIHdoaWNoIGFsbG93cyBhbiBpbmRp
dmlkdWFsJm5ic3A7dGFzayB0byBhY2Nlc3MgaXQncyBgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjogcmdiKDgwLCAwLCA4MCk7Ij5jb3VudCwgdGltZSwgYWJzb2x1dGVUaW1lYCBhcyB3ZWxsIGFz
IGV4aXRpbmcgdGhlIG1vZDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYig4MCwgMCwgODAp
OyI+PGJyPjwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDgwLCAwLCA4
MCk7Ij4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i
c3A7ICZuYnNwOyAmbmJzcDsuam9pbkFsbCgpPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdi
KDgwLCAwLCA4MCk7Ij48YnI+PC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImNvbG9yOiBy
Z2IoODAsIDAsIDgwKTsiPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOy5zdGFydCgpOyAvLyBlbXB0eSBzdHJlYW0sIGJl
Y2F1c2UgaXQgaXMgZmFuSW4gbW9kPC9zcGFuPjwvZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj48YnI+
PC9kaXY+PGRpdj4mZ3Q7IEFuZCBhbHNvIGNvbXBhcmUgaG93IHBhcnRpY3VsYXIgY2FzZXMgd291
bGQgY29tcGFyZSBhZ2FpbnN0IGBTdHJlYW1gLCBiZWNhdXNlIHlvdXIgZXhhbXBsZSBsb29rcyBs
aWtlIG1vcmUgb2YgYSBjYW5kaWRhdGUgb2YgcGFyYWxsZWwgYFN0cmVhbWA8L2Rpdj48ZGl2Pjxi
cj48L2Rpdj48ZGl2Pkl0IGlzIGEgc2ltaWxhciBBUEkgdG8gYSBzdHJlYW0sIGl0IGlzIGFsc28g
c3RydWN0dXJlZCBjb25jdXJyZW5jeS48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pkl0IGFsc28g
aGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBwYXJhbGxlbCBzdHJlYW0gYXBhcnQgZnJvbSB0aGUgc2lt
aWxhciBmdW5jdGlvbiBjYWxsIGNoYWluaW5nLCB0aGUgc2VtYW50aWNzIG9mICJwYXJhbGxlbCBz
dHJlYW0iIGluIEphdmEgaXMgdGhhdCB0aGUgcGFyYWxsZWxpc20gd29ya3MgdG9nZXRoZXIgaW4g
Y29tcGxldGluZyBhIHRyYW5zZm9ybWF0aW9uIG9uIHRoZSBpbnB1dCAoYXMgZXZpZGVuY2VkJm5i
c3A7YnkgdGhlIGA8c3BhbiBzdHlsZT0iY29sb3I6IHJnYig1MywgNTYsIDUxKTsgZm9udC1mYW1p
bHk6ICZxdW90O0RlamFWdSBTYW5zIE1vbm8mcXVvdDssIG1vbm9zcGFjZTsgZm9udC1zaXplOiAx
NHB4OyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7Ij5yZWR1Y2VgYW5kIGA8L3NwYW4+Y29sbGVjdGAg
bWV0aG9kcyksIGFuZCBpbiBnZW5lcmFsIGluIHRoZSBgU3RyZWFtYCBpbnRlcmZhY2UgdGhlcmUg
YXJlIGEgbG90IG9mIG1ldGhvZHMgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHRoZSBTdHJ1
Y3R1cmVkVGFza1N0cmVhbTwvZGl2PjwvZGl2Pjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+
PGRpdiBkaXI9Imx0ciIgY2xhc3M9ImdtYWlsX2F0dHIiPk9uIEZyaSwgTWF5IDE5LCAyMDIzIGF0
IDEwOjQz4oCvUE0gQXR0aWxhIEtlbGVtZW4gJmx0O2F0dGlsYS5rZWxlbWVuODVAZ21haWwuY29t
Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHls
ZT0ibWFyZ2luOiAwcHggMHB4IDBweCAwLjhleDsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCByZ2Io
MjA0LCAyMDQsIDIwNCk7IHBhZGRpbmctbGVmdDogMWV4OyI+Jmd0Ozxicj4KJmd0OyBBdHRpbGEg
KGFuZCBzdGlsbCBFcmljKTxicj4KJmd0OyBJdCBzZWVtcyBsaWtlIGJvdGggb2YgeW91IGRvbuKA
mXQgbGlrZSB0aGUgVFdSIHBhcnQsIGJ1dCBJIGZpbmQgaXQgZXh0cmVtZWx5IG5pY2UgdG8gaGF2
ZSwgYW5kIGEgbG90IG9mIHRpbWVzIHByZWZlciBpdCBvdmVyIGEgbGFtYmRhIGFyZ3VtZW50Ljxi
cj4KJmd0OyBUV1IgYWxsb3dzIHVzIHRvIHByb3BhZ2F0ZSBjaGVja2VkIGV4Y2VwdGlvbnMsIHdo
aWNoIHRpbGwgd2UgYWRkIHVuaW9uLXR5cGVzIGluIGdlbmVyaWMgbGV2ZWxzIGlzIGltcG9zc2li
bGUgdG8gZG8gd2l0aCBsYW1iZGFzLCBhbmQgaXQgZG9lc27igJl0IGhhdmUgdGhlIChqdXN0aWZp
ZWQpIHJlc3RyaWN0aW9ucyBvZiBsYW1iZGFzLjxicj4KPGJyPgpJJ20gbm90IHJlYWxseSBhZ2Fp
bnN0IGhhdmluZyB0aGUgVFdSIHdheSBhdmFpbGFibGUgYXMgYSBsb3cgbGV2ZWw8YnI+CmNvbnN0
cnVjdCwgSSBqdXN0IGxpa2UgdG8gaGF2ZSB0aGVzZSBsYW1iZGEgYmxvY2tzIGFzIHV0aWxpdHkg
dG8gd2hpY2g8YnI+CnlvdSByZXNvcnQgdG8gKGFsdGhvdWdoIHRiaCwgaXQgaXMgYSBiaXQgc3Ry
YW5nZSB0aGF0IHNjb3BlZCB2YWx1ZXM8YnI+CmdpdmUgeW91IGxhbWJkYSBibG9jayBvbmx5LCB3
aGlsZSBTVFMgb25seSBUV1IpLiBPZiBjb3Vyc2UsIGNoZWNrZWQ8YnI+CmV4Y2VwdGlvbnMgYXJl
IGEgbmlnaHRtYXJlIGluIHRoZXNlIGNvbnN0cnVjdHMsIGFuZCB0aGF0IGlzIHdoeSBJPGJyPgp1
c3VhbGx5IGhhdmUgYFVuc2FmZUZ1bmN0aW9uJmx0O1QsIEUgZXh0ZW5kcyBUaHJvd2FibGUmZ3Q7
YCAoYW5kIGl0czxicj4KZ2F6aWxsaW9uIHNpYmxpbmdzKSBhcm91bmQgKGFuZCBJJ20gcHJldHR5
IHN1cmUgdGhlcmUgYXJlIG1hbnktbWFueTxicj4KcGVvcGxlIGNyZWF0aW5nIHRoZWlyIG93biAi
VW5zYWZlIiBmdW5jdGlvbiBpbnRlcmZhY2VzKS4gSW4gYW4gaWRlYTxicj4Kd29ybGQgd2UgY291
bGQgaGF2ZSBjb25zdHJ1Y3RzIHNpbWlsYXIgdG8gS290bGluJ3MgaW5saW5lIGZ1bmN0aW9ucyw8
YnI+CndoaWNoIHdvdWxkIHNvbHZlIHRoaXMgaXNzdWUgKGZpbmdlcnMgY3Jvc3NlZCBmb3IgaXQg
OikpPGJyPgo8YnI+CiZndDs8YnI+CiZndDsgdmFyIHJlc3VsdHMgPSBTdHJ1Y3R1cmVkVGFzay5T
dHJlYW1CdWlsZGVyKCk8YnI+CiZndDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAudmFsdWUmbHQ7U3RyaW5nJmd0Oygi
VVNFUk5BTUUiLCAiZHVrZSIpPGJyPgomZ3Q7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu
YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i
c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgLmZsYXRGb3JrKCgpIC0mZ3Q7
IFN0cmVhbS5vZih3b3JrZXJzKSk8YnI+CiZndDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm
bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAuam9pbigpPGJyPgomZ3Q7
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm
bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu
YnNwOyAmbmJzcDsgLnRocm93SWZGYWlsZWQoKSAvLyAiU3RydWN0dXJlZFRhc2suU3RyZWFtIiBk
b2Vzbid0IG5lZWQgYSAic3RyYXRlZ3kiIGJlY2F1c2UgaXQgZXhwb3NlcyBmdW5jdGlvbnMgbGlr
ZSB0aGlzIGluc3RlYWQ8YnI+CiZndDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAubWFwKFN1YnRhc2s6OmdldCkgLy8g
InN0cnVjdHVyZWQiIGNvbWVzIGludG8gcGxheSBoZXJlLCB5b3UgY2FuJ3QgY2FsbCB0ZXJtaW5h
dGluZyBvcGVyYXRvcnMgd2l0aG91dCBmaXJzdCBjYWxsaW5nICJqb2luIjxicj4KJmd0OyZuYnNw
OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7IC50b0xpc3QoKTs8YnI+CiZndDs8YnI+Cjxicj4KVGhpcyBjb3VsZCBiZSBuaWNlIGFj
dHVhbGx5LCBidXQgSSB3b3VsZCBqdXN0IGNyZWF0ZSBzb21ldGhpbmcgbGlrZTxicj4KdGhpcyBv
biB0b3Agb2YgU1RTLCBzaW5jZSBhbiBBUEkgbGlrZSB0aGlzIGNvdWxkIGVhc2lseSBlbmQgdXAg
d2l0aDxicj4KdW53YW50ZWQgbGltaXRhdGlvbi4gSWYgeW91IGhhdmUgYSB3b3JraW5nIGltcGxl
bWVudGF0aW9uIG9mIHNvbWV0aGluZzxicj4KbGlrZSB0aGlzLCBJIHdvdWxkIGJlIGN1cmlvdXMg
dG8gc2VlIGl0LiBUaG91Z2ggSSBzdXNwZWN0IGFuIGFjdHVhbDxicj4KaW1wbGVtZW50YXRpb24g
aGFzIHRvIGdvIHRocm91Z2ggc29tZSBpdGVyYXRpb25zIChhdCBsZWFzdCwgd2hlbiBJJ208YnI+
CmRlc2lnbmluZyBBUElzIGxpa2UgdGhpcywgSSBhbHdheXMgaGF2ZSB0byBzZXJpb3VzbHkgcmV2
aWV3IG15PGJyPgpvcmlnaW5hbCBpZGVhKS4gSW4gdGhpcyBpZGVhIC0gZm9yIGV4YW1wbGUgLSBJ
IGNhbid0IHNlZSBob3cgeW91IHdvdWxkPGJyPgpkbyBhIGNvbmRpdGlvbmFsIHRlcm1pbmF0aW9u
IG9mIHN0YXJ0aW5nIG5ldyB3b3JrZXJzIGluIGEgbG9vcC4gRm9yPGJyPgpleGFtcGxlLCBpZiB0
aGlzIHdhcyBhIHNlcnZlciB3YWl0aW5nIGZvciBUQ1AgY29ubmVjdGlvbnMsIGFuZCB0aGVuIGl0
PGJyPgpuZWVkZWQgdG8gZm9yayBuZXcgdGFza3MgZm9yIGVhY2ggaW5jb21pbmcgY29ubmVjdGlv
biwgSSdtIG5vdCBzdXJlPGJyPgpob3cgdGhhdCB3b3VsZCBsb29rLiBBbmQgYWxzbyBjb21wYXJl
IGhvdyBwYXJ0aWN1bGFyIGNhc2VzIHdvdWxkPGJyPgpjb21wYXJlIGFnYWluc3QgYFN0cmVhbWAs
IGJlY2F1c2UgeW91ciBleGFtcGxlIGxvb2tzIGxpa2UgbW9yZSBvZiBhPGJyPgpjYW5kaWRhdGUg
b2YgcGFyYWxsZWwgYFN0cmVhbWAuPGJyPgo8L2Jsb2NrcXVvdGU+PC9kaXY+PGJyIGNsZWFyPSJh
bGwiPjxkaXY+PGJyPjwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div><span class="gmail_signature_prefix markdown-here-signature">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr">Holo The Wise Wolf Of Yoitsu</div></div></div>