<feed xmlns='http://www.w3.org/2005/Atom'>
<title>otp.git/lib/compiler/src, branch OTP-18.3.4.3</title>
<subtitle>Mirror of Erlang/OTP repository.
</subtitle>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/'/>
<entry>
<title>Eliminate crash because of unsafe delaying of sub-binary creation</title>
<updated>2016-02-08T07:08:55+00:00</updated>
<author>
<name>Björn Gustavsson</name>
<email>bjorn@erlang.org</email>
</author>
<published>2016-02-08T06:06:31+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=abde1d03db03536af19fdb274f1119bbfaba262b'/>
<id>abde1d03db03536af19fdb274f1119bbfaba262b</id>
<content type='text'>
The following code would fail to compile:

decode(&lt;&lt;Code/integer, Bin/binary&gt;&gt;) -&gt;
    &lt;&lt;C1/integer, B1/binary&gt;&gt; = Bin,
    case C1 of
	X when X =:= 1 orelse X =:= 2 -&gt;
	    Bin2 = &lt;&lt;&gt;&gt;;
	_ -&gt;
	    Bin2 = B1
    end,
    case Code of
	1 -&gt; decode(Bin2);
	_ -&gt; Bin2
    end.

The error message would be:

t: function decode/1+28:
  Internal consistency check failed - please report this bug.
  Instruction: return
  Error:       {match_context,{x,0}}:

The beam_bsm pass would delay the creation of a sub-binary when it was
unsafe to do so. The culprit was the btb_follow_branch/3 function that
for performance reasons cached labels that had already been checked.
The problem was the safety of a label also depends on the contents
of the registers. Therefore, the key for caching needs to be both
the label and the register contents.

Reported-by: José Valim
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The following code would fail to compile:

decode(&lt;&lt;Code/integer, Bin/binary&gt;&gt;) -&gt;
    &lt;&lt;C1/integer, B1/binary&gt;&gt; = Bin,
    case C1 of
	X when X =:= 1 orelse X =:= 2 -&gt;
	    Bin2 = &lt;&lt;&gt;&gt;;
	_ -&gt;
	    Bin2 = B1
    end,
    case Code of
	1 -&gt; decode(Bin2);
	_ -&gt; Bin2
    end.

The error message would be:

t: function decode/1+28:
  Internal consistency check failed - please report this bug.
  Instruction: return
  Error:       {match_context,{x,0}}:

The beam_bsm pass would delay the creation of a sub-binary when it was
unsafe to do so. The culprit was the btb_follow_branch/3 function that
for performance reasons cached labels that had already been checked.
The problem was the safety of a label also depends on the contents
of the registers. Therefore, the key for caching needs to be both
the label and the register contents.

Reported-by: José Valim
</pre>
</div>
</content>
</entry>
<entry>
<title>compiler, hipe: Fix pretty printing of Core Maps</title>
<updated>2016-01-14T13:54:37+00:00</updated>
<author>
<name>Björn-Egil Dahlberg</name>
<email>egil@erlang.org</email>
</author>
<published>2016-01-14T12:10:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=48e25dfef23a51d02629b2c9fa9963fd3ba7788c'/>
<id>48e25dfef23a51d02629b2c9fa9963fd3ba7788c</id>
<content type='text'>
Literal maps could cause dialyzer to crash when pretty printing the results.

Reported-by: Chris McGrath &lt;chris@chrismcg.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Literal maps could cause dialyzer to crash when pretty printing the results.

Reported-by: Chris McGrath &lt;chris@chrismcg.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix crash when attempting to update a fun as if it were a map</title>
<updated>2016-01-12T09:06:02+00:00</updated>
<author>
<name>Björn Gustavsson</name>
<email>bjorn@erlang.org</email>
</author>
<published>2016-01-11T14:58:57+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=ff2ef4278045c985738e3ddb4af6127c7db933e7'/>
<id>ff2ef4278045c985738e3ddb4af6127c7db933e7</id>
<content type='text'>
The following example would cause an internal consistency
failure in the compiler:

  f() -&gt; ok.
  update() -&gt; (fun f/0)#{u =&gt; 42}.

