Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 17921] ファイルの概要

このコミットは、Go言語のアセンブラである cmd/5a (ARM), cmd/6a (x86), cmd/8a (ARM64) において、共通のリンカライブラリである liblink を使用するように変更を加えるものです。具体的には、各アセンブラのヘッダファイル (a.h, y.tab.h)、字句解析器 (lex.c)、および構文解析器 (a.y, y.tab.c) に大幅な修正が加えられています。これにより、アセンブラのコード生成部分が liblink の共通インターフェースを利用するようになり、将来的なリンカの改善に向けた準備が行われています。

コミット

commit f7aaa553daf41f006bbc2c96d062e661be0c3501
Author: Russ Cox <rsc@golang.org>
Date:   Sun Dec 8 22:49:56 2013 -0500

    cmd/5a, cmd/6a, cmd/8a: use liblink
    
    Preparation for golang.org/s/go13linker work.
    
    This CL does not build by itself. It depends on 35740044
    and 35790044 and will be submitted at the same time.
    
    R=iant
    CC=golang-dev
    https://golang.org/cl/35830043

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/f7aaa553daf41f006bbc2c96d062e661be0c3501

元コミット内容

cmd/5a, cmd/6a, cmd/8a: use liblink

Preparation for golang.org/s/go13linker work.

This CL does not build by itself. It depends on 35740044
and 35790044 and will be submitted at the same time.

R=iant
CC=golang-dev
https://golang.org/cl/35830043

変更の背景

このコミットは、Go 1.3 リンカの抜本的な見直し("Go 1.3 Linker Overhaul")に向けた準備の一環として行われました。当時のGoツールチェインにおいて、リンカはビルドと実行のパフォーマンスボトルネックの一つとして認識されており、その改善が急務でした。

Goリンカは、元々Plan 9のツールチェインから継承されたもので、その設計には改善の余地がありました。このオーバーホール計画では、リンカを2つの異なる部分に分割し、その一部をGo言語で記述する可能性も検討されていました。

また、この変更は、Goツールチェイン全体(コンパイラ、アセンブラ、リンカを含む)をC言語からGo言語へ移行するという、より広範な取り組みの一部でもありました。この移行は、Go 1.5のブートストラップ計画として知られており、Go 1.4がそれ以降のGoバージョンをビルドするために必要となるというブートストラップの課題も伴いました。

このコミットは、アセンブラがリンカと連携する方法を標準化し、共通の liblink ライブラリを使用することで、将来のリンカのアーキテクチャ変更を容易にすることを目的としています。

前提知識の解説

  • アセンブラ (Assembler): アセンブリ言語で書かれたソースコードを、機械が直接実行できる機械語(オブジェクトコード)に変換するプログラムです。Go言語のツールチェインでは、cmd/5a (ARM), cmd/6a (x86), cmd/8a (ARM64) がそれぞれ異なるアーキテクチャ向けのアセンブラとして機能します。
  • リンカ (Linker): アセンブラによって生成された複数のオブジェクトファイルやライブラリを結合し、実行可能なプログラムを生成するプログラムです。リンカは、異なるオブジェクトファイル間で参照されるシンボル(関数や変数など)を解決し、最終的な実行ファイルのメモリレイアウトを決定します。
  • liblink: Go言語のツールチェインにおける共通のリンカライブラリです。このライブラリは、リンカのコア機能やデータ構造をカプセル化し、異なるアセンブラやコンパイラが共通のインターフェースを通じてリンカと連携できるように設計されています。これにより、リンカのロジックの一元化と再利用が促進されます。
  • Bison/Yacc: Bison(GNU Bison)は、Yacc(Yet Another Compiler Compiler)と互換性のあるパーサジェネレータです。これらは、文法規則を記述したファイル(通常 .y 拡張子)から、C言語などのソースコード(通常 y.tab.c)を生成します。生成されたコードは、字句解析器(lexer)からのトークンストリームを解析し、構文木を構築したり、特定のアクションを実行したりします。
  • 字句解析器 (Lexer/Scanner): ソースコードを読み込み、意味のある最小単位(トークン)に分割するプログラムです。通常、Flex(GNU Flex)などのツールで生成されます。このコミットでは、lex.c ファイルが字句解析に関連する変更を受けています。
  • Gen 構造体と Addr 構造体: 変更前のコードでは、アセンブラのコード生成において Gen 構造体が汎用的なアドレスやオペランドの情報を表現するために使用されていました。このコミットでは、liblink の導入に伴い、よりリンカの内部表現に近い Addr 構造体(link.h で定義される)に置き換えられています。Addr は、Goのリンカが命令のオペランドやアドレスを表現するために使用する標準的なデータ構造です。
  • nullgen: 多くのコンパイラやアセンブラで、初期化されていない、または無効な汎用的なアドレス/オペランドを表すために使用されるグローバル変数です。このコミットでは、Gen 型から Addr 型に変更されています。
  • ctxt (Context): liblink の操作に必要なコンテキスト情報を保持する構造体です。リンカの初期化、診断メッセージの出力、シンボルルックアップなど、様々なリンカ関連の操作がこのコンテキストを通じて行われます。

