<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Threadpool 1.14 ... in Intel® Moderncode for Parallel Architectures</title>
    <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/Threadpool-1-14/m-p/863168#M2543</link>
    <description>&lt;SPAN style="font-size: x-small;"&gt;
&lt;P&gt;&lt;BR /&gt;Hello,&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Threadpool is very easy to use...&lt;BR /&gt;&lt;BR /&gt;Here is an example with priorities - you can&lt;BR /&gt;give&lt;SPAN style="font-family: Arial; color: #008000; font-size: x-small;"&gt;&lt;STRONG&gt;LOW_PRIORITY, &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="font-family: Arial; color: #008000; font-size: x-small;"&gt;&lt;STRONG&gt;NORMAL_PRIORITY&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="font-family: Arial; font-size: x-small;"&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="font-family: Arial; color: #008000; font-size: x-small;"&gt;&lt;STRONG&gt;and HIGH_PRIORITY -&lt;/STRONG&gt;&lt;/SPAN&gt; look attest_thread.pas&lt;BR /&gt;inside the pthreadpool.zip - that i have just wrote &lt;BR /&gt;for you, that use many workers threads..&lt;BR /&gt;&lt;BR /&gt;Note: don't forget to give some feedback...&lt;BR /&gt;&lt;BR /&gt;--------------------------------------------------------&lt;BR /&gt;&lt;BR /&gt;program test;&lt;/P&gt;
&lt;P&gt;uses&lt;/P&gt;
&lt;P&gt;{$IFDEF Delphi}&lt;/P&gt;
&lt;P&gt;cmem,&lt;/P&gt;
&lt;P&gt;{$ENDIF}&lt;/P&gt;
&lt;P&gt;PThreadPool,sysutils,windows,classes,syncobjs;&lt;/P&gt;
&lt;P&gt;type&lt;/P&gt;
&lt;P&gt;TMyThread = class (TPThreadPoolThread)&lt;/P&gt;
&lt;P&gt;//procedure ProcessRequest(obj: Pointer); override;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;procedure MyProc1(obj: Pointer);&lt;/P&gt;
&lt;P&gt;procedure MyProc2(obj: Pointer);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var hndlArr : Array[0..19] of THandle;&lt;/P&gt;
&lt;P&gt;AId:DWORD;&lt;/P&gt;
&lt;P&gt;event1,event2:TSimpleEvent;&lt;/P&gt;
&lt;P&gt;n:int64;&lt;/P&gt;
&lt;P&gt;j:integer;&lt;/P&gt;
&lt;P&gt;myobj:TMyThread;&lt;/P&gt;
&lt;P&gt;TP: TPThreadPool;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;cs:TCriticalSection;&lt;/P&gt;
&lt;P&gt;number:integer;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;procedure TMyThread.MyProc1(obj: Pointer);&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;cs.enter;&lt;/P&gt;
&lt;P&gt;inc(number);&lt;/P&gt;
&lt;P&gt;if number=8000 then event2.setevent;&lt;/P&gt;
&lt;P&gt;//writeln('This is MyProc1 with parameter: ',integer(obj));&lt;/P&gt;
&lt;P&gt;cs.leave;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;procedure TMyThread.MyProc2(obj: Pointer);&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;cs.enter;&lt;/P&gt;
&lt;P&gt;inc(number);&lt;/P&gt;
&lt;P&gt;if number=8000 then event2.setevent;&lt;/P&gt;
&lt;P&gt;//writeln('This is MyProc2 with parameter: ',integer(obj));&lt;/P&gt;
&lt;P&gt;cs.leave;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;function StartFunc1(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 1999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,obj,NORMAL_PRIORITY);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;function StartFunc2(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 1999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,obj,NORMAL_PRIORITY);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;function StartFunc3(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 1999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc2,pointer(obj),NORMAL_PRIORITY);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;function StartFunc4(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 1999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc2,pointer(obj),NORMAL_PRIORITY);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;number:=0;&lt;/P&gt;
&lt;P&gt;cs:=TCriticalSection.create;&lt;/P&gt;
&lt;P&gt;myobj:=TMyThread.create;&lt;/P&gt;
&lt;P&gt;TP := TPThreadPool.Create(4, 20, TMyThread); // 4 workers threads and 2^20 items for each queue.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;event1:=TSimpleEvent.create;&lt;/P&gt;
&lt;P&gt;event2:=TSimpleEvent.create;&lt;/P&gt;
&lt;P&gt;hndlArr[0]:=BeginThread(nil,0,@StartFunc1,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[1]:=BeginThread(nil,0,@StartFunc2,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[2]:=BeginThread(nil,0,@StartFunc3,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[3]:=BeginThread(nil,0,@StartFunc4,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;event1.setevent;&lt;/P&gt;
&lt;P&gt;WaitForMultipleObjects(4, @hndlArr, True, INFINITE);&lt;/P&gt;
&lt;P&gt;event2.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;writeln('Number is: ',number);&lt;/P&gt;
&lt;P&gt;end.&lt;BR /&gt;&lt;BR /&gt;---------------------------------------------------------&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Sincerely,&lt;BR /&gt;Amine Moulay Ramdane.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;/SPAN&gt;</description>
    <pubDate>Wed, 24 Mar 2010 13:00:23 GMT</pubDate>
    <dc:creator>aminer10</dc:creator>
    <dc:date>2010-03-24T13:00:23Z</dc:date>
    <item>
      <title>Threadpool 1.14 ...</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/Threadpool-1-14/m-p/863167#M2542</link>
      <description>&lt;P&gt;&lt;BR /&gt;Hello all,&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;I think we don't need an array of critical sections...&lt;/P&gt;
&lt;P&gt;You can download the new version 1.14 of both &lt;BR /&gt;Threadpool and Threadpool with priority from:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://pages.videotron.com/aminer/"&gt;http://pages.videotron.com/aminer/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;I have included a test_thread.pas example &lt;BR /&gt;- with many workers threads ...- .&lt;/P&gt;
&lt;P&gt;This patch avoids deadlock...&lt;/P&gt;
&lt;P&gt;TPThreadPool.execute() method have changed to...&lt;/P&gt;
&lt;P&gt;--------------------------------------------------------------------------------------------------&lt;BR /&gt;function TThreadPool.execute(func:TmyProc;const Context: Pointer): Boolean; &lt;BR /&gt;var&lt;BR /&gt;params: MyParam;&lt;BR /&gt;local_balance,local_count:integer;&lt;BR /&gt;begin&lt;BR /&gt;params:=MYParam.create;&lt;BR /&gt;params.proc:=func;&lt;BR /&gt;params.param:=context;&lt;/P&gt;
&lt;P&gt;local_balance:=LockedIncLong(balance1) mod FThreadCount;&lt;BR /&gt;local_count:=Queues[local_balance].count; &lt;BR /&gt;while not Queues[local_balance].push(TObject(params)) do;&lt;BR /&gt;if local_count=0 then events[local_balance].setevent;&lt;BR /&gt;end;&lt;/P&gt;
&lt;P&gt;---------------------------------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;Thank you for your time...&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;Sincerely,&lt;BR /&gt;Amine Moulay Ramdane.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 24 Mar 2010 12:30:13 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/Threadpool-1-14/m-p/863167#M2542</guid>
      <dc:creator>aminer10</dc:creator>
      <dc:date>2010-03-24T12:30:13Z</dc:date>
    </item>
    <item>
      <title>Threadpool 1.14 ...</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/Threadpool-1-14/m-p/863168#M2543</link>
      <description>&lt;SPAN style="font-size: x-small;"&gt;
&lt;P&gt;&lt;BR /&gt;Hello,&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Threadpool is very easy to use...&lt;BR /&gt;&lt;BR /&gt;Here is an example with priorities - you can&lt;BR /&gt;give&lt;SPAN style="font-family: Arial; color: #008000; font-size: x-small;"&gt;&lt;STRONG&gt;LOW_PRIORITY, &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="font-family: Arial; color: #008000; font-size: x-small;"&gt;&lt;STRONG&gt;NORMAL_PRIORITY&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="font-family: Arial; font-size: x-small;"&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="font-family: Arial; color: #008000; font-size: x-small;"&gt;&lt;STRONG&gt;and HIGH_PRIORITY -&lt;/STRONG&gt;&lt;/SPAN&gt; look attest_thread.pas&lt;BR /&gt;inside the pthreadpool.zip - that i have just wrote &lt;BR /&gt;for you, that use many workers threads..&lt;BR /&gt;&lt;BR /&gt;Note: don't forget to give some feedback...&lt;BR /&gt;&lt;BR /&gt;--------------------------------------------------------&lt;BR /&gt;&lt;BR /&gt;program test;&lt;/P&gt;
&lt;P&gt;uses&lt;/P&gt;
&lt;P&gt;{$IFDEF Delphi}&lt;/P&gt;
&lt;P&gt;cmem,&lt;/P&gt;
&lt;P&gt;{$ENDIF}&lt;/P&gt;
&lt;P&gt;PThreadPool,sysutils,windows,classes,syncobjs;&lt;/P&gt;
&lt;P&gt;type&lt;/P&gt;
&lt;P&gt;TMyThread = class (TPThreadPoolThread)&lt;/P&gt;
&lt;P&gt;//procedure ProcessRequest(obj: Pointer); override;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;procedure MyProc1(obj: Pointer);&lt;/P&gt;
&lt;P&gt;procedure MyProc2(obj: Pointer);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var hndlArr : Array[0..19] of THandle;&lt;/P&gt;
&lt;P&gt;AId:DWORD;&lt;/P&gt;
&lt;P&gt;event1,event2:TSimpleEvent;&lt;/P&gt;
&lt;P&gt;n:int64;&lt;/P&gt;
&lt;P&gt;j:integer;&lt;/P&gt;
&lt;P&gt;myobj:TMyThread;&lt;/P&gt;
&lt;P&gt;TP: TPThreadPool;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;cs:TCriticalSection;&lt;/P&gt;
&lt;P&gt;number:integer;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;procedure TMyThread.MyProc1(obj: Pointer);&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;cs.enter;&lt;/P&gt;
&lt;P&gt;inc(number);&lt;/P&gt;
&lt;P&gt;if number=8000 then event2.setevent;&lt;/P&gt;
&lt;P&gt;//writeln('This is MyProc1 with parameter: ',integer(obj));&lt;/P&gt;
&lt;P&gt;cs.leave;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;procedure TMyThread.MyProc2(obj: Pointer);&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;cs.enter;&lt;/P&gt;
&lt;P&gt;inc(number);&lt;/P&gt;
&lt;P&gt;if number=8000 then event2.setevent;&lt;/P&gt;
&lt;P&gt;//writeln('This is MyProc2 with parameter: ',integer(obj));&lt;/P&gt;
&lt;P&gt;cs.leave;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;function StartFunc1(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 1999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,obj,NORMAL_PRIORITY);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;function StartFunc2(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 1999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,obj,NORMAL_PRIORITY);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;function StartFunc3(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 1999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc2,pointer(obj),NORMAL_PRIORITY);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;function StartFunc4(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 1999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc2,pointer(obj),NORMAL_PRIORITY);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;number:=0;&lt;/P&gt;
&lt;P&gt;cs:=TCriticalSection.create;&lt;/P&gt;
&lt;P&gt;myobj:=TMyThread.create;&lt;/P&gt;
&lt;P&gt;TP := TPThreadPool.Create(4, 20, TMyThread); // 4 workers threads and 2^20 items for each queue.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;event1:=TSimpleEvent.create;&lt;/P&gt;
&lt;P&gt;event2:=TSimpleEvent.create;&lt;/P&gt;
&lt;P&gt;hndlArr[0]:=BeginThread(nil,0,@StartFunc1,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[1]:=BeginThread(nil,0,@StartFunc2,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[2]:=BeginThread(nil,0,@StartFunc3,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[3]:=BeginThread(nil,0,@StartFunc4,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;event1.setevent;&lt;/P&gt;
&lt;P&gt;WaitForMultipleObjects(4, @hndlArr, True, INFINITE);&lt;/P&gt;
&lt;P&gt;event2.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;writeln('Number is: ',number);&lt;/P&gt;
&lt;P&gt;end.&lt;BR /&gt;&lt;BR /&gt;---------------------------------------------------------&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Sincerely,&lt;BR /&gt;Amine Moulay Ramdane.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;/SPAN&gt;</description>
      <pubDate>Wed, 24 Mar 2010 13:00:23 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/Threadpool-1-14/m-p/863168#M2543</guid>
      <dc:creator>aminer10</dc:creator>
      <dc:date>2010-03-24T13:00:23Z</dc:date>
    </item>
  </channel>
</rss>