The reason is that internally, v3_core will (incorrectly)
rewrite update/0 to code similar to this:

  update() -&gt;
    if
      is_map(fun f/0) -&gt;
        maps:update(u, 42, fun f/0)
  end.

Since funs are not allowed to be created in guards, incorrect and
unsafe code would be generated.

It is easy to fix the bug. There already is a is_valid_map_src/1
function in v3_core that tests whether the argument for the map update
operation can possibly be a valid map. A fun is represented as a
variable with a special name in Core Erlang, so it would not be
recognized as unsafe. All we'll need to do to fix the bug is to look
closer at variables to ensure they don't represent funs. That will
ensure that the code is rewritten in the correct way:

  update() -&gt;
    error({badmap,fun f/0})
  end.

Reported-by: Thomas Arts
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The following example would cause an internal consistency
failure in the compiler:

  f() -&gt; ok.
  update() -&gt; (fun f/0)#{u =&gt; 42}.

The reason is that internally, v3_core will (incorrectly)
rewrite update/0 to code similar to this:

  update() -&gt;
    if
      is_map(fun f/0) -&gt;
        maps:update(u, 42, fun f/0)
  end.

Since funs are not allowed to be created in guards, incorrect and
unsafe code would be generated.

It is easy to fix the bug. There already is a is_valid_map_src/1
function in v3_core that tests whether the argument for the map update
operation can possibly be a valid map. A fun is represented as a
variable with a special name in Core Erlang, so it would not be
recognized as unsafe. All we'll need to do to fix the bug is to look
closer at variables to ensure they don't represent funs. That will
ensure that the code is rewritten in the correct way:

  update() -&gt;
    error({badmap,fun f/0})
  end.

Reported-by: Thomas Arts
</pre>
</div>
</content>
</entry>
<entry>
<title>Eliminate crash in v3_codegen</title>
<updated>2016-01-11T13:37:44+00:00</updated>
<author>
<name>Björn Gustavsson</name>
<email>bjorn@erlang.org</email>
</author>
<published>2016-01-07T14:25:26+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=f0bc967c38d8859ff794e93082e9d2fb495f34d3'/>
<id>f0bc967c38d8859ff794e93082e9d2fb495f34d3</id>
<content type='text'>
The following code would crash v3_codegen:

  order(From) -&gt;
    catch
     if
      From#{[] =&gt; sufficient} -&gt;
       saint
     end.

Before explaining the crash, first some background on the stack
frame and the Y registers.

Certain instructions, most notably the 'call' instructions, clobber
all X registers. Before any such instruction, all X registers that
have values that will be used after the call must be saved to Y
registers (i.e. to the stack frame). adjust_stack/4 will be called
when X registers must be saved.

There is also another situation when X registers must be saved, namely
within a 'catch' if we are about to execute any instruction that may
cause an exception. Examples of such instructions are some guard BIFs
(such as length/1) and construction of binaries or maps.  Within a
'catch', X registers must be be saved because if an exception is
thrown and catched all X registers will be destroyed.  The same
adjust_stack/4 function will be called for those instructions, but
only if they occur within a 'catch'.

There is actually one more complication. If there is code in
a guard within a catch, the X registers should not be saved, because
the code in a guard never clobbers any X registers that were alive
before the guard code was entered. v3_codegen is written with the
implicit assumption that code in guards never cause anything
to be saved to Y registers.

The code for building maps and binaries would incorrectly save X
registers within a guard inside a 'catch'.

For construction of binaries, that would mean that a useless but
harmelss 'move' instruction was generated.