技術的詳細

このコミットの主要な技術的変更点は、各アセンブラ (5a, 6a, 8a) が独自のコード生成ロジックから liblink の共通インターフェースへと移行することです。

  1. liblink のインクルード:

    • src/cmd/*/a.h ファイルに <link.h> がインクルードされるようになりました。これは、liblink で定義されている共通のデータ構造や関数を使用するための変更です。
    • Gen 構造体が削除され、代わりに Addr 構造体が使用されるようになりました。これは、アセンブラ内部のオペランド表現が liblink の標準的な Addr 構造体に統一されたことを意味します。
    • nullgen の型が Gen から Addr に変更されています。
  2. 字句解析器 (lex.c) の変更:

    • main 関数内で ctxt = linknew(&linkarm); のように liblink のコンテキストが初期化されるようになりました。これにより、アセンブラは liblink の機能を利用できるようになります。
    • ctxt->diag = yyerror; の設定により、liblink からの診断メッセージがアセンブラの既存のエラー報告メカニズム (yyerror) にフックされます。
    • アセンブル処理のパスが変更されました。以前は pass = 1; yyparse();pass = 2; yyparse(); のように2回のパースを明示的に行っていましたが、for(pass = 1; pass <= 2; pass++) ループ内でパースを行う形に変更されました。
    • outhist() 関数が削除され、代わりに linkouthist(ctxt, &obuf); が呼び出されるようになりました。これは、履歴情報の出力も liblink の共通機能に委譲されたことを示します。
    • linkwritefuncs(ctxt, &obuf); の呼び出しが追加され、関数情報の書き込みも liblink 経由で行われるようになりました。
    • cinit 関数から Gen 構造体に関連する初期化コードが削除され、nullgen の初期化も Addr 型に合わせて簡素化されました。
    • zname および zaddr 関数が削除されました。これらの関数は、オブジェクトファイルにシンボルやアドレス情報を書き込むためのアセンブラ固有のロジックでしたが、liblink がこれらの処理を共通で提供するため不要になりました。
    • outcode 関数のシグネチャが Gen* から Addr* に変更されました。これは、コード生成の際に liblinkAddr 構造体を使用することを意味します。
  3. 構文解析器 (a.y, y.tab.c) の変更:

    • a.y ファイルでは、Bison/Yaccの型定義において、%type <gen>%type <addr> に変更されました。これにより、構文解析器が生成するセマンティック値の型が Gen から Addr に統一されます。
    • y.tab.c はBisonによって生成されるファイルであり、a.y の変更が直接反映されます。このファイルでは、Gen 構造体への参照が Addr 構造体への参照に置き換えられ、Gen 構造体のフィールド(例: sval, dval)へのアクセスが Addr 構造体の共用体 (u.sval, u.dval) を介して行われるようになりました。
    • 特に、name ルールにおけるシンボルルックアップが linklookup(ctxt, $1->name, 0)linklookup(ctxt, $1->name, 1) のように liblink の関数を使用するように変更されました。これは、シンボル解決のロジックが liblink に集約されたことを示します。

これらの変更により、各アセンブラは個別のコード生成およびオブジェクトファイル書き出しロジックを持つのではなく、liblink という共通の抽象化レイヤーを通じてリンカと連携するようになりました。これにより、リンカの内部実装が変更されても、アセンブラ側の変更を最小限に抑えることが可能になり、ツールチェイン全体の保守性と拡張性が向上します。

コアとなるコードの変更箇所

src/cmd/5a/a.h (および 6a/a.h, 8a/a.h)

--- a/src/cmd/5a/a.h
+++ b/src/cmd/5a/a.h
@@ -29,6 +29,7 @@
 // THE SOFTWARE.
 
 #include <bio.h>
+#include <link.h>
 #include "../5l/5.out.h"
 
 #ifndef	EXTERN
@@ -43,9 +44,7 @@
 #define	ungetc	ccungetc
 
 typedef	struct	Sym	Sym;
-typedef	struct	Gen	Gen;
 typedef	struct	Io	Io;
-typedef	struct	Hist	Hist;
 
 #define	MAXALIGN	7
 #define	FPCHIP		1
@@ -88,33 +87,6 @@ struct	Io
 };
 #define	I	((Io*)0)
 
-EXTERN	struct
-{
-	Sym*	sym;
-	short	type;
-} h[NSYM];
-
-struct	Gen
-{
-	Sym*	sym;
-	int32	offset;
-	int32	offset2;
-	short	type;
-	short	reg;
-	short	name;
-	double	dval;
-	char	sval[8];
-};
-
-struct	Hist
-{
-	Hist*	link;
-	char*	name;
-	int32	line;
-	int32	offset;
-};
-#define	H	((Hist*)0)
-
 enum
 {
 	CLAST,
@@ -129,9 +101,7 @@ EXTERN	char	debug[256];
 EXTERN	Sym*	hash[NHASH];
 EXTERN	char**	Dlist;
 EXTERN	int	nDlist;
-EXTERN	Hist*	ehist;
 EXTERN	int	newflag;
-EXTERN	Hist*	hist;
 EXTERN	char*	hunk;
 EXTERN	char**	include;
 EXTERN	Io*	iofree;
@@ -142,10 +112,9 @@ EXTERN	int	nerrors;
 EXTERN	int32	nhunk;
 EXTERN	int	ninclude;
 EXTERN	int32	nsymb;
-EXTERN	Gen	nullgen;
+EXTERN	Addr	nullgen;
 EXTERN	char*	outfile;
 EXTERN	int	pass;
-EXTERN	char*	pathname;
 EXTERN	int32	pc;
 EXTERN	int	peekc;
 EXTERN	int32	stmtline;
@@ -155,6 +124,7 @@ EXTERN	int	thechar;
 EXTERN	char*	thestring;
 EXTERN	int32	thunk;
 EXTERN	Biobuf	obuf;
+EXTERN	Link*	ctxt;
 
 void*	alloc(int32);
 void*	allocn(void*, int32, int32);
@@ -174,11 +144,8 @@ int	escchar(int);
 void	cinit(void);
 void	pinit(char*);
 void	cclean(void);
-int	isreg(Gen*);
-void	outcode(int, int, Gen*, int, Gen*);
-void	zname(char*, int, int);
-void	zaddr(Gen*, int);
-void	ieeedtod(Ieee*, double);
+int	isreg(Addr*);
+void	outcode(int, int, Addr*, int, Addr*);
 int	filbuf(void);
 Sym*	getsym(void);
 void	domacro(void);
@@ -190,7 +157,6 @@ void	maclin(void);
 void	macprag(void);
 void	macif(int);
 void	macend(void);
-void	outhist(void);
 void	dodefine(char*);
 void	prfile(int32);
 void	linehist(char*, int);

src/cmd/5a/lex.c (および 6a/lex.c, 8a/lex.c)

--- a/src/cmd/5a/lex.c
+++ b/src/cmd/5a/lex.c
@@ -59,6 +59,8 @@
 
 	thechar = '5';
 	thestring = "arm";
+	ctxt = linknew(&linkarm);
+	ctxt->diag = yyerror;
 
 	ensuresymb(NSYMB);
 	memset(debug, 0, sizeof(debug));
@@ -90,10 +92,15 @@
 		p = ARGF();
 		setinclude(p);
 		break;
+\
 	case 't':
 		thechar = 't';
 		thestring = "thumb";
 		break;
+\
+	case 'S':
+		ctxt->debugasm++;
+		break;
 	} ARGEND
 	if(*argv == 0) {
 		print("usage: %ca [-options] file.s\n", thechar);
@@ -143,30 +150,23 @@
 		errorexit();
 	}
 	Binit(&obuf, of, OWRITE);
-\
-\tpass = 1;\
-\tpinit(file);\
-\
 	Bprint(&obuf, "go object %s %s %s\n", getgoos(), thestring, getgoversion());
+\tBprint(&obuf, "\n!\n");
 
-\tfor(i=0; i<nDlist; i++)\
-\t\tdodefine(Dlist[i]);\
-\tyyparse();\
-\tif(nerrors) {\
+\tfor(pass = 1; pass <= 2; pass++) {
+\t\tpinit(file);
+\t\tfor(i=0; i<nDlist; i++)
+\t\t\tdodefine(Dlist[i]);
+\t\tyyparse();
 	\tcclean();
-\t\treturn nerrors;\
+\t\tif(nerrors)
+\t\t\treturn nerrors;
 	}
 
-\tBprint(&obuf, "\n!\n");
-\
-\tpass = 2;\
-\touthist();
-\tpinit(file);\
-\tfor(i=0; i<nDlist; i++)\
-\t\tdodefine(Dlist[i]);\
-\tyyparse();
-\tcclean();
-\treturn nerrors;\
+\tlinkouthist(ctxt, &obuf);
+\tlinkwritefuncs(ctxt, &obuf);
+\tBflush(&obuf);
+\treturn 0;
 }
 
 struct
@@ -426,15 +426,9 @@
 	Sym *s;
 	int i;
 
-\tnullgen.sym = S;\
-\tnullgen.offset = 0;\
 	nullgen.type = D_NONE;\
 	nullgen.name = D_NONE;\
 	nullgen.reg = NREG;\
-\tif(FPCHIP)\
-\t\tnullgen.dval = 0;\
-\tfor(i=0; i<sizeof(nullgen.sval); i++)\
-\t\tnullgen.sval[i] = 0;\
 
 	nerrors = 0;
 	iostack = I;
@@ -448,13 +442,6 @@
 		s->type = itab[i].type;
 		s->value = itab[i].value;
 	}
-\
-\tpathname = allocn(pathname, 0, 100);\
-\tif(getwd(pathname, 99) == 0) {\
-\t\tpathname = allocn(pathname, 100, 900);\
-\t\tif(getwd(pathname, 999) == 0)\
-\t\t\tstrcpy(pathname, "/???");\
-\t}\
 }
 
 void
@@ -466,81 +453,7 @@
 }
 
 int
-isreg(Gen *g)
+isreg(Addr *g)
 {
 
 	USED(g);
@@ -478,154 +441,27 @@
 void
 cclean(void)
 {
-\
 	outcode(AEND, Always, &nullgen, NREG, &nullgen);
-\tBflush(&obuf);\
-}
-\
-void
-zname(char *n, int t, int s)
-{
-\
-\tBPUTC(&obuf, ANAME);\
-\tBPUTC(&obuf, t);\t/* type */
-\tBPUTC(&obuf, s);\t/* sym */
-\twhile(*n) {\
-\t\tBPUTC(&obuf, *n);\
-\t\tn++;\
-\t}\
-\tBPUTC(&obuf, 0);\
-}
-\
-void
-zaddr(Gen *a, int s)
-{
-\tint32 l;\
-\tint i;\
-\tchar *n;\
-\tIeee e;\
-\
-\tBPUTC(&obuf, a->type);\
-\tBPUTC(&obuf, a->reg);\
-\tBPUTC(&obuf, s);\
-\tBPUTC(&obuf, a->name);\
-\tBPUTC(&obuf, 0);\
-\tswitch(a->type) {\
-\tdefault:\
-\t\tprint("unknown type %d\n", a->type);\
-\t\texits("arg");\
-\
-\tcase D_NONE:\
-\tcase D_REG:\
-\tcase D_FREG:\
-\tcase D_PSR:\
-\tcase D_FPCR:\
-\t\tbreak;\
-\
-\tcase D_REGREG:\
-\tcase D_REGREG2:\
-\t\tBPUTC(&obuf, a->offset);\
-\t\tbreak;\
-\
-\tcase D_CONST2:\
-\t\tl = a->offset2;\
-\t\tBPUTLE4(&obuf, l);\
-\t\t// fall through\
-\tcase D_OREG:\
-\tcase D_CONST:\
-\tcase D_BRANCH:\
-\tcase D_SHIFT:\
-\t\tl = a->offset;\
-\t\tBPUTLE4(&obuf, l);\
-\t\tbreak;\
-\
-\tcase D_SCONST:\
-\t\tn = a->sval;\
-\t\tfor(i=0; i<NSNAME; i++) {\
-\t\t\tBPUTC(&obuf, *n);\
-\t\t\tn++;\
-\t\t}\
-\t\tbreak;\
-\
-\tcase D_FCONST:\
-\t\tieeedtod(&e, a->dval);\
-\t\tBPUTLE4(&obuf, e.l);\
-\t\tBPUTLE4(&obuf, e.h);\
-\t\tbreak;\
-\t}\
 }
 
 static int bcode[] =