But for construction of maps, the saving of the Y register would not
be harmless. There would be a crash when attempting to merge #sr{}
records. #sr{} records keeps track of the contents of X and Y
registers. When two separate code paths are joined (e.g. at the end of
'case' statement), the register descriptors must be reconciled.

Basically, the register descriptors for both paths must be identical.
The #sr{} record for one path must not claim that {y,0} contains
a certain value, while another path claims that {y,0} is dead.

Thus, the crash occurs in sr_merge/2 when failing to reconcile the
Y registers.

To fix this bug this bug we will introduce a new function called
maybe_adjust_stack/5. It will save X registers on the stack only
if the code is inside a catch but not inside a guard. We will
change all existing code to use this new function when appropriate.

Reported-by: Thomas Arts
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The following code would crash v3_codegen:

  order(From) -&gt;
    catch
     if
      From#{[] =&gt; sufficient} -&gt;
       saint
     end.

Before explaining the crash, first some background on the stack
frame and the Y registers.

Certain instructions, most notably the 'call' instructions, clobber
all X registers. Before any such instruction, all X registers that
have values that will be used after the call must be saved to Y
registers (i.e. to the stack frame). adjust_stack/4 will be called
when X registers must be saved.

There is also another situation when X registers must be saved, namely
within a 'catch' if we are about to execute any instruction that may
cause an exception. Examples of such instructions are some guard BIFs
(such as length/1) and construction of binaries or maps.  Within a
'catch', X registers must be be saved because if an exception is
thrown and catched all X registers will be destroyed.  The same
adjust_stack/4 function will be called for those instructions, but
only if they occur within a 'catch'.

There is actually one more complication. If there is code in
a guard within a catch, the X registers should not be saved, because
the code in a guard never clobbers any X registers that were alive
before the guard code was entered. v3_codegen is written with the
implicit assumption that code in guards never cause anything
to be saved to Y registers.

The code for building maps and binaries would incorrectly save X
registers within a guard inside a 'catch'.

For construction of binaries, that would mean that a useless but
harmelss 'move' instruction was generated.

But for construction of maps, the saving of the Y register would not
be harmless. There would be a crash when attempting to merge #sr{}
records. #sr{} records keeps track of the contents of X and Y
registers. When two separate code paths are joined (e.g. at the end of
'case' statement), the register descriptors must be reconciled.

Basically, the register descriptors for both paths must be identical.
The #sr{} record for one path must not claim that {y,0} contains
a certain value, while another path claims that {y,0} is dead.

Thus, the crash occurs in sr_merge/2 when failing to reconcile the
Y registers.

To fix this bug this bug we will introduce a new function called
maybe_adjust_stack/5. It will save X registers on the stack only
if the code is inside a catch but not inside a guard. We will
change all existing code to use this new function when appropriate.

Reported-by: Thomas Arts
</pre>
</div>
</content>
</entry>
<entry>
<title>beam_bool: Fix unsafe optimization</title>
<updated>2016-01-07T12:48:59+00:00</updated>
<author>
<name>Björn Gustavsson</name>
<email>bjorn@erlang.org</email>
</author>
<published>2015-12-17T13:50:43+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=7c72e25926e153811ff099057bea649afa0be376'/>
<id>7c72e25926e153811ff099057bea649afa0be376</id>
<content type='text'>
beam_bool would make the following code unsafe (which would be
reported by beam_validator):

scotland(Echo) -&gt;
  found(case Echo of
	    Echo when true; Echo, Echo, Echo -&gt;
		Echo;
	    echo -&gt;
		[]
	end,
	Echo = placed).

found(_, _) -&gt; million.

Basically, beam_bool would see that the 'case' would always return
the value of Echo. Thus:

scotland(Echo) -&gt;
  found(Echo, Echo = placed).

The only problem is that beam_bool would also remove a 'move'
instruction that would save Echo to the stack. Here is the
assembly code for part of the function:

    {allocate_zero,1,1}.

    {move,{x,0},{y,0}}.           %% Save Echo on stack.

    {bif,'=:=',{f,7},[{x,0},{atom,true}],{x,1}}.
    {bif,'=:=',{f,7},[{x,0},{atom,true}],{x,2}}.
    {bif,'=:=',{f,7},[{x,0},{atom,true}],{x,3}}.
    {bif,'and',{f,7},[{x,2},{x,3}],{x,2}}.
    {bif,'and',{f,7},[{x,1},{x,2}],{x,1}}.
    {jump,{f,8}}.

  {label,7}.
    {move,{atom,false},{x,1}}.

  {label,8}.
    {bif,'or',{f,6},[{atom,true},{x,1}],{x,1}}.
    {test,is_eq_exact,{f,6},[{x,1},{atom,true}]}. %% Jump never taken.

    {jump,{f,5}}.

  {label,6}.
    {test,is_eq_exact,{f,9},[{x,0},{atom,echo}]}.
    {move,nil,{x,0}}.
    {jump,{f,5}}.
  {label,9}.
    {test_heap,3,0}.
    {put_tuple,2,{x,0}}.
    {put,{atom,case_clause}}.
    {put,{y,0}}.
    {line,[{location,"t.erl",5}]}.
    {call_ext,1,{extfunc,erlang,error,1}}.
    {jump,{f,5}}.

  {label,5}.
    {test,is_eq_exact,{f,12},[{atom,placed},{y,0}]}.

beam_bool would see that the is_eq_exact test at label 8 would
always succeed. It could therefore remove most of the code before
the jump to label 5. Unfortunately it also removed the essential
move of Echo to the stack:

    {allocate_zero,1,1}.

    %% Instruction incorrectly removed: {move,{x,0},{y,0}}.

    {jump,{f,5}}.

  {label,5}.
    {test,is_eq_exact,{f,12},[{atom,placed},{y,0}]}.

The root cause of the problem is that the 'move' instruction is
included in the block of 'bif' instructions before label 8.
Normally the 'move' instruction would not have been discarded,
but because the left operand to the 'or' BIF is 'true', the
entire block with 'bif' instructions are dropped.

As far as I can see, there is no gain by including 'move'
instructions in the first place. There is no way that better
code will be produced. In fact, the entire optimization can
be given up if 'move' instructions are found in the block.

Thus we can fix this bug by never including any 'move' instructions
in the block of 'bif' instructions. We can also remove all the
code that deals with 'move' instructions within blocks.

Reported-by: Thomas Arts
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
beam_bool would make the following code unsafe (which would be
reported by beam_validator):

scotland(Echo) -&gt;
  found(case Echo of
	    Echo when true; Echo, Echo, Echo -&gt;
		Echo;
	    echo -&gt;
		[]
	end,
	Echo = placed).

found(_, _) -&gt; million.

Basically, beam_bool would see that the 'case' would always return
the value of Echo. Thus:

scotland(Echo) -&gt;
  found(Echo, Echo = placed).

The only problem is that beam_bool would also remove a 'move'
instruction that would save Echo to the stack. Here is the
assembly code for part of the function:

    {allocate_zero,1,1}.

    {move,{x,0},{y,0}}.           %% Save Echo on stack.

    {bif,'=:=',{f,7},[{x,0},{atom,true}],{x,1}}.
    {bif,'=:=',{f,7},[{x,0},{atom,true}],{x,2}}.
    {bif,'=:=',{f,7},[{x,0},{atom,true}],{x,3}}.
    {bif,'and',{f,7},[{x,2},{x,3}],{x,2}}.
    {bif,'and',{f,7},[{x,1},{x,2}],{x,1}}.
    {jump,{f,8}}.

  {label,7}.
    {move,{atom,false},{x,1}}.

  {label,8}.
    {bif,'or',{f,6},[{atom,true},{x,1}],{x,1}}.
    {test,is_eq_exact,{f,6},[{x,1},{atom,true}]}. %% Jump never taken.

    {jump,{f,5}}.

  {label,6}.
    {test,is_eq_exact,{f,9},[{x,0},{atom,echo}]}.
    {move,nil,{x,0}}.
    {jump,{f,5}}.
  {label,9}.
    {test_heap,3,0}.
    {put_tuple,2,{x,0}}.
    {put,{atom,case_clause}}.
    {put,{y,0}}.
    {line,[{location,"t.erl",5}]}.
    {call_ext,1,{extfunc,erlang,error,1}}.
    {jump,{f,5}}.

  {label,5}.
    {test,is_eq_exact,{f,12},[{atom,placed},{y,0}]}.