@@ -573,11 +486,13 @@
 	ANOP,
 };
 
+static Prog *lastpc;
+
 void
-outcode(int a, int scond, Gen *g1, int reg, Gen *g2)
+outcode(int a, int scond, Addr *g1, int reg, Addr *g2)
 {
-\tint sf, st, t;\
-\tSym *s;\
+\tProg *p;\
+\tPlist *pl;\
 
 	/* hack to make B.NE etc. work: turn it into the corresponding conditional */
 	if(a == AB){
@@ -587,154 +502,27 @@
 
 	if(pass == 1)
 		goto out;
-jackpot:\
-\tsf = 0;\
-\ts = g1->sym;\
-\twhile(s != S) {\
-\t\tsf = s->sym;\
-\t\tif(sf < 0 || sf >= NSYM)\
-\t\t\tsf = 0;\
-\t\tt = g1->name;\
-\t\tif(h[sf].type == t)\
-\t\tif(h[sf].sym == s)\
-\t\t\tbreak;\
-\t\tzname(s->name, t, sym);\
-\t\ts->sym = sym;\
-\t\th[sym].sym = s;\
-\t\th[sym].type = t;\
-\t\tsf = sym;\
-\t\tsym++;\
-\t\tif(sym >= NSYM)\
-\t\t\tsym = 1;\
-\t\tbreak;\
-\t}\
-\tst = 0;\
-\ts = g2->sym;\
-\twhile(s != S) {\
-\t\tst = s->sym;\
-\t\tif(st < 0 || st >= NSYM)\
-\t\t\tst = 0;\
-\t\tt = g2->name;\
-\t\tif(h[st].type == t)\
-\t\tif(h[st].sym == s)\
-\t\t\tbreak;\
-\t\tzname(s->name, t, sym);\
-\t\ts->sym = sym;\
-\t\th[sym].sym = s;\
-\t\th[sym].type = t;\
-\t\tst = sym;\
-\t\tsym++;
-\t\tif(sym >= NSYM)\
-\t\t\tsym = 1;\
-\t\tif(st == sf)\
-\t\t\tgoto jackpot;\
-\t\tbreak;\
-\t}\
-\tBPUTC(&obuf, a);\
-\tBPUTC(&obuf, scond);\
-\tBPUTC(&obuf, reg);\
-\tBPUTLE4(&obuf, stmtline);\
-\tzaddr(g1, sf);\
-\tzaddr(g2, st);\
+\t
+\tp = malloc(sizeof *p);\
+\tmemset(p, 0, sizeof *p);\
+\tp->as = a;\
+\tp->lineno = stmtline;\
+\tp->scond = scond;\
+\tp->from = *g1;\
+\tp->reg = reg;\
+\tp->to = *g2;\
+\
+\tif(lastpc == nil) {
+\t\tpl = linknewplist(ctxt);\
+\t\tpl->firstpc = p;\
+\t} else
+\t\tlastpc->link = p;\
+\tlastpc = p;\t
 
 out:\
 	if(a != AGLOBL && a != ADATA)
 		pc++;
 }
-\
-void
-outhist(void)
-{
-\tGen g;\
-\tHist *h;\
-\tchar *p, *q, *op, c;\
-\tint n;\
- 	char *tofree;\
- 	static int first = 1;\
- 	static char *goroot, *goroot_final;\
- 
- 	if(first) {
- 		// Decide whether we need to rewrite paths from $GOROOT to $GOROOT_FINAL.\
- 		first = 0;\
- 		goroot = getenv("GOROOT");\
- 		goroot_final = getenv("GOROOT_FINAL");\
- 		if(goroot == nil)\
- 			goroot = "";\
- 		if(goroot_final == nil)\
- 			goroot_final = goroot;\
- 		if(strcmp(goroot, goroot_final) == 0) {\
- 			goroot = nil;\
- 			goroot_final = nil;\
- 		}\
- 	}\
- 
- 	tofree = nil;\
-\tg = nullgen;\
-\tc = '/';\
-\tfor(h = hist; h != H; h = h->link) {\
-\t\tp = h->name;\
- 	\tif(p != nil && goroot != nil) {\
- 	\t\tn = strlen(goroot);\
- 	\t\tif(strncmp(p, goroot, strlen(goroot)) == 0 && p[n] == '/') {\
- 	\t\t\ttofree = smprint("%s%s", goroot_final, p+n);\
- 	\t\t\tp = tofree;\
- 	\t\t}\
- 	\t}\
-\t\top = 0;\
-\t\tif(systemtype(Windows) && p && p[1] == ':'){\
-\t\t\tc = p[2];\
-\t\t} else if(p && p[0] != c && h->offset == 0 && pathname){\
-\t\t\tif(systemtype(Windows) && pathname[1] == ':') {\
-\t\t\t\top = p;\
-\t\t\t\tp = pathname;\
-\t\t\t\tc = p[2];\
-\t\t\t} else if(pathname[0] == c){\
-\t\t\t\top = p;\
-\t\t\t\tp = pathname;\
-\t\t\t}\
-\t\t}\
-\t\twhile(p) {\
-\t\t\tq = strchr(p, c);\
-\t\t\tif(q) {\
-\t\t\t\tn = q-p;\
-\t\t\t\tif(n == 0){\
-\t\t\t\t\tn = 1;\t/* leading "/" */\
-\t\t\t\t\t*p = '/';\t/* don't emit "\" on windows */\
-\t\t\t\t}\
-\t\t\t\tq++;\
-\t\t\t} else {\
-\t\t\t\tn = strlen(p);\
-\t\t\t\tq = 0;\
-\t\t\t}\
-\t\t\tif(n) {\
-\t\t\t\tBPUTC(&obuf, ANAME);\
-\t\t\t\tBPUTC(&obuf, D_FILE);\t/* type */\
-\t\t\t\tBPUTC(&obuf, 1);\t/* sym */\
-\t\t\t\tBPUTC(&obuf, '<');\
-\t\t\t\tBwrite(&obuf, p, n);\
-\t\t\t\tBPUTC(&obuf, 0);\
-\t\t\t}\
-\t\t\tp = q;\
-\t\t\tif(p == 0 && op) {\
-\t\t\t\tp = op;\
-\t\t\t\top = 0;\
-\t\t\t}\
-\t\t}\
-\t\tg.offset = h->offset;\
-\
-\t\tBPUTC(&obuf, AHISTORY);\
-\t\tBPUTC(&obuf, Always);\
-\t\tBPUTC(&obuf, 0);\
-\t\tBPUTLE4(&obuf, h->line);\
-\t\tzaddr(&nullgen, 0);\
-\t\tzaddr(&g, 0);\
-\
-\t\tif(tofree) {\
-\t\t\tfree(tofree);\
-\t\t\ttofree = nil;\
-\t\t}\
-\t}\
-}
-\
 #include "../cc/lexbody"
 #include "../cc/macbody"

src/cmd/5a/a.y (および 6a/a.y, 8a/a.y)

--- a/src/cmd/5a/a.y
+++ b/src/cmd/5a/a.y
@@ -41,7 +41,7 @@
  	int32	lval;
  	double	dval;
  	char	sval[8];
-\tGen	gen;
+\tLAddr	addr;
 }
 %left	'|'
 %left	'^'