beam_bool would see that the is_eq_exact test at label 8 would
always succeed. It could therefore remove most of the code before
the jump to label 5. Unfortunately it also removed the essential
move of Echo to the stack:

    {allocate_zero,1,1}.

    %% Instruction incorrectly removed: {move,{x,0},{y,0}}.

    {jump,{f,5}}.

  {label,5}.
    {test,is_eq_exact,{f,12},[{atom,placed},{y,0}]}.

The root cause of the problem is that the 'move' instruction is
included in the block of 'bif' instructions before label 8.
Normally the 'move' instruction would not have been discarded,
but because the left operand to the 'or' BIF is 'true', the
entire block with 'bif' instructions are dropped.

As far as I can see, there is no gain by including 'move'
instructions in the first place. There is no way that better
code will be produced. In fact, the entire optimization can
be given up if 'move' instructions are found in the block.

Thus we can fix this bug by never including any 'move' instructions
in the block of 'bif' instructions. We can also remove all the
code that deals with 'move' instructions within blocks.

Reported-by: Thomas Arts
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix missing filename and line number in warning</title>
<updated>2015-11-20T13:24:57+00:00</updated>
<author>
<name>Björn Gustavsson</name>
<email>bjorn@erlang.org</email>
</author>
<published>2015-11-19T11:13:21+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=d4bb044cb5359c6d4bffe3efcb8256cf7199bdf3'/>
<id>d4bb044cb5359c6d4bffe3efcb8256cf7199bdf3</id>
<content type='text'>
When the 'bin_opt_info' is given, warnings without filenames
and line numbers could sometimes be produced:

  no_file: Warning: INFO: matching non-variables after
  a previous clause matching a variable will prevent delayed
  sub binary optimization

The reason for the missing information is that #c_alias{} records lack
location information. There are several ways to fix the problem. The
easiest seems to be to get the location information from the
code).

Noticed-by: José Valim
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When the 'bin_opt_info' is given, warnings without filenames
and line numbers could sometimes be produced:

  no_file: Warning: INFO: matching non-variables after
  a previous clause matching a variable will prevent delayed
  sub binary optimization

The reason for the missing information is that #c_alias{} records lack
location information. There are several ways to fix the problem. The
easiest seems to be to get the location information from the
code).

Noticed-by: José Valim
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix cerl_trees:label/2 bug with map K/V swap</title>
<updated>2015-10-26T14:37:39+00:00</updated>
<author>
<name>Magnus Lång</name>
<email>margnus1@telia.com</email>
</author>
<published>2014-06-05T10:12:03+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=cc1026a0e646b3a21b7bd7930fb7294425f1d79b'/>
<id>cc1026a0e646b3a21b7bd7930fb7294425f1d79b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'c-rack/fix-typo3' into maint</title>
<updated>2015-09-11T08:17:10+00:00</updated>
<author>
<name>Zandra</name>
<email>zandra@erlang.org</email>
</author>
<published>2015-09-11T08:17:10+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=6fd0f00a4a5420621d5a12c28024a1f21fe8e14d'/>
<id>6fd0f00a4a5420621d5a12c28024a1f21fe8e14d</id>
<content type='text'>
* c-rack/fix-typo3:
  Fix typo in call_last/3 spec
  Fix typo
  Fix typo: message to send is in x(1) not x(0)
  Fix another small typo
  Fix typo
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* c-rack/fix-typo3:
  Fix typo in call_last/3 spec
  Fix typo
  Fix typo: message to send is in x(1) not x(0)
  Fix another small typo
  Fix typo