@@ -62,8 +62,8 @@
 %token	<sym>	LNAME LLAB LVAR
 %type	<lval>	con expr oexpr pointer offset sreg spreg creg
 %type	<lval>	rcon cond reglist
-%type	<gen>	gen rel reg regreg freg shift fcon frcon
-%type	<gen>	imm ximm name oreg ireg nireg ioreg imsr
+%type	<addr>	gen rel reg regreg freg shift fcon frcon
+%type	<addr>	imm ximm name oreg ireg nireg ioreg imsr
 %%
 prog:
 |	prog
@@ -175,7 +175,7 @@
  */
 |	LTYPE8 cond ioreg ',' '[' reglist ']'
 	{
-\t\tGen g;
+\t\tLAddr g;
 
 \t\tg = nullgen;
 \t\tg.type = D_CONST;
@@ -184,7 +184,7 @@
 	}
 |	LTYPE8 cond '[' reglist ']' ',' ioreg
 	{
-\t\tGen g;
+\t\tLAddr g;
 
 \t\tg = nullgen;
 \t\tg.type = D_CONST;
@@ -279,7 +279,7 @@
  */
 |	LTYPEJ cond con ',' expr ',' spreg ',' creg ',' creg oexpr
 	{
-\t\tGen g;
+\t\tLAddr g;
 
 \t\tg = nullgen;
 \t\tg.type = D_CONST;
@@ -377,14 +377,12 @@
 	\tif(pass == 2)
 	\t\tyyerror("undefined label: %s", $1->name);
 	\t$$.type = D_BRANCH;
-\t\t$$.sym = $1;
 	\t$$.offset = $2;
 	}
 |	LLAB offset
 	{
 	\t$$ = nullgen;
 	\t$$.type = D_BRANCH;
-\t\t$$.sym = $1;
 	\t$$.offset = $1->value + $2;
 	}
 
@@ -408,7 +406,7 @@
 	{
 	\t$$ = nullgen;
 	\t$$.type = D_SCONST;
-\t\tmemcpy($$.sval, $2, sizeof($$.sval));
+\t\tmemcpy($$.u.sval, $2, sizeof($$.u.sval));
 	}
 |\tfcon
 
@@ -417,13 +415,13 @@
 	{
 	\t$$ = nullgen;
 	\t$$.type = D_FCONST;
-\t\t$$.dval = $2;
+\t\t$$.u.dval = $2;
 	}
 |	'$' '-' LFCONST
 	{
 	\t$$ = nullgen;
 	\t$$.type = D_FCONST;
-\t\t$$.dval = -$3;
+\t\t$$.u.dval = -$3;
 	}
 
 reglist:
@@ -635,7 +633,7 @@
 	\t$$ = nullgen;
 	\t$$.type = D_OREG;
 	\t$$.name = $3;
-\t\t$$.sym = S;
+\t\t$$.sym = nil;
 	\t$$.offset = $1;
 	}
 |	LNAME offset '(' pointer ')'