</pre>
</div>
</content>
</entry>
<entry>
<title>compiler: Fix get_map_elements register corruption</title>
<updated>2015-09-04T15:58:03+00:00</updated>
<author>
<name>Björn-Egil Dahlberg</name>
<email>egil@erlang.org</email>
</author>
<published>2015-08-31T14:07:46+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=d0784035abb22f4f385c8a8737a7b15c3741bbca'/>
<id>d0784035abb22f4f385c8a8737a7b15c3741bbca</id>
<content type='text'>
Instruction get_map_elements might destroy target registers when the fail-label is taken.
Only seen for patterns with two, and only two, target registers.
Specifically: we copy one register, and then jump.

    foo(A,#{a := V1, b := V2}) -&gt; ...
    foo(A,#{b := V}) -&gt; ...

call foo(value, #{a=&gt;whops, c=&gt;42}).

corresponding assembler:

    {test,is_map,{f,5},[{x,1}]}.

    {get_map_elements,{f,7},{x,1},{list,[{atom,a},{x,1},{atom,b},{x,2}]}}.
    %% if 'a' exists but not 'b' {x,1} is overwritten, jump {f,7}

    {move,{integer,1},{x,0}}.
    {call_only,3,{f,10}}.
    {label,7}.

    {get_map_elements,{f,8},{x,1},{list,[{atom,b},{x,2}]}}.
    %% {x,1} (src) is read with a corrupt value

    {move,{x,0},{x,1}}.
    {move,{integer,2},{x,0}}.
    {call_only,3,{f,10}}.

The fix is to remove 'opt_moves' pass for get_map_elements instruction
in the case of two or more destinations.

Reported-by: Valery Tikhonov
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Instruction get_map_elements might destroy target registers when the fail-label is taken.
Only seen for patterns with two, and only two, target registers.
Specifically: we copy one register, and then jump.

    foo(A,#{a := V1, b := V2}) -&gt; ...
    foo(A,#{b := V}) -&gt; ...

call foo(value, #{a=&gt;whops, c=&gt;42}).

corresponding assembler:

    {test,is_map,{f,5},[{x,1}]}.

    {get_map_elements,{f,7},{x,1},{list,[{atom,a},{x,1},{atom,b},{x,2}]}}.
    %% if 'a' exists but not 'b' {x,1} is overwritten, jump {f,7}

    {move,{integer,1},{x,0}}.
    {call_only,3,{f,10}}.
    {label,7}.

    {get_map_elements,{f,8},{x,1},{list,[{atom,b},{x,2}]}}.
    %% {x,1} (src) is read with a corrupt value

    {move,{x,0},{x,1}}.
    {move,{integer,2},{x,0}}.
    {call_only,3,{f,10}}.

The fix is to remove 'opt_moves' pass for get_map_elements instruction
in the case of two or more destinations.

Reported-by: Valery Tikhonov
</pre>
</div>
</content>
</entry>
<entry>
<title>compiler: Add extra checks for get_map_elements in validator</title>
<updated>2015-09-04T15:57:57+00:00</updated>
<author>
<name>Björn-Egil Dahlberg</name>
<email>egil@erlang.org</email>
</author>
<published>2015-08-31T14:07:02+00:00</published>
<link rel='alternate' type='text/html' href='http://git.ninenines.eu/otp.git/commit/?id=c9bbba0db169ece606b02162057e4681b8fb1ce4'/>
<id>c9bbba0db169ece606b02162057e4681b8fb1ce4</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