@@ -643,7 +641,7 @@
 	\t$$ = nullgen;
 	\t$$.type = D_OREG;
 	\t$$.name = $4;
-\t\t$$.sym = $1;
+\t\t$$.sym = linklookup(ctxt, $1->name, 0);
 	\t$$.offset = $2;
 	}
 |	LNAME '<' '>' offset '(' LSB ')'
@@ -651,7 +649,7 @@
 	\t$$ = nullgen;
 	\t$$.type = D_OREG;
 	\t$$.name = D_STATIC;
-\t\t$$.sym = $1;
+\t\t$$.sym = linklookup(ctxt, $1->name, 1);
 	\t$$.offset = $4;
 	}

コアとなるコードの解説

ヘッダファイルの変更 (src/cmd/*/a.h)

  • #include <link.h>: liblink の主要なヘッダファイルがインクルードされるようになりました。これにより、liblink が提供するデータ型や関数がアセンブラから利用可能になります。
  • typedef struct Gen Gen; の削除と typedef struct Hist Hist; の削除: 以前のアセンブラ固有の Gen 構造体と Hist 構造体が削除されました。これらは liblinkAddr 構造体や共通の履歴管理メカニズムに置き換えられます。
  • EXTERN Addr nullgen;: nullgen の型が Gen から Addr に変更されました。これは、アセンブラが liblink のアドレス表現を使用することを示します。
  • EXTERN Link* ctxt;: liblink のコンテキストを保持するポインタ ctxt が追加されました。このポインタを通じて、アセンブラはリンカの機能にアクセスします。
  • outcode 関数のシグネチャ変更: void outcode(int, int, Gen*, int, Gen*);void outcode(int, int, Addr*, int, Addr*); に変更されました。これは、命令のオペランドが Gen 型から Addr 型に統一されたことを意味します。
  • zname, zaddr, outhist 関数の削除: これらの関数は、オブジェクトファイルへのシンボル名、アドレス、履歴情報の書き込みをアセンブラが独自に行うためのものでしたが、liblink がこれらの機能を共通で提供するため、不要になりました。

字句解析器の変更 (src/cmd/*/lex.c)

  • ctxt = linknew(&linkarm); および ctxt->diag = yyerror;: main 関数内で liblink のコンテキストが初期化され、エラー報告関数が yyerror に設定されます。これにより、liblink がアセンブラのエラー処理と統合されます。
  • アセンブルパスの変更: 以前は2回の yyparse() 呼び出しでパス1とパス2を明示的に実行していましたが、for(pass = 1; pass <= 2; pass++) ループ内で yyparse() を呼び出す形に変更されました。これにより、パスの管理がより構造化されました。
  • linkouthist(ctxt, &obuf);linkwritefuncs(ctxt, &obuf);: 以前 outhist() が行っていた履歴情報の出力と、関数情報の書き込みが liblink の共通関数に置き換えられました。これにより、オブジェクトファイルのフォーマットと書き込みロジックが liblink に集約されます。
  • znamezaddr の削除に伴う関連コードの削除: cclean 関数から Bflush(&obuf); が削除され、znamezaddr の呼び出しもなくなりました。これは、オブジェクトファイルの最終的な書き出しが liblinklinkwritefuncs に委譲されたためです。

構文解析器の変更 (src/cmd/*/a.y)

  • %type <gen> から %type <addr> への変更: Bison/Yaccのセマンティック値の型が Gen から Addr に変更されました。これにより、構文解析器が生成する中間表現が liblinkAddr 構造体に準拠するようになります。
  • $$.sym = $1; の削除(rel ルール内): 以前は分岐命令のターゲットシンボルを直接 Gen 構造体に格納していましたが、liblinkAddr 構造体ではシンボル解決が異なる方法で行われるため、この直接的な代入が不要になりました。
  • memcpy($$.sval, $2, sizeof($$.sval)); から memcpy($$.u.sval, $2, sizeof($$.u.sval)); への変更: Addr 構造体は共用体 (union u) を使用して異なる型の値を格納するため、文字列値 (sval) へのアクセスが u.sval を介して行われるようになりました。同様に、浮動小数点値 (dval) も u.dval を介してアクセスされます。
  • $$.sym = S; から $$.sym = nil; へ、および linklookup(ctxt, $1->name, 0);linklookup(ctxt, $1->name, 1); の導入: name ルールにおいて、シンボルへの参照が liblinklinklookup 関数を通じて行われるようになりました。これは、シンボルテーブルの管理とルックアップが liblink に一元化されたことを意味します。linklookup は、与えられたシンボル名に対応する Sym ポインタを liblink のコンテキスト (ctxt) から取得します。

これらの変更は、Goのアセンブラが liblink という共通のリンカライブラリに依存することで、ツールチェイン全体の整合性を高め、将来的なリンカの機能拡張や最適化を容易にするための重要なステップです。

関連リンク

  • Go 1.3 Linker Overhaul: https://golang.org/s/go13linker
  • Go 1.5 Bootstrap Plan: [https://docs.google.com/document/d/1D1-J2_s_gQ8_0-n_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b_v-0_b