[Patches] Cycle-GC patch, one more time

Charles G Waldman cgw@fnal.gov
Tue, 25 Apr 2000 11:14:06 -0500 (CDT)


I don't know why these messages keep getting base-64 encoded.  I
certainly didn't intend to send them that way!

The first message I sent had the wrong file attached.  Please
disregard.  Sorry for the confusion.


The problems I was having getting Neil's cyclic-gc stuff to work with
the latest CVS Python had nothing to do with Trashcan - sorry,
Christian!  It was my own changes to tupleobject.c.  It turned out to
be a little tricky to get the GC info handled correctly during
_PyTuple_Resize.  Below is a version of Neil's patch that applies
cleanly to current CVS and seems to work correctly.  All credit is due
to Neil, I just did a tiny amount of cleanup work in a few places.

Differences:  

  (1) The above-mentioned _PyTuple_Resize fix

  (2) A few problems were exposed by building with Py_TRACE_REFS
defined.  Specifially, PyObject_New and PyObject_NewVar already do a
_Py_NewReference internally, but in a few places PyObject_New is
used to create a new object which is then _Py_NewReference'd.  If
Py_TRACE_REFS is not set, this is merely redundant; with
Py_TRACE_REFS set it causes serious problems because the object is
added to the reference chain twice.



Here's a patch against Neil's patch.

Please disregard the earlier messages on this topic.


                   I confirm that, to the best of my knowledge and belief, this
                   contribution is free of any claims of third parties under
                   copyright, patent or other rights or interests ("claims").  To
                   the extent that I have any such claims, I hereby grant to CNRI a
                   nonexclusive, irrevocable, royalty-free, worldwide license to
                   reproduce, distribute, perform and/or display publicly, prepare
                   derivative versions, and otherwise use this contribution as part
                   of the Python software and its related documentation, or any
                   derivative versions thereof, at no cost to CNRI or its licensed
                   users, and to authorize others to do so.

                   I acknowledge that CNRI may, at its sole discretion, decide
                   whether or not to incorporate this contribution in the Python
                   software and its related documentation.  I further grant CNRI
                   permission to use my name and other identifying information
                   provided to CNRI by me for use in connection with the Python
                   software and its related documentation.

--- gc-cycle.diff.neil	Mon Apr 24 20:54:44 2000
+++ gc-cycle.diff.cgw	Tue Apr 25 10:50:41 2000
@@ -857,7 +857,7 @@
 +}
 +
 --- Python-cvs/Objects/classobject.c	Tue Feb 29 14:55:15 2000
-+++ Python-gc/Objects/classobject.c	Sat Apr  8 02:01:35 2000
++++ Python-gc/Objects/classobject.c	Mon Apr 24 21:19:18 2000
 @@ -110,7 +110,7 @@
  		}
  		Py_INCREF(bases);
@@ -947,16 +947,22 @@
  	if (inst->in_dict == NULL) {
  		Py_DECREF(inst);
  		return NULL;
-@@ -498,6 +528,9 @@
+@@ -498,11 +528,14 @@
  	PyObject *error_type, *error_value, *error_traceback;
  	PyObject *del;
  	static PyObject *delstr;
++	extern long _Py_RefTotal;
 +#ifdef WITH_CYCLE_GC
 +	PyGC_Remove((PyObject *)inst);
 +#endif
  	/* Call the __del__ method if it exists.  First temporarily
  	   revive the object and save the current exception, if any. */
  #ifdef Py_TRACE_REFS
+ 	/* much too complicated if Py_TRACE_REFS defined */
+-	extern long _Py_RefTotal;
+ 	inst->ob_type = &PyInstance_Type;
+ 	_Py_NewReference((PyObject *)inst);
+ 	_Py_RefTotal--;		/* compensate for increment in NEWREF */
 @@ -550,6 +583,9 @@
  #ifdef COUNT_ALLOCS
  		inst->ob_type->tp_free--;
@@ -967,7 +973,11 @@
  		return; /* __del__ added a reference; don't delete now */
  	}
  #ifdef Py_TRACE_REFS
-@@ -561,7 +597,7 @@
+@@ -557,11 +593,10 @@
+ 	inst->ob_type->tp_free--;	/* compensate for increment in UNREF */
+ #endif
+ 	_Py_ForgetReference((PyObject *)inst);
+-	inst->ob_type = NULL;
  #endif /* Py_TRACE_REFS */
  	Py_DECREF(inst->in_class);
  	Py_XDECREF(inst->in_dict);
@@ -976,7 +986,7 @@
  }
  
  static PyObject *
-@@ -837,6 +873,16 @@
+@@ -840,6 +875,16 @@
  	return outcome;
  }
  
@@ -993,7 +1003,7 @@
  static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
  
  static int
-@@ -1460,7 +1506,11 @@
+@@ -1463,7 +1508,11 @@
  	(getattrofunc)instance_getattr, /*tp_getattro*/
  	(setattrofunc)instance_setattr, /*tp_setattro*/
          0, /* tp_as_buffer */
@@ -1006,7 +1016,7 @@
  };
  
  
-@@ -1490,7 +1540,7 @@
+@@ -1493,7 +1542,7 @@
  		_Py_NewReference((PyObject *)im);
  	}
  	else {
@@ -1182,8 +1192,8 @@
 +#endif
  };
 --- Python-cvs/Objects/listobject.c	Fri Mar 24 22:32:30 2000
-+++ Python-gc/Objects/listobject.c	Sat Apr  8 02:02:36 2000
-@@ -61,34 +61,38 @@
++++ Python-gc/Objects/listobject.c	Mon Apr 24 21:14:42 2000
+@@ -61,34 +61,37 @@
  	int i;
  	PyListObject *op;
  	size_t nbytes;
@@ -1231,14 +1241,14 @@
 +	op->ob_item = item;
  	for (i = 0; i < size; i++)
  		op->ob_item[i] = NULL;
- 	_Py_NewReference((PyObject *)op);
+-	_Py_NewReference((PyObject *)op);
 +#ifdef WITH_CYCLE_GC
 +	PyGC_Insert((PyObject *)op);
 +#endif
  	return (PyObject *) op;
  }
  
-@@ -216,6 +220,9 @@
+@@ -216,6 +219,9 @@
  {
  	int i;
  	Py_TRASHCAN_SAFE_BEGIN(op)
@@ -1248,7 +1258,7 @@
  	if (op->ob_item != NULL) {
  		/* Do it backwards, for Christian Tismer.
  		   There's a simple test case where somehow this reduces
-@@ -227,7 +234,7 @@
+@@ -227,7 +233,7 @@
  		}
  		free((ANY *)op->ob_item);
  	}
@@ -1257,7 +1267,7 @@
  	Py_TRASHCAN_SAFE_END(op)
  }
  
-@@ -1399,6 +1406,29 @@
+@@ -1399,6 +1405,29 @@
  	return NULL;
  }
  
@@ -1287,7 +1297,7 @@
  static char append_doc[] =
  "L.append(object) -- append object to end";
  static char extend_doc[] =
-@@ -1464,6 +1494,18 @@
+@@ -1464,6 +1493,18 @@
  	0,		/*tp_as_number*/
  	&list_as_sequence,	/*tp_as_sequence*/
  	0,		/*tp_as_mapping*/
@@ -1306,7 +1316,7 @@
  };
  
  
-@@ -1532,5 +1574,16 @@
+@@ -1532,5 +1573,16 @@
  	0,		/*tp_as_number*/
  	&immutable_list_as_sequence,	/*tp_as_sequence*/
  	0,		/*tp_as_mapping*/
@@ -1440,8 +1450,18 @@
  
  int
 --- Python-cvs/Objects/tupleobject.c	Fri Mar 24 22:32:30 2000
-+++ Python-gc/Objects/tupleobject.c	Sat Apr  8 02:11:45 2000
-@@ -91,12 +91,10 @@
++++ Python-gc/Objects/tupleobject.c	Mon Apr 24 21:21:59 2000
+@@ -82,8 +82,8 @@
+ #endif
+ #ifdef Py_TRACE_REFS
+ 		op->ob_type = &PyTuple_Type;
+-		op->ob_size = size;
+ #endif
++		_Py_NewReference((PyObject *)op);
+ 	}
+ 	else
+ #endif
+@@ -97,23 +97,23 @@
  			return PyErr_NoMemory();
  		}
  		;
@@ -1455,7 +1475,12 @@
  	}
  	for (i = 0; i < size; i++)
  		op->ob_item[i] = NULL;
-@@ -107,6 +105,9 @@
+-	_Py_NewReference((PyObject *)op);
++
+ #if MAXSAVESIZE > 0
+ 	if (size == 0) {
+ 		free_tuples[0] = op;
+-		++num_free_tuples[0];
  		Py_INCREF(op);	/* extra INCREF so that this is never freed */
  	}
  #endif
@@ -1465,17 +1490,17 @@
  	return (PyObject *) op;
  }
  
-@@ -173,6 +174,9 @@
+@@ -180,6 +180,9 @@
  	register int i;
- 
+ 	register int len =  op->ob_size;
  	Py_TRASHCAN_SAFE_BEGIN(op)
 +#ifdef WITH_CYCLE_GC
 +	PyGC_Remove((PyObject *)op);
 +#endif
- 	if (op->ob_size > 0) {
- 		i = op->ob_size;
+ 	if (len > 0) {
+ 		i = len;
  		while (--i >= 0)
-@@ -185,7 +189,7 @@
+@@ -193,7 +196,7 @@
  		}
  #endif
  	}
@@ -1484,7 +1509,7 @@
  done:
  	Py_TRASHCAN_SAFE_END(op)
  }
-@@ -393,6 +397,22 @@
+@@ -401,6 +404,22 @@
  	return (PyObject *) np;
  }
  
@@ -1507,7 +1532,7 @@
  static PySequenceMethods tuple_as_sequence = {
  	(inquiry)tuplelength, /*sq_length*/
  	(binaryfunc)tupleconcat, /*sq_concat*/
-@@ -419,6 +439,16 @@
+@@ -427,6 +446,16 @@
  	&tuple_as_sequence,	/*tp_as_sequence*/
  	0,		/*tp_as_mapping*/
  	(hashfunc)tuplehash, /*tp_hash*/
@@ -1524,43 +1549,49 @@
  };
  
  /* The following function breaks the notion that tuples are immutable:
-@@ -441,6 +471,10 @@
+@@ -449,6 +478,9 @@
  	int i;
  	int sizediff;
  
 +#ifdef WITH_CYCLE_GC
 +	PyGCInfo *g = PY_GCINFO(*pv); 
-+	PyGC_Remove(*pv);
 +#endif
  	v = (PyTupleObject *) *pv;
  	if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
  		*pv = 0;
-@@ -469,16 +503,29 @@
- 		Py_XDECREF(v->ob_item[i]);
- 		v->ob_item[i] = NULL;
- 	}
--	sv = (PyTupleObject *)
--		realloc((char *)v,
--			sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
+@@ -479,7 +511,6 @@
+ 	}
+ #if MAXSAVESIZE > 0
+ 	if (newsize == 0 && free_tuples[0]) {
+-		num_free_tuples[0]--;
+ 		sv = free_tuples[0];
+ 		sv->ob_size = 0;
+ 		Py_INCREF(sv);
+@@ -511,9 +542,22 @@
+ 	} else 
+ #endif		
+ 	{
 +#ifdef WITH_CYCLE_GC
-+	g = (PyGCInfo *) realloc((char *)g, sizeof(*g) + 
++		PyGC_Remove((PyObject *)v);
++
++		g = (PyGCInfo *) realloc((char *)g, sizeof(*g) + 
 +				sizeof(PyTupleObject) + 
 +				newsize * sizeof(PyObject *));
-+	if (g == NULL) {
-+		sv == NULL;
-+	} else {
-+		sv = (PyTupleObject *) PY_GCOBJ(g);
-+	}
++		if (g == NULL) {
++			sv == NULL;
++		} else {
++			sv = (PyTupleObject *) PY_GCOBJ(g);
++		}
 +#else
-+	sv = (PyTupleObject *) realloc((char *)v, sizeof(PyTupleObject) +
-+				newsize * sizeof(PyObject *));
-+#endif
- 	*pv = (PyObject *) sv;
- 	if (sv == NULL) {
--		PyMem_DEL(v);
-+		PyObject_Del((PyObject *)v);
- 		PyErr_NoMemory();
- 		return -1;
+ 		sv = (PyTupleObject *)
+ 			realloc((char *)v,
+ 				sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
++#endif
+ 		*pv = (PyObject *) sv;
+ 		if (sv == NULL) {
+ 			PyMem_DEL(v);
+@@ -522,6 +566,9 @@
+ 		}
  	}
  	_Py_NewReference((PyObject *)sv);
 +#ifdef WITH_CYCLE_GC
@@ -1569,12 +1600,16 @@
  	for (i = sv->ob_size; i < newsize; i++)
  		sv->ob_item[i] = NULL;
  	if (last_is_sticky && sizediff > 0) {
-@@ -508,7 +555,7 @@
+@@ -551,7 +598,11 @@
  		while (p) {
  			q = p;
  			p = (PyTupleObject *)(p->ob_item[0]);
 -			PyMem_DEL(q);
++#ifdef Py_TRACE_REFS
++			q->ob_type =  &PyTuple_Type;
++#endif
 +			PyObject_Del((PyObject *)q);
++			
  		}
  	}
  #endif


 > Send Patches mailing list submissions to
 > 	patches@python.org
 > 
 > To subscribe or unsubscribe via the World Wide Web, visit
 > 	http://www.python.org/mailman/listinfo/patches
 > or, via email, send a message with subject or body 'help' to
 > 	patches-request@python.org
 > 
 > You can reach the person managing the list at
 > 	patches-admin@python.org
 > 
 > When replying, please edit your Subject line so it is more specific
 > than "Re: Contents of Patches digest..."
 > 
 > 
 > Today's Topics:
 > 
 >   1. Re: Slightly cleaned-up cycle-gc patch (Christian Tismer)
 >   2. Sightly clean-up cycle-gc patch (Charles G Waldman)
 > 
 > --__--__--
 > 
 > Message: 1
 > Date: Tue, 25 Apr 2000 18:07:00 +0200
 > From: Christian Tismer <tismer@tismer.com>
 > To: Charles G Waldman <cgw@alum.mit.edu>
 > Cc: patches@python.org
 > Subject: Re: [Patches] Slightly cleaned-up cycle-gc patch
 > 
 > 
 > 
 > Charles G Waldman wrote:
 > > 
 > > The problems I was having getting Neil's cyclic-gc stuff to work with
 > > the latest CVS Python had nothing to do with Trashcan - sorry,
 > > Christian!  
 > 
 > Tss tss - my poor little trashcan pet, now it's happy again :-)
 > 
 > ciao - chris
 > 
 > p.s.: Oh, did you look at the end of your patch?
 > There appears to be some binary crap. Maybe your
 > python16.dsp file is broekn?
 > 
 > -- 
 > Christian Tismer             :^)   <mailto:tismer@appliedbiometrics.com>
 > Applied Biometrics GmbH      :     Have a break! Take a ride on Python's
 > Kaunstr. 26                  :    *Starship* http://starship.python.net
 > 14163 Berlin                 :     PGP key -> http://wwwkeys.pgp.net
 > PGP Fingerprint       E182 71C7 1A9D 66E9 9D15  D3CC D4D7 93E2 1FAE F6DF
 >      where do you want to jump today?   http://www.stackless.com
 > 
 > 
 > --__--__--
 > 
 > Message: 2
 > From: Charles G Waldman <cgw@fnal.gov>
 > Date: Tue, 25 Apr 2000 11:02:09 -0500 (CDT)
 > To: patches@python.org
 > Subject: [Patches] Sightly clean-up cycle-gc patch
 > 
 > DQogSSBkb24ndCBrbm93IHdoYXQgaGFwcGVuZWQgd2l0aCB0aGF0IGxhc3QgbWVzc2FnZSAt
 > IGl0IHNvbWVob3cgZ290DQpiYXNlLTY0IGVuY29kZWQgd2l0aG91dCBtZSBhc2tpbmcgZm9y
 > IHRoYXQuICBTb3JyeSEgIFR1cm5zIG91dCB0aGF0DQpub3Qgb25seSB3YXMgdGhlIG1lc3Nh
 > Z2UgdW5yZWFkYWJsZSwgYnV0IEkgYXR0YWNoZWQgdGhlIHdyb25nIGZpbGUuDQpEb3VibGUt
 > b29wcyENCg0KDQpUaGUgcHJvYmxlbXMgSSB3YXMgaGF2aW5nIGdldHRpbmcgTmVpbCdzIGN5
 > Y2xpYy1nYyBzdHVmZiB0byB3b3JrIHdpdGgNCnRoZSBsYXRlc3QgQ1ZTIFB5dGhvbiBoYWQg
 > bm90aGluZyB0byBkbyB3aXRoIFRyYXNoY2FuIC0gc29ycnksDQpDaHJpc3RpYW4hICBJdCB3
 > YXMgbXkgb3duIGNoYW5nZXMgdG8gdHVwbGVvYmplY3QuYy4gIEl0IHR1cm5lZCBvdXQgdG8N
 > CmJlIGEgbGl0dGxlIHRyaWNreSB0byBnZXQgdGhlIEdDIGluZm8gaGFuZGxlZCBjb3JyZWN0
 > bHkgZHVyaW5nDQpfUHlUdXBsZV9SZXNpemUuICBCZWxvdyBpcyBhIHZlcnNpb24gb2YgTmVp
 > bCdzIHBhdGNoIHRoYXQgYXBwbGllcw0KY2xlYW5seSB0byBjdXJyZW50IENWUyBhbmQgc2Vl
 > bXMgdG8gd29yayBjb3JyZWN0bHkuICBBbGwgY3JlZGl0IGlzIGR1ZQ0KdG8gTmVpbCwgSSBq
 > dXN0IGRpZCBhIHRpbnkgYW1vdW50IG9mIGNsZWFudXAgd29yayBpbiBhIGZldyBwbGFjZXMu
 > DQooSSB3YXMgdGhpbmtpbmcgb2YgcG9zdGluZyB0aGlzIGFzIGEgZGlmZiB0byBOZWlsJ3Mg
 > ZGlmZiwgYnV0IHdhc24ndA0Kc3VyZSBob3cgdGhhdCB3b3VsZCBnbyBvdmVyLi4uICBJZiB0
 > aGlzIGdldHMgY2hlY2tlZCBpbiBpdCB3aWxsIGJlIGENCmxvdCBlYXNpZXIgdG8gd29yayBv
 > biBpdCBhbmQgc2VuZCBzbWFsbCBwYXRjaGVzLCByYXRoZXIgdGhhbiBoYXZpbmcgdG8NCnJl
 > Z2VuZXJhdGUgdGhlIHdob2xlIHRoaW5nIGVhY2ggdGltZSkuDQoNCg0KDQpEaWZmZXJlbmNl
 > czogIA0KDQogICgxKSBUaGUgYWJvdmUtbWVudGlvbmVkIF9QeVR1cGxlX1Jlc2l6ZSBmaXgN
 > Cg0KICAoMikgQSBmZXcgcHJvYmxlbXMgd2VyZSBleHBvc2VkIGJ5IGJ1aWxkaW5nIHdpdGgg
 > UHlfVFJBQ0VfUkVGUw0KICBkZWZpbmVkLiAgU3BlY2lmaWFsbHksIFB5T2JqZWN0X05ldyBh
 > bmQgUHlPYmplY3RfTmV3VmFyIGFscmVhZHkgZG8gYQ0KICBfUHlfTmV3UmVmZXJlbmNlIGlu
 > dGVybmFsbHksIGJ1dCBpbiBhIGZldyBwbGFjZXMgKGUuZy4gUHlMaXN0X05ldyksDQogIFB5
 > T2JqZWN0X05ldyB3YXMgYmVpbmcgdXNlZCB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IHdoaWNo
 > IGlzIHRoZW4NCiAgX1B5X05ld1JlZmVyZW5jZSdkLiAgSWYgUHlfVFJBQ0VfUkVGUyBpcyBu
 > b3Qgc2V0LCB0aGlzIGlzIG1lcmVseQ0KICByZWR1bmRhbnQ7IHdpdGggUHlfVFJBQ0VfUkVG
 > UyBzZXQgaXQgY2F1c2VzIHNlcmlvdXMgcHJvYmxlbXMgYmVjYXVzZQ0KICB0aGUgb2JqZWN0
 > IGlzIGFkZGVkIHRvIHRoZSByZWZlcmVuY2UgY2hhaW4gdHdpY2UuDQoNCg0KDQogICAgICAg
 > ICAgICAgICAgICAgSSBjb25maXJtIHRoYXQsIHRvIHRoZSBiZXN0IG9mIG15IGtub3dsZWRn
 > ZSBhbmQgYmVsaWVmLCB0aGlzDQogICAgICAgICAgICAgICAgICAgY29udHJpYnV0aW9uIGlz
 > IGZyZWUgb2YgYW55IGNsYWltcyBvZiB0aGlyZCBwYXJ0aWVzIHVuZGVyDQogICAgICAgICAg
 > ICAgICAgICAgY29weXJpZ2h0LCBwYXRlbnQgb3Igb3RoZXIgcmlnaHRzIG9yIGludGVyZXN0
 > cyAoImNsYWltcyIpLiAgVG8NCiAgICAgICAgICAgICAgICAgICB0aGUgZXh0ZW50IHRoYXQg
 > SSBoYXZlIGFueSBzdWNoIGNsYWltcywgSSBoZXJlYnkgZ3JhbnQgdG8gQ05SSSBhDQogICAg
 > ICAgICAgICAgICAgICAgbm9uZXhjbHVzaXZlLCBpcnJldm9jYWJsZSwgcm95YWx0eS1mcmVl
 > LCB3b3JsZHdpZGUgbGljZW5zZSB0bw0KICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjZSwg
 > ZGlzdHJpYnV0ZSwgcGVyZm9ybSBhbmQvb3IgZGlzcGxheSBwdWJsaWNseSwgcHJlcGFyZQ0K
 > ICAgICAgICAgICAgICAgICAgIGRlcml2YXRpdmUgdmVyc2lvbnMsIGFuZCBvdGhlcndpc2Ug
 > dXNlIHRoaXMgY29udHJpYnV0aW9uIGFzIHBhcnQNCiAgICAgICAgICAgICAgICAgICBvZiB0
 > aGUgUHl0aG9uIHNvZnR3YXJlIGFuZCBpdHMgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBvciBh
 > bnkNCiAgICAgICAgICAgICAgICAgICBkZXJpdmF0aXZlIHZlcnNpb25zIHRoZXJlb2YsIGF0
 > IG5vIGNvc3QgdG8gQ05SSSBvciBpdHMgbGljZW5zZWQNCiAgICAgICAgICAgICAgICAgICB1
 > c2VycywgYW5kIHRvIGF1dGhvcml6ZSBvdGhlcnMgdG8gZG8gc28uDQoNCiAgICAgICAgICAg
 > ICAgICAgICBJIGFja25vd2xlZGdlIHRoYXQgQ05SSSBtYXksIGF0IGl0cyBzb2xlIGRpc2Ny
 > ZXRpb24sIGRlY2lkZQ0KICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgb3Igbm90IHRvIGlu
 > Y29ycG9yYXRlIHRoaXMgY29udHJpYnV0aW9uIGluIHRoZSBQeXRob24NCiAgICAgICAgICAg
 > ICAgICAgICBzb2Z0d2FyZSBhbmQgaXRzIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbi4gIEkgZnVy
 > dGhlciBncmFudCBDTlJJDQogICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiB0byB1c2Ug
 > bXkgbmFtZSBhbmQgb3RoZXIgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24NCiAgICAgICAgICAg
 > ICAgICAgICBwcm92aWRlZCB0byBDTlJJIGJ5IG1lIGZvciB1c2UgaW4gY29ubmVjdGlvbiB3
 > aXRoIHRoZSBQeXRob24NCiAgICAgICAgICAgICAgICAgICBzb2Z0d2FyZSBhbmQgaXRzIHJl
 > bGF0ZWQgZG9jdW1lbnRhdGlvbi4NCg0KLS0tIFB5dGhvbi1jdnMvSW5jbHVkZS9vYmplY3Qu
 > aAlGcmkgTWFyIDI0IDIyOjMyOjE2IDIwMDANCisrKyBQeXRob24tZ2MvSW5jbHVkZS9vYmpl
 > Y3QuaAlTYXQgQXByICA4IDAxOjM4OjI1IDIwMDANCkBAIC0xNDUsNiArMTQ1LDEwIEBADQog
 > dHlwZWRlZiBpbnQgKCpnZXRzZWdjb3VudHByb2MpIFB5X1BST1RPKChQeU9iamVjdCAqLCBp
 > bnQgKikpOw0KIHR5cGVkZWYgaW50ICgqZ2V0Y2hhcmJ1ZmZlcnByb2MpIFB5X1BST1RPKChQ
 > eU9iamVjdCAqLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsNCiB0eXBlZGVmIGludCAoKm9iam9i
 > anByb2MpIFB5X1BST1RPKChQeU9iamVjdCAqLCBQeU9iamVjdCAqKSk7DQorI2lmZGVmIFdJ
 > VEhfQ1lDTEVfR0MNCit0eXBlZGVmIGludCAoKnZpc2l0cHJvYykgUHlfUFJPVE8oKFB5T2Jq
 > ZWN0ICosIHZvaWQgKikpOw0KK3R5cGVkZWYgaW50ICgqcmVjdXJzZXByb2MpIFB5X1BST1RP
 > KChQeU9iamVjdCAqLCB2aXNpdHByb2MsIHZvaWQgKikpOw0KKyNlbmRpZg0KIA0KIHR5cGVk
 > ZWYgc3RydWN0IHsNCiAJYmluYXJ5ZnVuYyBuYl9hZGQ7DQpAQCAtMjQzLDkgKzI0NywxOCBA
 > QA0KIA0KIAljaGFyICp0cF9kb2M7IC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovDQogDQot
 > CS8qIE1vcmUgc3BhcmVzICovDQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJLyogY2FsbCBm
 > dW5jdGlvbiBmb3IgYWxsIGFjY2Vzc2libGUgb2JqZWN0cyAqLw0KKwlyZWN1cnNlcHJvYyB0
 > cF9yZWN1cnNlOw0KKwkNCisJLyogZGVsZXRlIHJlZmVyZW5jZXMgdG8gY29udGFpbmVkIG9i
 > amVjdHMgKi8NCisJaW5xdWlyeSB0cF9jbGVhcjsNCisjZWxzZQ0KIAlsb25nIHRwX3h4eDU7
 > DQogCWxvbmcgdHBfeHh4NjsNCisjZW5kaWYNCisNCisJLyogTW9yZSBzcGFyZXMgKi8NCiAJ
 > bG9uZyB0cF94eHg3Ow0KIAlsb25nIHRwX3h4eDg7DQogDQpAQCAtMzE1LDYgKzMyOCw5IEBA
 > DQogDQogLyogUHlTZXF1ZW5jZU1ldGhvZHMgY29udGFpbnMgc3FfY29udGFpbnMgKi8NCiAj
 > ZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTiAoMUw8PDEpDQorDQorLyogT2Jq
 > ZWN0cyB3aXRoIGEgR0MgaW5mbyBwcmVmaXggKGFsbG9jYXRlZCAqYmVmb3JlKiB0aGUgb2Jq
 > ZWN0IGl0c2VsZiEpICovDQorI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfR0NJTkZPICgxTDw8
 > MikNCiANCiAjZGVmaW5lIFB5X1RQRkxBR1NfREVGQVVMVCAgKFB5X1RQRkxBR1NfSEFWRV9H
 > RVRDSEFSQlVGRkVSIHwgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBG
 > TEFHU19IQVZFX1NFUVVFTkNFX0lOKQ0KLS0tIFB5dGhvbi1jdnMvSW5jbHVkZS9vYmppbXBs
 > LmgJVGh1IE1hciAgMiAxNzowMjoyMyAyMDAwDQorKysgUHl0aG9uLWdjL0luY2x1ZGUvb2Jq
 > aW1wbC5oCVNhdCBBcHIgIDggMDM6MTg6MjIgMjAwMA0KQEAgLTM4LDggKzM4LDQyIEBADQog
 > LyoNCiBBZGRpdGlvbmFsIG1hY3JvcyBmb3IgbW9kdWxlcyB0aGF0IGltcGxlbWVudCBuZXcg
 > b2JqZWN0IHR5cGVzLg0KIFlvdSBtdXN0IGZpcnN0IGluY2x1ZGUgIm9iamVjdC5oIi4NCisq
 > Lw0KKw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDIA0KKw0KKy8qIFN0cnVjdHVyZSAqcHJlZml4
 > ZWQqIHRvIGNvbnRhaW5lciBvYmplY3RzIHBhcnRpY2lwYXRpbmcgaW4gR0MgKi8gDQordHlw
 > ZWRlZiBzdHJ1Y3QgX2djaW5mbyB7DQorCXN0cnVjdCBfZ2NpbmZvICpnY19uZXh0Ow0KKwlz
 > dHJ1Y3QgX2djaW5mbyAqZ2NfcHJldjsNCisJaW50IGdjX3JlZnM7DQorfSBQeUdDSW5mbzsN
 > CisNCisvKiBUZXN0IGlmIGEgdHlwZSBoYXMgR0MgaW5mbyAqLw0KKyNkZWZpbmUgUFlfVFlQ
 > RUlTR0ModCkgUHlUeXBlX0hhc0ZlYXR1cmUoKHQpLCBQeV9UUEZMQUdTX0hBVkVfR0NJTkZP
 > KQ0KKw0KKy8qIFRlc3QgaWYgYW4gb2JqZWN0IGhhcyBHQyBpbmZvICovDQorI2RlZmluZSBQ
 > WV9JU0dDKG8pIFBZX1RZUEVJU0dDKChvKS0+b2JfdHlwZSkNCisNCisvKiBHZXQgYW4gb2Jq
 > ZWN0J3MgR0MgaW5mbyAtLSBOVUxMIGlmIHRoZSBvYmplY3QgaGFzIG5vbmUgKi8NCisjZGVm
 > aW5lIFBZX0dDSU5GTyhvKSAoUFlfSVNHQyhvKSA/ICgoUHlHQ0luZm8gKikobyktMSkgOiBO
 > VUxMKQ0KKw0KKy8qIFVuc2FmZSB2ZXJzaW9uIG9mIFBZX0dDSU5GTygpIC0tIG9ubHkgY2Fs
 > bCBpZiBQWV9JU0dDKHApIGlzIHRydWUgKi8NCisjZGVmaW5lIFBZX0dDSU5GT19VTlNBRkUo
 > bykgKChQeUdDSW5mbyAqKShvKS0xKQ0KKw0KKy8qIEdldCB0aGUgb2JqZWN0IGdpdmVuIHRo
 > ZSBQeUdDSW5mbyAqLw0KKyNkZWZpbmUgUFlfR0NPQkooZykgKChQeU9iamVjdCAqKSgoZykr
 > MSkpDQogDQotUHlPYmplY3RfTkVXKHR5cGUsIHR5cGVvYmopIGFsbG9jYXRlcyBtZW1vcnkg
 > Zm9yIGEgbmV3IG9iamVjdCBvZiB0aGUgZ2l2ZW4NCisvKiBBZGQgdGhlIG9iamVjdCBpbnRv
 > IHRoZSBjb250YWluZXIgc2V0ICovDQorZXh0ZXJuIERMX0lNUE9SVCh2b2lkKSBQeUdDX0lu
 > c2VydCBQeV9QUk9UTygoUHlPYmplY3QgKikpOw0KKw0KKy8qIFJlbW92ZSB0aGUgb2JqZWN0
 > IGZyb20gdGhlIGNvbnRhaW5lciBzZXQgKi8NCitleHRlcm4gRExfSU1QT1JUKHZvaWQpIFB5
 > R0NfUmVtb3ZlIFB5X1BST1RPKChQeU9iamVjdCAqKSk7DQorDQorI2VuZGlmDQorDQorLyoN
 > CitQeU9iamVjdF9OZXcodHlwZSwgdHlwZW9iaikgYWxsb2NhdGVzIG1lbW9yeSBmb3IgYSBu
 > ZXcgb2JqZWN0IG9mIHRoZSBnaXZlbg0KIHR5cGU7IGhlcmUgJ3R5cGUnIG11c3QgYmUgdGhl
 > IEMgc3RydWN0dXJlIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlDQogb2JqZWN0IGFuZCAn
 > dHlwZW9iaicgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBvYmplY3Qu
 > DQogUmVmZXJlbmNlIGNvdW50IGFuZCB0eXBlIHBvaW50ZXIgYXJlIGZpbGxlZCBpbjsgdGhl
 > IHJlc3Qgb2YgdGhlIGJ5dGVzIG9mDQpAQCAtNDcsMzAgKzgxLDI5IEBADQogVGhlIHNpemUg
 > b2YgdGhlIG9iamVjdCBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSB0cF9iYXNpY3Np
 > emUgZmllbGQNCiBvZiB0aGUgdHlwZSBvYmplY3QuDQogDQotUHlPYmplY3RfTkVXX1ZBUih0
 > eXBlLCB0eXBlb2JqLCBuKSBpcyBzaW1pbGFyIGJ1dCBhbGxvY2F0ZXMgYSB2YXJpYWJsZS1z
 > aXplDQorUHlPYmplY3RfTmV3VmFyKHR5cGUsIHR5cGVvYmosIG4pIGlzIHNpbWlsYXIgYnV0
 > IGFsbG9jYXRlcyBhIHZhcmlhYmxlLXNpemUNCiBvYmplY3Qgd2l0aCBuIGV4dHJhIGl0ZW1z
 > LiAgVGhlIHNpemUgaXMgY29tcHV0ZWQgYXMgdHBfYmFzaWNzaXplIHBsdXMNCiBuICogdHBf
 > aXRlbXNpemUuICBUaGlzIGZpbGxzIGluIHRoZSBvYl9zaXplIGZpZWxkIGFzIHdlbGwuDQog
 > Ki8NCiANCi0jaWZuZGVmIE1TX0NPUkVETEwNCiBleHRlcm4gRExfSU1QT1JUKFB5T2JqZWN0
 > ICopIF9QeU9iamVjdF9OZXcgUHlfUFJPVE8oKFB5VHlwZU9iamVjdCAqKSk7DQogZXh0ZXJu
 > IERMX0lNUE9SVChQeVZhck9iamVjdCAqKSBfUHlPYmplY3RfTmV3VmFyIFB5X1BST1RPKChQ
 > eVR5cGVPYmplY3QgKiwgaW50KSk7DQorZXh0ZXJuIERMX0lNUE9SVCh2b2lkKSBQeU9iamVj
 > dF9EZWwgUHlfUFJPVE8oKFB5T2JqZWN0ICopKTsNCiANCi0jZGVmaW5lIFB5T2JqZWN0X05F
 > Vyh0eXBlLCB0eXBlb2JqKSAoKHR5cGUgKikgX1B5T2JqZWN0X05ldyh0eXBlb2JqKSkNCi0j
 > ZGVmaW5lIFB5T2JqZWN0X05FV19WQVIodHlwZSwgdHlwZW9iaiwgbikgKCh0eXBlICopIF9Q
 > eU9iamVjdF9OZXdWYXIodHlwZW9iaiwgbikpDQotDQotI2Vsc2UNCi0vKiBGb3IgYW4gTVMt
 > V2luZG93cyBETEwsIHdlIGNoYW5nZSB0aGUgd2F5IGFuIG9iamVjdCBpcyBjcmVhdGVkLCBz
 > byB0aGF0IHRoZQ0KLSAgIGV4dGVuc2lvbiBtb2R1bGUncyBtYWxsb2MgaXMgdXNlZCwgcmF0
 > aGVyIHRoYW4gdGhlIGNvcmUgRExMIG1hbGxvYywgYXMgdGhlcmUgaXMNCi0gICBubyBndWFy
 > YW50ZWUgdGhleSB3aWxsIHVzZSB0aGUgc2FtZSBoZWFwDQotKi8NCi1leHRlcm4gRExfSU1Q
 > T1JUKFB5T2JqZWN0ICopIF9QeU9iamVjdF9OZXcgUHlfUFJPVE8oKFB5VHlwZU9iamVjdCAq
 > LCBQeU9iamVjdCAqKSk7DQotZXh0ZXJuIERMX0lNUE9SVChQeVZhck9iamVjdCAqKSBfUHlP
 > YmplY3RfTmV3VmFyIFB5X1BST1RPKChQeVR5cGVPYmplY3QgKiwgaW50LCBQeVZhck9iamVj
 > dCAqKSk7DQotDQotI2RlZmluZSBQeU9iamVjdF9ORVcodHlwZSwgdHlwZW9iaikgKCh0eXBl
 > ICopIF9QeU9iamVjdF9OZXcodHlwZW9iaiwoUHlPYmplY3QgKiltYWxsb2MoKHR5cGVvYmop
 > LT50cF9iYXNpY3NpemUpKSkNCi0jZGVmaW5lIFB5T2JqZWN0X05FV19WQVIodHlwZSwgdHlw
 > ZW9iaiwgbikgKCh0eXBlICopIF9QeU9iamVjdF9OZXdWYXIodHlwZW9iaiwgbiwgKFB5VmFy
 > T2JqZWN0ICopbWFsbG9jKCh0eXBlb2JqKS0+dHBfYmFzaWNzaXplICsgbiAqICh0eXBlb2Jq
 > KS0+dHBfaXRlbXNpemUpKSkNCi0NCi0jZW5kaWYgLyogTVNfQ09SRURMTCAqLw0KKy8qIEZ1
 > bmN0aW9ucyAqLw0KKyNkZWZpbmUgUHlPYmplY3RfTmV3KHR5cGUsIHR5cGVvYmopIFwNCisJ
 > CSgodHlwZSAqKSBfUHlPYmplY3RfTmV3KHR5cGVvYmopKQ0KKyNkZWZpbmUgUHlPYmplY3Rf
 > TmV3VmFyKHR5cGUsIHR5cGVvYmosIG4pIFwNCisgICAgICAgICAgICAgICAgKCh0eXBlICop
 > IF9QeU9iamVjdF9OZXdWYXIoKHR5cGVvYmopLCAobikpKQ0KKw0KKw0KK2V4dGVybiBETF9J
 > TVBPUlQoUHlPYmplY3QgKikgX1B5T2JqZWN0X0Zyb21UeXBlIFB5X1BST1RPKChQeVR5cGVP
 > YmplY3QgKiwgUHlPYmplY3QgKikpOw0KK2V4dGVybiBETF9JTVBPUlQoUHlWYXJPYmplY3Qg
 > KikgX1B5T2JqZWN0X1ZhckZyb21UeXBlIFB5X1BST1RPKChQeVR5cGVPYmplY3QgKiwgaW50
 > LCBQeVZhck9iamVjdCAqKSk7DQorDQorLyogVGhlc2UgbWFjcm9zIG1heSBub3QgdXNlIHRo
 > ZSBzYW1lIG1hbGxvYyBhcyBQeXRob24uIFRoZXkgY2Fubm90IGJlIHVzZWQNCisgKiBvYmpl
 > Y3RzIHRoYXQgYXJlIGludm9sdmVkIGluIGdhcmJhZ2UgY29sbGVjdGlvbiAqLw0KKyNkZWZp
 > bmUgUHlPYmplY3RfTkVXKHR5cGUsIHR5cGVvYmopICgodHlwZSAqKSBfUHlPYmplY3RfRnJv
 > bVR5cGUodHlwZW9iaiwoUHlPYmplY3QgKiltYWxsb2MoKHR5cGVvYmopLT50cF9iYXNpY3Np
 > emUpKSkNCisjZGVmaW5lIFB5T2JqZWN0X05FV19WQVIodHlwZSwgdHlwZW9iaiwgbikgKCh0
 > eXBlICopIF9QeU9iamVjdF9WYXJGcm9tVHlwZSh0eXBlb2JqLCBuLCAoUHlWYXJPYmplY3Qg
 > KiltYWxsb2MoKHR5cGVvYmopLT50cF9iYXNpY3NpemUgKyBuICogKHR5cGVvYmopLT50cF9p
 > dGVtc2l6ZSkpKQ0KIA0KICNpZmRlZiBfX2NwbHVzcGx1cw0KIH0NCi0tLSBQeXRob24tY3Zz
 > L01vZHVsZXMvY1BpY2tsZS5jCUZyaSBNYXIgMjQgMjI6MzI6MjUgMjAwMA0KKysrIFB5dGhv
 > bi1nYy9Nb2R1bGVzL2NQaWNrbGUuYwlTYXQgQXByICA4IDAyOjEzOjExIDIwMDANCkBAIC0y
 > ODg2LDcgKzI4ODYsNyBAQA0KICAgICAgICAgICAgICAgUHlJbnN0YW5jZU9iamVjdCAqaW5z
 > dDsNCiANCiAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7DQotICAgICAgICAgICAgICBV
 > TkxFU1MgKGluc3Q9UHlPYmplY3RfTkVXKFB5SW5zdGFuY2VPYmplY3QsICZQeUluc3RhbmNl
 > X1R5cGUpKQ0KKyAgICAgICAgICAgICAgVU5MRVNTIChpbnN0PVB5T2JqZWN0X05ldyhQeUlu
 > c3RhbmNlT2JqZWN0LCAmUHlJbnN0YW5jZV9UeXBlKSkNCiAgICAgICAgICAgICAgICAgZ290
 > byBlcnI7DQogICAgICAgICAgICAgICBpbnN0LT5pbl9jbGFzcz0oUHlDbGFzc09iamVjdCop
 > Y2xzOw0KICAgICAgICAgICAgICAgUHlfSU5DUkVGKGNscyk7DQpAQCAtMjg5NCw3ICsyODk0
 > LDkgQEANCiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGluc3QpOw0KICAgICAgICAgICAg
 > ICAgICBnb3RvIGVycjsNCiAgICAgICAgICAgICAgIH0NCi0NCisjaWZkZWYgV0lUSF9DWUNM
 > RV9HQw0KKyAgICAgICAgICAgICAgUHlHQ19JbnNlcnQoKFB5T2JqZWN0ICopaW5zdCk7DQor
 > I2VuZGlmDQogICAgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaW5zdDsNCiAgICAg
 > ICAgICAgICB9DQogICAgICAgICAgIFB5X0RFQ1JFRihfX2dldGluaXRhcmdzX18pOw0KLS0t
 > IFB5dGhvbi1jdnMvTW9kdWxlcy9uZXdtb2R1bGUuYwlUdWUgRmViIDI5IDE0OjU1OjA5IDIw
 > MDANCisrKyBQeXRob24tZ2MvTW9kdWxlcy9uZXdtb2R1bGUuYwlTYXQgQXByICA4IDAyOjEz
 > OjI2IDIwMDANCkBAIC00OSwxMyArNDksMTYgQEANCiAJCQkgICAgICAmUHlDbGFzc19UeXBl
 > LCAma2xhc3MsDQogCQkJICAgICAgJlB5RGljdF9UeXBlLCAmZGljdCkpDQogCQlyZXR1cm4g
 > TlVMTDsNCi0JaW5zdCA9IFB5T2JqZWN0X05FVyhQeUluc3RhbmNlT2JqZWN0LCAmUHlJbnN0
 > YW5jZV9UeXBlKTsNCisJaW5zdCA9IFB5T2JqZWN0X05ldyhQeUluc3RhbmNlT2JqZWN0LCAm
 > UHlJbnN0YW5jZV9UeXBlKTsNCiAJaWYgKGluc3QgPT0gTlVMTCkNCiAJCXJldHVybiBOVUxM
 > Ow0KIAlQeV9JTkNSRUYoa2xhc3MpOw0KIAlQeV9JTkNSRUYoZGljdCk7DQogCWluc3QtPmlu
 > X2NsYXNzID0gKFB5Q2xhc3NPYmplY3QgKilrbGFzczsNCiAJaW5zdC0+aW5fZGljdCA9IGRp
 > Y3Q7DQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJUHlHQ19JbnNlcnQoKFB5T2JqZWN0ICop
 > aW5zdCk7DQorI2VuZGlmDQogCXJldHVybiAoUHlPYmplY3QgKilpbnN0Ow0KIH0NCiANCi0t
 > LSBQeXRob24tY3ZzL01vZHVsZXMvZ2Ntb2R1bGUuYw0KKysrIFB5dGhvbi1nYy9Nb2R1bGVz
 > L2djbW9kdWxlLmMJU2F0IEFwciAgOCAwMzoyNTo1NyAyMDAwDQpAQCAtMCwwICsxLDY3NyBA
 > QA0KKy8qDQorIA0KKyAgUmVmZXJlbmNlIEN5Y2xlIEdhcmJhZ2UgQ29sbGVjdGlvbg0KKyAg
 > PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyAgTmVpbCBTY2hlbWVu
 > YXVlciA8bmFzY2hlbWVAZW5tZS51Y2FsZ2FyeS5jYT4NCisNCisgIEJhc2VkIG9uIGEgcG9z
 > dCBvbiB0aGUgcHl0aG9uLWRldiBsaXN0LiAgSWRlYXMgZnJvbSBHdWlkbyB2YW4gUm9zc3Vt
 > LA0KKyAgRXJpYyBUaWVkZW1hbm4sIGFuZCB2YXJpb3VzIG90aGVycy4NCisNCisgIGh0dHA6
 > Ly93d3cuZW5tZS5jYWxnYXJ5LmNhL35uYXNjaGVtZS9weXRob24vZ2MuaHRtbA0KKyAgaHR0
 > cDovL3d3dy5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDAtTWFyY2gvMDAz
 > ODY5Lmh0bWwNCisgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRl
 > di8yMDAwLU1hcmNoLzAwNDAxMC5odG1sDQorICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGlw
 > ZXJtYWlsL3B5dGhvbi1kZXYvMjAwMC1NYXJjaC8wMDQwMjIuaHRtbA0KKw0KKyAgRm9yIGEg
 > aGlnaGxldmVsIHZpZXcgb2YgdGhlIGNvbGxlY3Rpb24gcHJvY2VzcywgcmVhZCB0aGUgY29s
 > bGVjdA0KKyAgZnVuY3Rpb24uDQorDQorICBUT0RPOg0KKwl1c2UgYSBkaWZmZXJlbnQgaW50
 > ZXJmYWNlIGZvciBzZXRfZGVidWcoKSAoa2V5d29yZHMpPw0KKwlpbmxpbmUgUHlHQ19JbnNl
 > cnQgYW5kIFB5R0NfUmVtb3ZlIGNhbGxzPw0KKwl0dW5lIHBhcmFtZXRlcnMNCisNCisqLw0K
 > Kw0KKyNpbmNsdWRlICJQeXRob24uaCINCisNCisjaWZuZGVmIFdJVEhfQ1lDTEVfR0MNCisj
 > ZXJyb3IgIllvdSBtdXN0IGRlZmluZSBXSVRIX0NZQ0xFX0dDIHRvIGluY2x1ZGUgdGhpcyBt
 > b2R1bGUiDQorI2VuZGlmDQorDQorLyogbWFnaWMgZ2NfcmVmcyB2YWx1ZSAqLw0KKyNkZWZp
 > bmUgR0NfTU9WRUQgLTENCisNCisNCisvKioqIEdsb2JhbCBHQyBzdGF0ZSAqKiovDQorDQor
 > LyogbGlua2VkIGxpc3RzIG9mIGNvbnRhaW5lciBvYmplY3RzICovDQorc3RhdGljIFB5R0NJ
 > bmZvIGdlbmVyYXRpb24wID0geyZnZW5lcmF0aW9uMCwgJmdlbmVyYXRpb24wLCAwfTsNCitz
 > dGF0aWMgUHlHQ0luZm8gZ2VuZXJhdGlvbjEgPSB7JmdlbmVyYXRpb24xLCAmZ2VuZXJhdGlv
 > bjEsIDB9Ow0KK3N0YXRpYyBQeUdDSW5mbyBnZW5lcmF0aW9uMiA9IHsmZ2VuZXJhdGlvbjIs
 > ICZnZW5lcmF0aW9uMiwgMH07DQorc3RhdGljIGludCBnZW5lcmF0aW9uID0gMDsgLyogY3Vy
 > cmVudCBnZW5lcmF0aW9uIGJlaW5nIGNvbGxlY3RlZCAqLw0KKw0KKy8qIGNvbGxlY3Rpb24g
 > ZnJlcXVlbmNpZXMsIFhYWCB0dW5lIHRoZXNlICovDQorc3RhdGljIGludCB0aHJlc2hvbGQw
 > ID0gMTAwOyAvKiBuZXQgbmV3IGNvbnRhaW5lcnMgYmVmb3JlIGNvbGxlY3Rpb24gKi8NCitz
 > dGF0aWMgaW50IHRocmVzaG9sZDEgPSAxMDsgIC8qIGdlbmVyYXRpb24wIGNvbGxlY3Rpb25z
 > IGJlZm9yZSBjb2xsZWN0aW5nIDEgKi8NCitzdGF0aWMgaW50IHRocmVzaG9sZDIgPSAxMDsg
 > IC8qIGdlbmVyYXRpb24xIGNvbGxlY3Rpb25zIGJlZm9yZSBjb2xsZWN0aW5nIDIgKi8NCisN
 > CisvKiBuZXQgbmV3IG9iamVjdHMgYWxsb2NhdGVkIHNpbmNlIGxhc3QgY29sbGVjdGlvbiAq
 > Lw0KK3N0YXRpYyBpbnQgYWxsb2NhdGVkID0gMDsNCisNCisvKiBzZXQgZm9yIGRlYnVnZ2lu
 > ZyBpbmZvcm1hdGlvbiAqLw0KKyNkZWZpbmUgREVCVUdfU1RBVFMJCSgxPDwwKSAvKiBwcmlu
 > dCBjb2xsZWN0aW9uIHN0YXRpc3RpY3MgKi8NCisjZGVmaW5lIERFQlVHX0NPTExFQ1RBQkxF
 > CSgxPDwxKSAvKiBwcmludCBjb2xsZWN0YWJsZSBvYmplY3RzICovDQorI2RlZmluZSBERUJV
 > R19VTkNPTExFQ1RBQkxFCSgxPDwyKSAvKiBwcmludCB1bmNvbGxlY3RhYmxlIG9iamVjdHMg
 > Ki8NCisjZGVmaW5lIERFQlVHX0lOU1RBTkNFUwkJKDE8PDMpIC8qIHByaW50IGluc3RhbmNl
 > cyAqLw0KKyNkZWZpbmUgREVCVUdfT0JKRUNUUwkJKDE8PDQpIC8qIHByaW50IG90aGVyIG9i
 > amVjdHMgKi8NCisjZGVmaW5lIERFQlVHX0xFQUsJCURFQlVHX0NPTExFQ1RBQkxFIHwgXA0K
 > KwkJCQlERUJVR19VTkNPTExFQ1RBQkxFIHwgXA0KKwkJCQlERUJVR19JTlNUQU5DRVMgfCBc
 > DQorCQkJCURFQlVHX09CSkVDVFMNCitzdGF0aWMgaW50IGRlYnVnID0gREVCVUdfTEVBSzsN
 > CisNCisvKiBsaXN0IG9mIHVuY29sbGVjdGFibGUgb2JqZWN0cyAqLw0KK3N0YXRpYyBQeU9i
 > amVjdCAqZ2FyYmFnZSA9IE5VTEw7DQorDQorDQorLyoqKiBsaXN0IGZ1bmN0aW9ucyAoc2hv
 > dWxkIHByb2JhYmx5IGJlIG1hY3Jvcywgc3R1cGlkIGNvbXBpbGVycykgKioqLw0KKw0KK3N0
 > YXRpYyB2b2lkDQorTElTVF9JTklUKFB5R0NJbmZvICpsaXN0KQ0KK3sNCisJbGlzdC0+Z2Nf
 > cHJldiA9IGxpc3Q7DQorCWxpc3QtPmdjX25leHQgPSBsaXN0Ow0KK30NCisNCitzdGF0aWMg
 > dm9pZA0KK0xJU1RfQVBQRU5EKFB5R0NJbmZvICpub2RlLCBQeUdDSW5mbyAqbGlzdCkNCit7
 > DQorCW5vZGUtPmdjX25leHQgPSBsaXN0Ow0KKwlub2RlLT5nY19wcmV2ID0gbGlzdC0+Z2Nf
 > cHJldjsNCisJbm9kZS0+Z2NfcHJldi0+Z2NfbmV4dCA9IG5vZGU7DQorCWxpc3QtPmdjX3By
 > ZXYgPSBub2RlOw0KK30NCisNCitzdGF0aWMgdm9pZA0KK0xJU1RfUkVNT1ZFKFB5R0NJbmZv
 > ICpub2RlKQ0KK3sNCisJbm9kZS0+Z2NfcHJldi0+Z2NfbmV4dCA9IG5vZGUtPmdjX25leHQ7
 > DQorCW5vZGUtPmdjX25leHQtPmdjX3ByZXYgPSBub2RlLT5nY19wcmV2Ow0KK30NCisNCitz
 > dGF0aWMgdm9pZCANCitMSVNUX01PVkUoUHlHQ0luZm8gKmZyb20sIFB5R0NJbmZvICp0bykN
 > Cit7DQorCWlmIChmcm9tLT5nY19uZXh0ID09IGZyb20pIHsNCisJCS8qIGVtcHR5IGZyb20g
 > bGlzdCAqLw0KKwkJTElTVF9JTklUKHRvKTsNCisJfSBlbHNlIHsNCisJCXRvLT5nY19uZXh0
 > ID0gZnJvbS0+Z2NfbmV4dDsNCisJCXRvLT5nY19uZXh0LT5nY19wcmV2ID0gdG87DQorCQl0
 > by0+Z2NfcHJldiA9IGZyb20tPmdjX3ByZXY7DQorCQl0by0+Z2NfcHJldi0+Z2NfbmV4dCA9
 > IHRvOw0KKwl9DQorCUxJU1RfSU5JVChmcm9tKTsNCit9DQorDQorLyogYXBwZW5kIGEgbGlz
 > dCBvbnRvIGFub3RoZXIgbGlzdCAqLw0KK3N0YXRpYyB2b2lkDQorTElTVF9MQVBQRU5EKFB5
 > R0NJbmZvICpmcm9tLCBQeUdDSW5mbyAqdG8pDQorew0KKwlQeUdDSW5mbyAqdGFpbDsNCisJ
 > aWYgKGZyb20tPmdjX25leHQgIT0gZnJvbSkgew0KKwkJdGFpbCA9IHRvLT5nY19wcmV2Ow0K
 > KwkJdGFpbC0+Z2NfbmV4dCA9IGZyb20tPmdjX25leHQ7DQorCQl0YWlsLT5nY19uZXh0LT5n
 > Y19wcmV2ID0gdGFpbDsNCisJCXRvLT5nY19wcmV2ID0gZnJvbS0+Z2NfcHJldjsNCisJCXRv
 > LT5nY19wcmV2LT5nY19uZXh0ID0gdG87DQorCX0NCisJTElTVF9JTklUKGZyb20pOw0KK30N
 > CisNCitzdGF0aWMgbG9uZw0KK0xJU1RfU0laRShQeUdDSW5mbyAqbGlzdCkNCit7DQorCVB5
 > R0NJbmZvICpnYzsNCisJbG9uZyBuID0gMDsNCisJZm9yIChnYyA9IGxpc3QtPmdjX25leHQ7
 > IGdjICE9IGxpc3Q7IGdjID0gZ2MtPmdjX25leHQpIHsNCisJCW4rKzsNCisJfQ0KKwlyZXR1
 > cm4gbjsNCit9DQorDQorDQorI2lmZGVmIERFQlVHDQorc3RhdGljIHZvaWQNCitsaXN0X3By
 > aW50KFB5R0NJbmZvICpsaXN0KSB7DQorCVB5R0NJbmZvICpvcCA9IGxpc3Q7DQorCWRvIHsN
 > CisJCXByaW50ZigiJXggJXggJXggJWRcbiIsIChsb25nKW9wLCAobG9uZylvcC0+Z2NfcHJl
 > diwgDQorCQkJCShsb25nKW9wLT5nY19uZXh0LCAobG9uZylvcC0+Z2NfcmVmcyk7DQorDQor
 > CQlvcCA9IG9wLT5nY19uZXh0Ow0KKwl9IHdoaWxlIChvcCAhPSBsaXN0KTsNCit9DQorI2Vu
 > ZGlmDQorDQorLyoqKiBlbmQgb2YgbGlzdCBzdHVmZiAqKiovDQorDQorDQorLyogU2V0IGFs
 > bCBnY19yZWZzID0gb2JfcmVmY250ICovDQorc3RhdGljIHZvaWQNCit1cGRhdGVfcmVmcyhQ
 > eUdDSW5mbyAqY29udGFpbmVycykNCit7DQorCVB5R0NJbmZvICpnYyA9IGNvbnRhaW5lcnMt
 > PmdjX25leHQ7DQorCWZvciAoOyBnYyAhPSBjb250YWluZXJzOyBnYz1nYy0+Z2NfbmV4dCkg
 > ew0KKwkJZ2MtPmdjX3JlZnMgPSBQWV9HQ09CSihnYyktPm9iX3JlZmNudDsNCisJfQ0KK30N
 > CisNCitzdGF0aWMgaW50DQordmlzaXRfZGVjcmVmKFB5T2JqZWN0ICpvcCwgdm9pZCAqZGF0
 > YSkNCit7DQorCWlmIChvcCAmJiBQWV9JU0dDKG9wKSkgew0KKwkJUFlfR0NJTkZPX1VOU0FG
 > RShvcCktPmdjX3JlZnMtLTsNCisJfQ0KKwlyZXR1cm4gMTsNCit9DQorDQorLyogU3VidHJh
 > Y3QgaW50ZXJuYWwgcmVmZXJlbmNlcyBmcm9tIGdjX3JlZnMgKi8NCitzdGF0aWMgdm9pZA0K
 > K3N1YnRyYWN0X3JlZnMoUHlHQ0luZm8gKmNvbnRhaW5lcnMpDQorew0KKwlyZWN1cnNlcHJv
 > YyByZWN1cnNlOw0KKwlQeUdDSW5mbyAqZ2MgPSBjb250YWluZXJzLT5nY19uZXh0Ow0KKwlm
 > b3IgKDsgZ2MgIT0gY29udGFpbmVyczsgZ2M9Z2MtPmdjX25leHQpIHsNCisJCXJlY3Vyc2Ug
 > PSBQWV9HQ09CSihnYyktPm9iX3R5cGUtPnRwX3JlY3Vyc2U7DQorCQkodm9pZCkgcmVjdXJz
 > ZShQWV9HQ09CSihnYyksDQorCQkJICAgICAgICh2aXNpdHByb2MpdmlzaXRfZGVjcmVmLA0K
 > KwkJCSAgICAgICBOVUxMKTsNCisJfQ0KK30NCisNCisvKiBBcHBlbmQgb2JqZWN0cyB3aXRo
 > IGdjX3JlZnMgPiAwIHRvIHJvb3RzIGxpc3QgKi8NCitzdGF0aWMgdm9pZA0KK21vdmVfcm9v
 > dHMoUHlHQ0luZm8gKmNvbnRhaW5lcnMsIFB5R0NJbmZvICpyb290cykNCit7DQorCVB5R0NJ
 > bmZvICpuZXh0Ow0KKwlQeUdDSW5mbyAqZ2MgPSBjb250YWluZXJzLT5nY19uZXh0Ow0KKwl3
 > aGlsZSAoZ2MgIT0gY29udGFpbmVycykgew0KKwkJbmV4dCA9IGdjLT5nY19uZXh0Ow0KKwkJ
 > aWYgKGdjLT5nY19yZWZzID4gMCkgew0KKwkJCUxJU1RfUkVNT1ZFKGdjKTsNCisJCQlMSVNU
 > X0FQUEVORChnYywgcm9vdHMpOw0KKwkJCWdjLT5nY19yZWZzID0gR0NfTU9WRUQ7DQorCQl9
 > DQorCQlnYyA9IG5leHQ7DQorCX0NCit9DQorDQorc3RhdGljIGludA0KK3Zpc2l0X3JlYWNo
 > YWJsZShQeU9iamVjdCAqb3AsIFB5R0NJbmZvICpyb290cykNCit7DQorCVB5R0NJbmZvICpn
 > YyA9IFBZX0dDSU5GTyhvcCk7DQorCWlmIChnYyAmJiBnYy0+Z2NfcmVmcyAhPSBHQ19NT1ZF
 > RCkgew0KKwkJTElTVF9SRU1PVkUoZ2MpOw0KKwkJTElTVF9BUFBFTkQoZ2MsIHJvb3RzKTsN
 > CisJCWdjLT5nY19yZWZzID0gR0NfTU9WRUQ7DQorCX0NCisJcmV0dXJuIDE7DQorfQ0KKw0K
 > Ky8qIE1vdmUgb2JqZWN0cyByZWZlcmVuY2VkIGZyb20gcmVhY2hhYmxlIHRvIHJlYWNoYWJs
 > ZSBzZXQuICovDQorc3RhdGljIHZvaWQNCittb3ZlX3Jvb3RfcmVhY2hhYmxlKFB5R0NJbmZv
 > ICpyZWFjaGFibGUpDQorew0KKwlyZWN1cnNlcHJvYyByZWN1cnNlOw0KKwlQeUdDSW5mbyAq
 > Z2MgPSByZWFjaGFibGUtPmdjX25leHQ7DQorCWZvciAoOyBnYyAhPSByZWFjaGFibGU7IGdj
 > PWdjLT5nY19uZXh0KSB7DQorCQkvKiBjYXJlZnVsLCByZWFjaGFibGUgbGlzdCBpcyBncm93
 > aW5nIGhlcmUgKi8NCisJCVB5T2JqZWN0ICpvcCA9IFBZX0dDT0JKKGdjKTsNCisJCXJlY3Vy
 > c2UgPSBvcC0+b2JfdHlwZS0+dHBfcmVjdXJzZTsNCisJCSh2b2lkKSByZWN1cnNlKG9wLA0K
 > KwkJCSAgICAgICAodmlzaXRwcm9jKXZpc2l0X3JlYWNoYWJsZSwNCisJCQkgICAgICAgKHZv
 > aWQgKilyZWFjaGFibGUpOw0KKwl9DQorfQ0KKw0KKy8qIG1vdmUgYWxsIG9iamVjdHMgd2l0
 > aCBmaW5hbGl6ZXJzIChpbnN0YW5jZXMgd2l0aCBfX2RlbF9fKSAqLw0KK3N0YXRpYyB2b2lk
 > DQorbW92ZV9maW5hbGl6ZXJzKFB5R0NJbmZvICp1bnJlYWNoYWJsZSwgUHlHQ0luZm8gKmZp
 > bmFsaXplcnMpDQorew0KKwlQeUdDSW5mbyAqbmV4dDsNCisJUHlHQ0luZm8gKmdjID0gdW5y
 > ZWFjaGFibGUtPmdjX25leHQ7DQorCXN0YXRpYyBQeU9iamVjdCAqZGVsc3RyOw0KKwlpZiAo
 > ZGVsc3RyID09IE5VTEwpIHsNCisJCWRlbHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJp
 > bmcoIl9fZGVsX18iKTsNCisJfQ0KKwlmb3IgKDsgZ2MgIT0gdW5yZWFjaGFibGU7IGdjPW5l
 > eHQpIHsNCisJCVB5T2JqZWN0ICpvcCA9IFBZX0dDT0JKKGdjKTsNCisJCW5leHQgPSBnYy0+
 > Z2NfbmV4dDsNCisJCWlmIChQeUluc3RhbmNlX0NoZWNrKG9wKSAmJiBQeU9iamVjdF9IYXNB
 > dHRyKG9wLCBkZWxzdHIpKSB7DQorCQkJTElTVF9SRU1PVkUoZ2MpOw0KKwkJCUxJU1RfQVBQ
 > RU5EKGdjLCBmaW5hbGl6ZXJzKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisvKiBjYWxsZWQg
 > YnkgdHBfcmVjdXJzZSAqLw0KK3N0YXRpYyBpbnQNCit2aXNpdF9maW5hbGl6ZXJfcmVhY2hh
 > YmxlKFB5T2JqZWN0ICpvcCwgUHlHQ0luZm8gKmZpbmFsaXplcnMpDQorew0KKwlQeUdDSW5m
 > byAqZ2MgPSBQWV9HQ0lORk8ob3ApOw0KKwlpZiAoZ2MgJiYgZ2MtPmdjX3JlZnMgIT0gR0Nf
 > TU9WRUQpIHsNCisJCUxJU1RfUkVNT1ZFKGdjKTsNCisJCUxJU1RfQVBQRU5EKGdjLCBmaW5h
 > bGl6ZXJzKTsNCisJCWdjLT5nY19yZWZzID0gR0NfTU9WRUQ7DQorCX0NCisJcmV0dXJuIDE7
 > DQorfQ0KKw0KKy8qIE1vdmUgb2JqZWN0cyByZWZlcmVuY2VkIGZyb20gcm9vdHMgdG8gcm9v
 > dHMgKi8NCitzdGF0aWMgdm9pZA0KK21vdmVfZmluYWxpemVyX3JlYWNoYWJsZShQeUdDSW5m
 > byAqZmluYWxpemVycykNCit7DQorCXJlY3Vyc2Vwcm9jIHJlY3Vyc2U7DQorCVB5R0NJbmZv
 > ICpnYyA9IGZpbmFsaXplcnMtPmdjX25leHQ7DQorCWZvciAoOyBnYyAhPSBmaW5hbGl6ZXJz
 > OyBnYz1nYy0+Z2NfbmV4dCkgew0KKwkJLyogY2FyZWZ1bCwgZmluYWxpemVycyBsaXN0IGlz
 > IGdyb3dpbmcgaGVyZSAqLw0KKwkJcmVjdXJzZSA9IFBZX0dDT0JKKGdjKS0+b2JfdHlwZS0+
 > dHBfcmVjdXJzZTsNCisJCSh2b2lkKSByZWN1cnNlKFBZX0dDT0JKKGdjKSwgDQorCQkJICAg
 > ICAgICh2aXNpdHByb2MpdmlzaXRfZmluYWxpemVyX3JlYWNoYWJsZSwNCisJCQkgICAgICAg
 > KHZvaWQgKilmaW5hbGl6ZXJzKTsNCisJfQ0KK30NCisNCitzdGF0aWMgdm9pZA0KK2RlYnVn
 > X2luc3RhbmNlKFB5T2JqZWN0ICpvdXRwdXQsIGNoYXIgKm1zZywgUHlJbnN0YW5jZU9iamVj
 > dCAqaW5zdCkNCit7DQorCWNoYXIgYnVmWzIwMF07DQorCWNoYXIgKmNuYW1lOw0KKwkvKiBi
 > ZSBjYXJlZnVsIG5vdCB0byBjcmVhdGUgbmV3IGRpY3Rpb25hcmllcyAqLw0KKwlQeU9iamVj
 > dCAqY2xhc3NuYW1lID0gaW5zdC0+aW5fY2xhc3MtPmNsX25hbWU7DQorCWlmIChjbGFzc25h
 > bWUgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhjbGFzc25hbWUpKQ0KKwkJY25hbWUgPSBQ
 > eVN0cmluZ19Bc1N0cmluZyhjbGFzc25hbWUpOw0KKwllbHNlDQorCQljbmFtZSA9ICI/IjsN
 > CisJc3ByaW50ZihidWYsICJnYzogJXM8JS4xMDBzIGluc3RhbmNlIGF0ICVseD5cbiIsIA0K
 > KwkJCW1zZywgY25hbWUsIChsb25nKWluc3QpOw0KKwlQeUZpbGVfV3JpdGVTdHJpbmcoYnVm
 > LCBvdXRwdXQpOw0KK30NCisNCitzdGF0aWMgdm9pZA0KK2RlYnVnX2N5Y2xlKFB5T2JqZWN0
 > ICpvdXRwdXQsIGNoYXIgKm1zZywgUHlPYmplY3QgKm9wKQ0KK3sNCisJaWYgKChkZWJ1ZyAm
 > IERFQlVHX0lOU1RBTkNFUykgJiYgUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsNCisJCWRlYnVn
 > X2luc3RhbmNlKG91dHB1dCwgbXNnLCAoUHlJbnN0YW5jZU9iamVjdCAqKW9wKTsNCisJfSBl
 > bHNlIGlmIChkZWJ1ZyAmIERFQlVHX09CSkVDVFMpIHsNCisJCWNoYXIgYnVmWzIwMF07DQor
 > CQlzcHJpbnRmKGJ1ZiwgImdjOiAlczxPYmplY3QgMHgleD5cbiIsIG1zZywgKGxvbmcpb3Ap
 > Ow0KKwkJUHlGaWxlX1dyaXRlU3RyaW5nKGJ1Ziwgb3V0cHV0KTsNCisJfQ0KK30NCisNCisv
 > KiBIYW5kbGUgdW5jb2xsZWN0YWJsZSBnYXJiYWdlIChjeWNsZXMgd2l0aCBmaW5hbGl6ZXJz
 > KS4gKi8NCitzdGF0aWMgdm9pZA0KK2hhbmRsZV9maW5hbGl6ZXJzKFB5R0NJbmZvICpmaW5h
 > bGl6ZXJzLCBQeUdDSW5mbyAqb2xkKQ0KK3sNCisJUHlHQ0luZm8gKmdjOw0KKwlpZiAoZ2Fy
 > YmFnZSA9PSBOVUxMKSB7DQorCQlnYXJiYWdlID0gUHlMaXN0X05ldygwKTsNCisJfQ0KKwlm
 > b3IgKGdjID0gZmluYWxpemVycy0+Z2NfbmV4dDsgZ2MgIT0gZmluYWxpemVyczsNCisJCQln
 > YyA9IGZpbmFsaXplcnMtPmdjX25leHQpIHsNCisJCVB5T2JqZWN0ICpvcCA9IFBZX0dDT0JK
 > KGdjKTsNCisJCS8qIEFkZCBhbGwgaW5zdGFuY2VzIHRvIGEgUHl0aG9uIGFjY2Vzc2libGUg
 > bGlzdCBvZiBnYXJiYWdlICovDQorCQlpZiAoUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsNCisJ
 > CQlQeUxpc3RfQXBwZW5kKGdhcmJhZ2UsIG9wKTsNCisJCX0NCisJCS8qIFdlIGFzc3VtZSB0
 > aGF0IGFsbCBvYmplY3RzIGluIGZpbmFsaXplcnMgYXJlIHJlYWNoYWJsZSBmcm9tDQorCQkg
 > KiBpbnN0YW5jZXMuICBPbmNlIHdlIGFkZCB0aGUgaW5zdGFuY2VzIHRvIHRoZSBnYXJiYWdl
 > IGxpc3QNCisJCSAqIGV2ZXJ5dGhpbmcgaXMgcmVhY2hhYmxlIGZyb20gUHl0aG9uIGFnYWlu
 > LiAqLw0KKwkJTElTVF9SRU1PVkUoZ2MpOw0KKwkJTElTVF9BUFBFTkQoZ2MsIG9sZCk7DQor
 > CX0NCit9DQorDQorLyogQnJlYWsgcmVmZXJlbmNlIGN5Y2xlcyBieSBjbGVhcmluZyB0aGUg
 > Y29udGFpbmVycyBpbnZvbHZlZC4gIFRoaXMgaXMNCisgKiB0cmlja3kgYnVzaW5lc3MgYXMg
 > dGhlIGxpc3RzIGNhbiBiZSBjaGFuZ2luZyBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaA0KKyAq
 > IG9iamVjdHMgbWF5IGJlIGZyZWVkLiAgSXQgaXMgcG9zc2libGUgSSBzY3Jld2VkIHNvbWV0
 > aGluZyB1cCBoZXJlLiAqLw0KK3N0YXRpYyB2b2lkDQorZGVsZXRlX2dhcmJhZ2UoUHlHQ0lu
 > Zm8gKnVucmVhY2hhYmxlLCBQeUdDSW5mbyAqb2xkKQ0KK3sNCisJaW5xdWlyeSBjbGVhcjsN
 > CisNCisJd2hpbGUgKHVucmVhY2hhYmxlLT5nY19uZXh0ICE9IHVucmVhY2hhYmxlKSB7DQor
 > CQlQeUdDSW5mbyAqZ2MgPSB1bnJlYWNoYWJsZS0+Z2NfbmV4dDsNCisJCVB5T2JqZWN0ICpv
 > cCA9IFBZX0dDT0JKKGdjKTsNCisJCWlmICgoY2xlYXIgPSBvcC0+b2JfdHlwZS0+dHBfY2xl
 > YXIpICE9IE5VTEwpIHsNCisJCQlQeV9JTkNSRUYob3ApOw0KKwkJCWNsZWFyKChQeU9iamVj
 > dCAqKW9wKTsNCisJCQlQeV9ERUNSRUYob3ApOw0KKwkJfQ0KKwkJLyogb25seSB0cnkgdG8g
 > Y2FsbCB0cF9jbGVhciBvbmNlIGZvciBlYWNoIG9iamVjdCAqLw0KKwkJaWYgKHVucmVhY2hh
 > YmxlLT5nY19uZXh0ID09IGdjKSB7DQorCQkJLyogc3RpbGwgYWxpdmUsIG1vdmUgaXQsIGl0
 > IG1heSBkaWUgbGF0ZXIgKi8NCisJCQlMSVNUX1JFTU9WRShnYyk7DQorCQkJTElTVF9BUFBF
 > TkQoZ2MsIG9sZCk7DQorCQl9DQorCX0NCit9DQorDQorLyogVGhpcyBpcyB0aGUgbWFpbiBm
 > dW5jdGlvbi4gIFJlYWQgdGhpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGUNCisgKiBjb2xsZWN0
 > aW9uIHByb2Nlc3Mgd29ya3MuICovDQorc3RhdGljIGxvbmcNCitjb2xsZWN0KFB5R0NJbmZv
 > ICp5b3VuZywgUHlHQ0luZm8gKm9sZCkNCit7DQorCWxvbmcgbiA9IDA7DQorCWxvbmcgbSA9
 > IDA7DQorCVB5R0NJbmZvIHJlYWNoYWJsZTsNCisJUHlHQ0luZm8gdW5yZWFjaGFibGU7DQor
 > CVB5R0NJbmZvIGZpbmFsaXplcnM7DQorCVB5R0NJbmZvICpnYzsNCisJUHlPYmplY3QgKm91
 > dHB1dCA9IE5VTEw7DQorDQorCWlmIChkZWJ1Zykgew0KKwkJb3V0cHV0ID0gUHlTeXNfR2V0
 > T2JqZWN0KCJzdGRlcnIiKTsNCisJfQ0KKwlpZiAoZGVidWcgJiBERUJVR19TVEFUUykgew0K
 > KwkJY2hhciBidWZbMTAwXTsNCisJCXNwcmludGYoYnVmLCAiZ2M6IGNvbGxlY3RpbmcgZ2Vu
 > ZXJhdGlvbiAlZC4uLlxuIiwgZ2VuZXJhdGlvbik7DQorCQlQeUZpbGVfV3JpdGVTdHJpbmco
 > YnVmLG91dHB1dCk7DQorCQlzcHJpbnRmKGJ1ZiwgImdjOiBvYmplY3RzIGluIGVhY2ggZ2Vu
 > ZXJhdGlvbjogJWQgJWQgJWRcbiIsDQorCQkJTElTVF9TSVpFKCZnZW5lcmF0aW9uMCksDQor
 > CQkJTElTVF9TSVpFKCZnZW5lcmF0aW9uMSksDQorCQkJTElTVF9TSVpFKCZnZW5lcmF0aW9u
 > MikpOw0KKwkJUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZixvdXRwdXQpOw0KKwl9DQorDQorCS8q
 > IFVzaW5nIG9iX3JlZmNudCBhbmQgZ2NfcmVmcywgY2FsY3VsYXRlIHdoaWNoIG9iamVjdHMg
 > aW4gdGhlDQorCSAqIGNvbnRhaW5lciBzZXQgYXJlIHJlYWNoYWJsZSBmcm9tIG91dHNpZGUg
 > dGhlIHNldCAoaWUuIGhhdmUgYQ0KKwkgKiByZWZjb3VudCBncmVhdGVyIHRoYW4gMCB3aGVu
 > IGFsbCB0aGUgcmVmZXJlbmNlcyB3aXRoaW4gdGhlDQorCSAqIHNldCBhcmUgdGFrZW4gaW50
 > byBhY2NvdW50ICovDQorCXVwZGF0ZV9yZWZzKHlvdW5nKTsNCisJc3VidHJhY3RfcmVmcyh5
 > b3VuZyk7DQorDQorCS8qIE1vdmUgZXZlcnl0aGluZyByZWFjaGFibGUgZnJvbSBvdXRzaWRl
 > IHRoZSBzZXQgaW50byB0aGUNCisJICogcmVhY2hhYmxlIHNldCAoaWUuIGdjX3JlZnMgPiAw
 > KS4gIE5leHQsIG1vdmUgZXZlcnl0aGluZw0KKwkgKiByZWFjaGFibGUgZnJvbSBvYmplY3Rz
 > IGluIHRoZSByZWFjaGFibGUgc2V0LiAqLw0KKwlMSVNUX0lOSVQoJnJlYWNoYWJsZSk7DQor
 > CW1vdmVfcm9vdHMoeW91bmcsICZyZWFjaGFibGUpOw0KKwltb3ZlX3Jvb3RfcmVhY2hhYmxl
 > KCZyZWFjaGFibGUpOw0KKw0KKwkvKiBtb3ZlIHVucmVhY2hhYmxlIG9iamVjdHMgdG8gYSB0
 > ZW1wb3JhcnkgbGlzdCwgbmV3IG9iamVjdHMgY2FuIGJlDQorCSAqIGFsbG9jYXRlZCBhZnRl
 > ciB0aGlzIHBvaW50ICovDQorCUxJU1RfSU5JVCgmdW5yZWFjaGFibGUpOw0KKwlMSVNUX01P
 > VkUoeW91bmcsICZ1bnJlYWNoYWJsZSk7DQorCS8vTElTVF9JTklUKHlvdW5nKTsNCisNCisJ
 > LyogbW92ZSByZWFjaGFibGUgb2JqZWN0cyB0byBuZXh0IGdlbmVyYXRpb24gKi8NCisJTElT
 > VF9MQVBQRU5EKCZyZWFjaGFibGUsIG9sZCk7DQorDQorCS8qIE1vdmUgb2JqZWN0cyByZWFj
 > aGFibGUgZnJvbSBmaW5hbGl6ZXJzLCB3ZSBjYW4ndCBzYWZlbHkgZGVsZXRlDQorCSAqIHRo
 > ZW0uICBQeXRob24gcHJvZ3JhbW1lcnMgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gY3JlYXRl
 > IHN1Y2gNCisJICogdGhpbmdzLiAgRm9yIFB5dGhvbiBmaW5hbGl6ZXJzIG1lYW5zIGluc3Rh
 > bmNlIG9iamVjdHMgd2l0aA0KKwkgKiBfX2RlbF9fIG1ldGhvZHMuICovDQorCUxJU1RfSU5J
 > VCgmZmluYWxpemVycyk7DQorCW1vdmVfZmluYWxpemVycygmdW5yZWFjaGFibGUsICZmaW5h
 > bGl6ZXJzKTsNCisJbW92ZV9maW5hbGl6ZXJfcmVhY2hhYmxlKCZmaW5hbGl6ZXJzKTsNCisN
 > CisJLyogQ29sbGVjdCBzdGF0aXN0aWNzIG9uIGNvbGxlY3RhYmxlIG9iamVjdHMgZm91bmQg
 > YW5kIHByaW50DQorCSAqIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gKi8NCisJZm9yIChnYyA9
 > IHVucmVhY2hhYmxlLmdjX25leHQ7IGdjICE9ICZ1bnJlYWNoYWJsZTsNCisJCQlnYyA9IGdj
 > LT5nY19uZXh0KSB7DQorCQltKys7DQorCQlpZiAob3V0cHV0ICE9IE5VTEwgJiYgKGRlYnVn
 > ICYgREVCVUdfQ09MTEVDVEFCTEUpKSB7DQorCQkJZGVidWdfY3ljbGUob3V0cHV0LCAiY29s
 > bGVjdGFibGUgIiwgUFlfR0NPQkooZ2MpKTsNCisJCX0NCisJfQ0KKwkvKiBjYWxsIHRwX2Ns
 > ZWFyIG9uIG9iamVjdHMgaW4gdGhlIGNvbGxlY3RhYmxlIHNldC4gIFRoaXMgd2lsbCBjYXVz
 > ZQ0KKwkgKiB0aGUgcmVmZXJlbmNlIGN5Y2xlcyB0byBiZSBicm9rZW4uIEl0IG1heSBhbHNv
 > IGNhdXNlIHNvbWUgb2JqZWN0cyBpbg0KKwkgKiBmaW5hbGl6ZXJzIHRvIGJlIGZyZWVkICov
 > DQorCWRlbGV0ZV9nYXJiYWdlKCZ1bnJlYWNoYWJsZSwgb2xkKTsNCisNCisJLyogQ29sbGVj
 > dCBzdGF0aXN0aWNzIG9uIHVuY29sbGVjdGFibGUgb2JqZWN0cyBmb3VuZCBhbmQgcHJpbnQN
 > CisJICogZGVidWdnaW5nIGluZm9ybWF0aW9uLiAqLw0KKwlmb3IgKGdjID0gZmluYWxpemVy
 > cy5nY19uZXh0OyBnYyAhPSAmZmluYWxpemVyczsNCisJCQlnYyA9IGdjLT5nY19uZXh0KSB7
 > DQorCQluKys7DQorCQlpZiAob3V0cHV0ICE9IE5VTEwgJiYgKGRlYnVnICYgREVCVUdfVU5D
 > T0xMRUNUQUJMRSkpIHsNCisJCQlkZWJ1Z19jeWNsZShvdXRwdXQsICJ1bmNvbGxlY3RhYmxl
 > ICIsIFBZX0dDT0JKKGdjKSk7DQorCQl9DQorCX0NCisJaWYgKG91dHB1dCAhPSBOVUxMICYm
 > IChkZWJ1ZyAmIERFQlVHX1NUQVRTKSkgew0KKwkJaWYgKG0gPT0gMCAmJiBuID09IDApIHsN
 > CisJCQlQeUZpbGVfV3JpdGVTdHJpbmcoImdjOiBkb25lLlxuIiwgb3V0cHV0KTsNCisJCX0g
 > ZWxzZSB7DQorCQkJY2hhciBidWZbMjAwXTsNCisJCQlzcHJpbnRmKGJ1ZiwNCisJCQkJImdj
 > OiBkb25lLCAlZCB1bnJlYWNoYWJsZSwgJWQgdW5jb2xsZWN0YWJsZS5cbiIsDQorCQkJCW4r
 > bSwgbik7DQorCQkJUHlGaWxlX1dyaXRlU3RyaW5nKGJ1Ziwgb3V0cHV0KTsNCisJCX0NCisJ
 > fQ0KKw0KKwkvKiBBcHBlbmQgaW5zdGFuY2VzIGluIHRoZSB1bmNvbGxlY3RhYmxlIHNldCB0
 > byBhIFB5dGhvbg0KKwkgKiByZWFjaGFibGUgbGlzdCBvZiBnYXJiYWdlLiAgVGhlIHByb2dy
 > YW1tZXIgaGFzIHRvIGRlYWwgd2l0aA0KKwkgKiB0aGlzIGlmIHRoZXkgaW5zaXN0IG9uIGNy
 > ZWF0aW5nIHRoaXMgdHlwZSBvZiBzdHJ1Y3R1cmUuICovDQorCWhhbmRsZV9maW5hbGl6ZXJz
 > KCZmaW5hbGl6ZXJzLCBvbGQpOw0KKw0KKwlhbGxvY2F0ZWQgPSAwOw0KKwlQeUVycl9DbGVh
 > cigpOyAvKiBpbiBjYXNlIHdyaXRpbmcgdG8gc3lzLnN0ZGVyciBmYWlsZWQgKi8NCisJcmV0
 > dXJuIG4rbTsNCit9DQorDQorc3RhdGljIGxvbmcNCitjb2xsZWN0X2dlbmVyYXRpb25zKHZv
 > aWQpDQorew0KKwlzdGF0aWMgbG9uZyBjb2xsZWN0aW9uczAgPSAwOw0KKwlzdGF0aWMgbG9u
 > ZyBjb2xsZWN0aW9uczEgPSAwOw0KKwlsb25nIG47DQorDQorDQorCWlmIChjb2xsZWN0aW9u
 > czEgPiB0aHJlc2hvbGQyKSB7DQorCQlnZW5lcmF0aW9uID0gMjsNCisJCUxJU1RfTEFQUEVO
 > RCgmZ2VuZXJhdGlvbjAsICZnZW5lcmF0aW9uMik7DQorCQlMSVNUX0xBUFBFTkQoJmdlbmVy
 > YXRpb24xLCAmZ2VuZXJhdGlvbjIpOw0KKwkJaWYgKGdlbmVyYXRpb24yLmdjX25leHQgIT0g
 > JmdlbmVyYXRpb24yKSB7DQorCQkJbiA9IGNvbGxlY3QoJmdlbmVyYXRpb24yLCAmZ2VuZXJh
 > dGlvbjIpOw0KKwkJfQ0KKwkJY29sbGVjdGlvbnMxID0gMDsNCisJfSBlbHNlIGlmIChjb2xs
 > ZWN0aW9uczAgPiB0aHJlc2hvbGQxKSB7DQorCQlnZW5lcmF0aW9uID0gMTsNCisJCWNvbGxl
 > Y3Rpb25zMSsrOw0KKwkJTElTVF9MQVBQRU5EKCZnZW5lcmF0aW9uMCwgJmdlbmVyYXRpb24x
 > KTsNCisJCWlmIChnZW5lcmF0aW9uMS5nY19uZXh0ICE9ICZnZW5lcmF0aW9uMSkgew0KKwkJ
 > CW4gPSBjb2xsZWN0KCZnZW5lcmF0aW9uMSwgJmdlbmVyYXRpb24yKTsNCisJCX0NCisJCWNv
 > bGxlY3Rpb25zMCA9IDA7DQorCX0gZWxzZSB7DQorCQlnZW5lcmF0aW9uID0gMDsNCisJCWNv
 > bGxlY3Rpb25zMCsrOw0KKwkJaWYgKGdlbmVyYXRpb24wLmdjX25leHQgIT0gJmdlbmVyYXRp
 > b24wKSB7DQorCQkJbiA9IGNvbGxlY3QoJmdlbmVyYXRpb24wLCAmZ2VuZXJhdGlvbjEpOw0K
 > KwkJfQ0KKwl9DQorCXJldHVybiBuOw0KK30NCisNCit2b2lkDQorUHlHQ19JbnNlcnQoUHlP
 > YmplY3QgKm9wKQ0KK3sNCisJLyogY29sbGVjdGlvbiBsb2NrIHNpbmNlIGNvbGxlY3Rpbmcg
 > bWF5IGNhdXNlIGFsbG9jYXRpb25zICovDQorCXN0YXRpYyBpbnQgY29sbGVjdGluZyA9IDA7
 > DQorDQorI2lmZGVmIERFQlVHDQorCS8qZnByaW50ZihzdGRlcnIsICJJbnNlcnQgMHgleFxu
 > Iiwgb3ApOyovDQorI2VuZGlmDQorCWlmICh0aHJlc2hvbGQwICYmIGFsbG9jYXRlZCA+IHRo
 > cmVzaG9sZDAgJiYgIWNvbGxlY3RpbmcpIHsNCisJCWNvbGxlY3RpbmcrKzsNCisJCWNvbGxl
 > Y3RfZ2VuZXJhdGlvbnMoKTsNCisJCWNvbGxlY3RpbmctLTsNCisJfQ0KKwlhbGxvY2F0ZWQr
 > KzsNCisJTElTVF9BUFBFTkQoUFlfR0NJTkZPKG9wKSwgJmdlbmVyYXRpb24wKTsNCit9DQor
 > DQordm9pZA0KK1B5R0NfUmVtb3ZlKFB5T2JqZWN0ICpvcCkNCit7DQorI2lmZGVmIERFQlVH
 > DQorCS8qZnByaW50ZihzdGRlcnIsICJSZW1vdmUgMHgleFxuIiwgb3ApOyovDQorI2VuZGlm
 > DQorCWlmIChhbGxvY2F0ZWQgPiAwKSB7DQorCQlhbGxvY2F0ZWQtLTsNCisJfQ0KKwlMSVNU
 > X1JFTU9WRShQWV9HQ0lORk8ob3ApKTsNCit9DQorDQorDQorc3RhdGljIGNoYXIgY29sbGVj
 > dF9fZG9jX19bXSA9DQorImNvbGxlY3QoKSAtPiBuXG4iDQorIlxuIg0KKyJSdW4gYSBmdWxs
 > IGNvbGxlY3Rpb24uICBUaGUgbnVtYmVyIG9mIHVucmVhY2hhYmxlIG9iamVjdHMgaXMgcmV0
 > dXJuZWQuXG4iDQorOw0KKw0KK3N0YXRpYyBQeU9iamVjdCAqDQorUHlfY29sbGVjdChzZWxm
 > LCBhcmdzKQ0KKwlQeU9iamVjdCAqc2VsZjsNCisJUHlPYmplY3QgKmFyZ3M7DQorew0KKwls
 > b25nIG47DQorDQorCWlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkJLyogY2hlY2sg
 > bm8gYXJncyAqLw0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWdlbmVyYXRpb24gPSAyOw0KKwlM
 > SVNUX0xBUFBFTkQoJmdlbmVyYXRpb24wLCAmZ2VuZXJhdGlvbjIpOw0KKwlMSVNUX0xBUFBF
 > TkQoJmdlbmVyYXRpb24xLCAmZ2VuZXJhdGlvbjIpOw0KKwluID0gY29sbGVjdCgmZ2VuZXJh
 > dGlvbjIsICZnZW5lcmF0aW9uMik7DQorDQorCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwg
 > bik7DQorfQ0KKw0KK3N0YXRpYyBjaGFyIHNldF9kZWJ1Z19fZG9jX19bXSA9IA0KKyJzZXRf
 > ZGVidWcoZmxhZ3MpIC0+IE5vbmVcbiINCisiXG4iDQorIlNldCB0aGUgZ2FyYmFnZSBjb2xs
 > ZWN0aW9uIGRlYnVnZ2luZyBmbGFncy4gRGVidWdnaW5nIGluZm9ybWF0aW9uIGlzXG4iDQor
 > IndyaXR0ZW4gdG8gc3lzLnN0ZGVyci5cbiINCisiXG4iDQorImZsYWdzIGlzIGFuIGludGVn
 > ZXIgYW5kIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgYml0cyB0dXJuZWQgb246XG4iDQorIlxu
 > Ig0KKyIgIERFQlVHX1NUQVRTIC0gUHJpbnQgc3RhdGlzdGljcyBkdXJpbmcgY29sbGVjdGlv
 > bi5cbiINCisiICBERUJVR19DT0xMRUNUQUJMRSAtIFByaW50IGNvbGxlY3RhYmxlIG9iamVj
 > dHMgZm91bmQuXG4iDQorIiAgREVCVUdfVU5DT0xMRUNUQUJMRSAtIFByaW50IHVucmVhY2hh
 > YmxlIGJ1dCB1bmNvbGxlY3RhYmxlIG9iamVjdHMgZm91bmQuXG4iDQorIiAgREVCVUdfSU5T
 > VEFOQ0VTIC0gUHJpbnQgaW5zdGFuY2Ugb2JqZWN0cy5cbiINCisiICBERUJVR19PQkpFQ1RT
 > IC0gUHJpbnQgb2JqZWN0cyBvdGhlciB0aGFuIGluc3RhbmNlcy5cbiINCisiICBERUJVR19M
 > RUFLIC0gRGVidWcgbGVha2luZyBwcm9ncmFtcyAoZXZlcnl0aGluZyBidXQgU1RBVFMpLlxu
 > Ig0KKzsNCisNCitzdGF0aWMgUHlPYmplY3QgKg0KK1B5X3NldF9kZWJ1ZyhzZWxmLCBhcmdz
 > KQ0KKwlQeU9iamVjdCAqc2VsZjsNCisJUHlPYmplY3QgKmFyZ3M7DQorew0KKwlpZiAoIVB5
 > QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmZGVidWcpKQ0KKwkJcmV0dXJuIE5VTEw7DQor
 > DQorCVB5X0lOQ1JFRihQeV9Ob25lKTsNCisJcmV0dXJuIFB5X05vbmU7DQorfQ0KKw0KK3N0
 > YXRpYyBjaGFyIGdldF9kZWJ1Z19fZG9jX19bXSA9IA0KKyJnZXRfZGVidWcoKSAtPiBmbGFn
 > c1xuIg0KKyJcbiINCisiR2V0IHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gZGVidWdnaW5nIGZs
 > YWdzLlxuIg0KKzsNCisNCitzdGF0aWMgUHlPYmplY3QgKg0KK1B5X2dldF9kZWJ1ZyhzZWxm
 > LCBhcmdzKQ0KKwlQeU9iamVjdCAqc2VsZjsNCisJUHlPYmplY3QgKmFyZ3M7DQorew0KKwlp
 > ZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCS8qIG5vIGFyZ3MgKi8NCisJCXJldHVy
 > biBOVUxMOw0KKw0KKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGRlYnVnKTsNCit9DQor
 > DQorc3RhdGljIGNoYXIgc2V0X3RocmVzaF9fZG9jX19bXSA9DQorInNldF90aHJlc2hvbGQo
 > dGhyZXNob2xkMCwgW3RocmVob2xkMSwgdGhyZXNob2xkMl0pIC0+IE5vbmVcbiINCisiXG4i
 > DQorIlNldHMgdGhlIGNvbGxlY3Rpb24gdGhyZXNob2xkcy4gIFNldHRpbmcgdGhyZXNob2xk
 > MCB0byB6ZXJvIGRpc2FibGVzXG4iDQorImNvbGxlY3Rpb24uXG4iDQorOw0KKw0KK3N0YXRp
 > YyBQeU9iamVjdCAqDQorUHlfc2V0X3RocmVzaChzZWxmLCBhcmdzKQ0KKwlQeU9iamVjdCAq
 > c2VsZjsNCisJUHlPYmplY3QgKmFyZ3M7DQorew0KKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUo
 > YXJncywgIml8aWkiLCAmdGhyZXNob2xkMCwgDQorCQkJCSZ0aHJlc2hvbGQxLCAmdGhyZXNo
 > b2xkMikpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJUHlfSU5DUkVGKFB5X05vbmUpOw0KKwly
 > ZXR1cm4gUHlfTm9uZTsNCit9DQorDQorc3RhdGljIGNoYXIgZ2V0X3RocmVzaF9fZG9jX19b
 > XSA9DQorImdldF90cmVzaG9sZCgpIC0+ICh0aHJlc2hvbGQwLCB0aHJlc2hvbGQxLCB0aHJl
 > c2hvbGQyKVxuIg0KKyJcbiINCisiUmV0dXJuIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gdGhy
 > ZXNob2xkc1xuIg0KKzsNCisNCitzdGF0aWMgUHlPYmplY3QgKg0KK1B5X2dldF90aHJlc2go
 > c2VsZiwgYXJncykNCisJUHlPYmplY3QgKnNlbGY7DQorCVB5T2JqZWN0ICphcmdzOw0KK3sN
 > CisJaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQkvKiBubyBhcmdzICovDQorCQly
 > ZXR1cm4gTlVMTDsNCisNCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWkpIiwgdGhyZXNo
 > b2xkMCwgdGhyZXNob2xkMSwgdGhyZXNob2xkMik7DQorfQ0KKw0KKw0KK3N0YXRpYyBjaGFy
 > IGdjX19kb2NfXyBbXSA9DQorIlRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUg
 > Z2FyYmFnZSBjb2xsZWN0b3IgZm9yIHJlZmVyZW5jZSBjeWNsZXMuXG4iDQorIlxuIg0KKyJj
 > b2xsZWN0KCkgLS0gRG8gYSBmdWxsIGNvbGxlY3Rpb24gcmlnaHQgbm93LlxuIg0KKyJzZXRf
 > ZGVidWcoKSAtLSBTZXQgZGVidWdnaW5nIGZsYWdzLlxuIg0KKyJnZXRfZGVidWcoKSAtLSBH
 > ZXQgZGVidWdnaW5nIGZsYWdzLlxuIg0KKyJzZXRfdGhyZXNob2xkKCkgLS0gU2V0IHRoZSBj
 > b2xsZWN0aW9uIHRocmVzaG9sZHMuXG4iDQorImdldF90aHJlc2hvbGQoKSAtLSBSZXR1cm4g
 > dGhlIGN1cnJlbnQgdGhlIGNvbGxlY3Rpb24gdGhyZXNob2xkcy5cbiINCis7DQorDQorc3Rh
 > dGljIFB5TWV0aG9kRGVmIEdjTWV0aG9kc1tdID0gew0KKwl7InNldF9kZWJ1ZyIsCQlQeV9z
 > ZXRfZGVidWcsICBNRVRIX1ZBUkFSR1MsIHNldF9kZWJ1Z19fZG9jX199LA0KKwl7ImdldF9k
 > ZWJ1ZyIsCQlQeV9nZXRfZGVidWcsICBNRVRIX1ZBUkFSR1MsIGdldF9kZWJ1Z19fZG9jX199
 > LA0KKwl7InNldF90aHJlc2hvbGQiLAlQeV9zZXRfdGhyZXNoLCBNRVRIX1ZBUkFSR1MsIHNl
 > dF90aHJlc2hfX2RvY19ffSwNCisJeyJnZXRfdGhyZXNob2xkIiwJUHlfZ2V0X3RocmVzaCwg
 > TUVUSF9WQVJBUkdTLCBnZXRfdGhyZXNoX19kb2NfX30sDQorCXsiY29sbGVjdCIsCQlQeV9j
 > b2xsZWN0LCAgICBNRVRIX1ZBUkFSR1MsIGNvbGxlY3RfX2RvY19ffSwNCisJe05VTEwsCU5V
 > TEx9CQkvKiBTZW50aW5lbCAqLw0KK307DQorDQordm9pZA0KK2luaXRnYyh2b2lkKQ0KK3sN
 > CisJUHlPYmplY3QgKm07DQorCVB5T2JqZWN0ICpkOw0KKw0KKwltID0gUHlfSW5pdE1vZHVs
 > ZTQoImdjIiwNCisJCQkgICAgICBHY01ldGhvZHMsDQorCQkJICAgICAgZ2NfX2RvY19fLA0K
 > KwkJCSAgICAgIE5VTEwsDQorCQkJICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OKTsNCisJZCA9
 > IFB5TW9kdWxlX0dldERpY3QobSk7DQorCWlmIChnYXJiYWdlID09IE5VTEwpIHsNCisJCWdh
 > cmJhZ2UgPSBQeUxpc3RfTmV3KDApOw0KKwl9DQorCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQs
 > ICJnYXJiYWdlIiwgZ2FyYmFnZSk7DQorCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUJV
 > R19TVEFUUyIsDQorCQkJUHlJbnRfRnJvbUxvbmcoREVCVUdfU1RBVFMpKTsNCisJUHlEaWN0
 > X1NldEl0ZW1TdHJpbmcoZCwgIkRFQlVHX0NPTExFQ1RBQkxFIiwNCisJCQlQeUludF9Gcm9t
 > TG9uZyhERUJVR19DT0xMRUNUQUJMRSkpOw0KKwlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAi
 > REVCVUdfVU5DT0xMRUNUQUJMRSIsDQorCQkJUHlJbnRfRnJvbUxvbmcoREVCVUdfVU5DT0xM
 > RUNUQUJMRSkpOw0KKwlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVCVUdfSU5TVEFOQ0VT
 > IiwNCisJCQlQeUludF9Gcm9tTG9uZyhERUJVR19JTlNUQU5DRVMpKTsNCisJUHlEaWN0X1Nl
 > dEl0ZW1TdHJpbmcoZCwgIkRFQlVHX09CSkVDVFMiLA0KKwkJCVB5SW50X0Zyb21Mb25nKERF
 > QlVHX09CSkVDVFMpKTsNCisJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFQlVHX0xFQUsi
 > LA0KKwkJCVB5SW50X0Zyb21Mb25nKERFQlVHX0xFQUspKTsNCit9DQorDQotLS0gUHl0aG9u
 > LWN2cy9PYmplY3RzL2NsYXNzb2JqZWN0LmMJVHVlIEZlYiAyOSAxNDo1NToxNSAyMDAwDQor
 > KysgUHl0aG9uLWdjL09iamVjdHMvY2xhc3NvYmplY3QuYwlNb24gQXByIDI0IDIxOjE5OjE4
 > IDIwMDANCkBAIC0xMTAsNyArMTEwLDcgQEANCiAJCX0NCiAJCVB5X0lOQ1JFRihiYXNlcyk7
 > DQogCX0NCi0Jb3AgPSBQeU9iamVjdF9ORVcoUHlDbGFzc09iamVjdCwgJlB5Q2xhc3NfVHlw
 > ZSk7DQorCW9wID0gUHlPYmplY3RfTmV3KFB5Q2xhc3NPYmplY3QsICZQeUNsYXNzX1R5cGUp
 > Ow0KIAlpZiAob3AgPT0gTlVMTCkgew0KIAkJUHlfREVDUkVGKGJhc2VzKTsNCiAJCXJldHVy
 > biBOVUxMOw0KQEAgLTEzMSw2ICsxMzEsOSBAQA0KIAlQeV9YSU5DUkVGKG9wLT5jbF9nZXRh
 > dHRyKTsNCiAJUHlfWElOQ1JFRihvcC0+Y2xfc2V0YXR0cik7DQogCVB5X1hJTkNSRUYob3At
 > PmNsX2RlbGF0dHIpOw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCVB5R0NfSW5zZXJ0KChQ
 > eU9iamVjdCAqKW9wKTsNCisjZW5kaWYNCiAJcmV0dXJuIChQeU9iamVjdCAqKSBvcDsNCiB9
 > DQogDQpAQCAtMTQwLDEzICsxNDMsMTYgQEANCiBjbGFzc19kZWFsbG9jKG9wKQ0KIAlQeUNs
 > YXNzT2JqZWN0ICpvcDsNCiB7DQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJUHlHQ19SZW1v
 > dmUoKFB5T2JqZWN0ICopb3ApOw0KKyNlbmRpZg0KIAlQeV9ERUNSRUYob3AtPmNsX2Jhc2Vz
 > KTsNCiAJUHlfREVDUkVGKG9wLT5jbF9kaWN0KTsNCiAJUHlfWERFQ1JFRihvcC0+Y2xfbmFt
 > ZSk7DQogCVB5X1hERUNSRUYob3AtPmNsX2dldGF0dHIpOw0KIAlQeV9YREVDUkVGKG9wLT5j
 > bF9zZXRhdHRyKTsNCiAJUHlfWERFQ1JFRihvcC0+Y2xfZGVsYXR0cik7DQotCWZyZWUoKEFO
 > WSAqKW9wKTsNCisJUHlPYmplY3RfRGVsKChQeU9iamVjdCAqKW9wKTsNCiB9DQogDQogc3Rh
 > dGljIFB5T2JqZWN0ICoNCkBAIC0zODYsNiArMzkyLDIxIEBADQogCXJldHVybiByZXM7DQog
 > fQ0KIA0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorc3RhdGljIGludA0KK2NsYXNzX3JlY3Vy
 > c2UoUHlDbGFzc09iamVjdCAqbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICpjbG9zdXJlKQ0K
 > K3sNCisJaWYgKG8tPmNsX2Jhc2VzKSB2aXNpdChvLT5jbF9iYXNlcywgY2xvc3VyZSk7DQor
 > CWlmIChvLT5jbF9kaWN0KSB2aXNpdChvLT5jbF9kaWN0LCBjbG9zdXJlKTsNCisJaWYgKG8t
 > PmNsX25hbWUpIHZpc2l0KG8tPmNsX25hbWUsIGNsb3N1cmUpOw0KKwlpZiAoby0+Y2xfZ2V0
 > YXR0cikgdmlzaXQoby0+Y2xfZ2V0YXR0ciwgY2xvc3VyZSk7DQorCWlmIChvLT5jbF9zZXRh
 > dHRyKSB2aXNpdChvLT5jbF9zZXRhdHRyLCBjbG9zdXJlKTsNCisJaWYgKG8tPmNsX2RlbGF0
 > dHIpIHZpc2l0KG8tPmNsX2RlbGF0dHIsIGNsb3N1cmUpOw0KKwlyZXR1cm4gMTsNCit9DQor
 > I2VuZGlmIC8qIFdJVEhfQ1lDTEVfR0MgKi8NCisNCisNCiBQeVR5cGVPYmplY3QgUHlDbGFz
 > c19UeXBlID0gew0KIAlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQ0KIAkwLA0K
 > QEAgLTQwNiw2ICs0MjcsMTIgQEANCiAJKHJlcHJmdW5jKWNsYXNzX3N0ciwgLyp0cF9zdHIq
 > Lw0KIAkoZ2V0YXR0cm9mdW5jKWNsYXNzX2dldGF0dHIsIC8qdHBfZ2V0YXR0cm8qLw0KIAko
 > c2V0YXR0cm9mdW5jKWNsYXNzX3NldGF0dHIsIC8qdHBfc2V0YXR0cm8qLw0KKyNpZmRlZiBX
 > SVRIX0NZQ0xFX0dDDQorCTAsCQkvKiB0cF9hc19idWZmZXIgKi8NCisJUHlfVFBGTEFHU19E
 > RUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDSU5GTywgLyp0cF9mbGFncyovDQorCTAsCQkv
 > KiB0cF9kb2MgKi8NCisJKHJlY3Vyc2Vwcm9jKWNsYXNzX3JlY3Vyc2UsCS8qIHRwX3JlY3Vy
 > c2UgKi8NCisjZW5kaWYNCiB9Ow0KIA0KIGludA0KQEAgLTQ0NCwxMiArNDcxLDE1IEBADQog
 > CQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsNCiAJCXJldHVybiBOVUxMOw0KIAl9DQotCWlu
 > c3QgPSBQeU9iamVjdF9ORVcoUHlJbnN0YW5jZU9iamVjdCwgJlB5SW5zdGFuY2VfVHlwZSk7
 > DQorCWluc3QgPSBQeU9iamVjdF9OZXcoUHlJbnN0YW5jZU9iamVjdCwgJlB5SW5zdGFuY2Vf
 > VHlwZSk7DQogCWlmIChpbnN0ID09IE5VTEwpDQogCQlyZXR1cm4gTlVMTDsNCiAJUHlfSU5D
 > UkVGKGNsYXNzKTsNCiAJaW5zdC0+aW5fY2xhc3MgPSAoUHlDbGFzc09iamVjdCAqKWNsYXNz
 > Ow0KIAlpbnN0LT5pbl9kaWN0ID0gUHlEaWN0X05ldygpOw0KKyNpZmRlZiBXSVRIX0NZQ0xF
 > X0dDDQorCVB5R0NfSW5zZXJ0KChQeU9iamVjdCAqKWluc3QpOw0KKyNlbmRpZg0KIAlpZiAo
 > aW5zdC0+aW5fZGljdCA9PSBOVUxMKSB7DQogCQlQeV9ERUNSRUYoaW5zdCk7DQogCQlyZXR1
 > cm4gTlVMTDsNCkBAIC00OTgsMTEgKzUyOCwxNCBAQA0KIAlQeU9iamVjdCAqZXJyb3JfdHlw
 > ZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOw0KIAlQeU9iamVjdCAqZGVsOw0K
 > IAlzdGF0aWMgUHlPYmplY3QgKmRlbHN0cjsNCisJZXh0ZXJuIGxvbmcgX1B5X1JlZlRvdGFs
 > Ow0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCVB5R0NfUmVtb3ZlKChQeU9iamVjdCAqKWlu
 > c3QpOw0KKyNlbmRpZg0KIAkvKiBDYWxsIHRoZSBfX2RlbF9fIG1ldGhvZCBpZiBpdCBleGlz
 > dHMuICBGaXJzdCB0ZW1wb3JhcmlseQ0KIAkgICByZXZpdmUgdGhlIG9iamVjdCBhbmQgc2F2
 > ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8NCiAjaWZkZWYgUHlfVFJBQ0Vf
 > UkVGUw0KIAkvKiBtdWNoIHRvbyBjb21wbGljYXRlZCBpZiBQeV9UUkFDRV9SRUZTIGRlZmlu
 > ZWQgKi8NCi0JZXh0ZXJuIGxvbmcgX1B5X1JlZlRvdGFsOw0KIAlpbnN0LT5vYl90eXBlID0g
 > JlB5SW5zdGFuY2VfVHlwZTsNCiAJX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilpbnN0
 > KTsNCiAJX1B5X1JlZlRvdGFsLS07CQkvKiBjb21wZW5zYXRlIGZvciBpbmNyZW1lbnQgaW4g
 > TkVXUkVGICovDQpAQCAtNTUwLDYgKzU4Myw5IEBADQogI2lmZGVmIENPVU5UX0FMTE9DUw0K
 > IAkJaW5zdC0+b2JfdHlwZS0+dHBfZnJlZS0tOw0KICNlbmRpZg0KKyNpZmRlZiBXSVRIX0NZ
 > Q0xFX0dDDQorCQlQeUdDX0luc2VydCgoUHlPYmplY3QgKilpbnN0KTsNCisjZW5kaWYNCiAJ
 > CXJldHVybjsgLyogX19kZWxfXyBhZGRlZCBhIHJlZmVyZW5jZTsgZG9uJ3QgZGVsZXRlIG5v
 > dyAqLw0KIAl9DQogI2lmZGVmIFB5X1RSQUNFX1JFRlMNCkBAIC01NTcsMTEgKzU5MywxMCBA
 > QA0KIAlpbnN0LT5vYl90eXBlLT50cF9mcmVlLS07CS8qIGNvbXBlbnNhdGUgZm9yIGluY3Jl
 > bWVudCBpbiBVTlJFRiAqLw0KICNlbmRpZg0KIAlfUHlfRm9yZ2V0UmVmZXJlbmNlKChQeU9i
 > amVjdCAqKWluc3QpOw0KLQlpbnN0LT5vYl90eXBlID0gTlVMTDsNCiAjZW5kaWYgLyogUHlf
 > VFJBQ0VfUkVGUyAqLw0KIAlQeV9ERUNSRUYoaW5zdC0+aW5fY2xhc3MpOw0KIAlQeV9YREVD
 > UkVGKGluc3QtPmluX2RpY3QpOw0KLQlmcmVlKChBTlkgKilpbnN0KTsNCisJUHlPYmplY3Rf
 > RGVsKChQeU9iamVjdCAqKWluc3QpOw0KIH0NCiANCiBzdGF0aWMgUHlPYmplY3QgKg0KQEAg
 > LTg0MCw2ICs4NzUsMTYgQEANCiAJcmV0dXJuIG91dGNvbWU7DQogfQ0KIA0KKyNpZmRlZiBX
 > SVRIX0NZQ0xFX0dDDQorc3RhdGljIGludA0KK2luc3RhbmNlX3JlY3Vyc2UoUHlJbnN0YW5j
 > ZU9iamVjdCAqbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICpjbG9zdXJlKQ0KK3sNCisJaWYg
 > KG8tPmluX2NsYXNzKSB2aXNpdCgoUHlPYmplY3QgKikoby0+aW5fY2xhc3MpLCBjbG9zdXJl
 > KTsNCisJaWYgKG8tPmluX2RpY3QpIHZpc2l0KG8tPmluX2RpY3QsIGNsb3N1cmUpOw0KKwly
 > ZXR1cm4gMTsNCit9DQorI2VuZGlmIC8qIFdJVEhfQ1lDTEVfR0MgKi8NCisNCiBzdGF0aWMg
 > UHlPYmplY3QgKmdldGl0ZW1zdHIsICpzZXRpdGVtc3RyLCAqZGVsaXRlbXN0ciwgKmxlbnN0
 > cjsNCiANCiBzdGF0aWMgaW50DQpAQCAtMTQ2Myw3ICsxNTA4LDExIEBADQogCShnZXRhdHRy
 > b2Z1bmMpaW5zdGFuY2VfZ2V0YXR0ciwgLyp0cF9nZXRhdHRybyovDQogCShzZXRhdHRyb2Z1
 > bmMpaW5zdGFuY2Vfc2V0YXR0ciwgLyp0cF9zZXRhdHRybyovDQogICAgICAgICAwLCAvKiB0
 > cF9hc19idWZmZXIgKi8NCi0JUHlfVFBGTEFHU19ERUZBVUxULCAvKnRwX2ZsYWdzICovDQor
 > CVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQ0lORk8sIC8qdHBfZmxh
 > Z3MqLw0KKwkwLAkJLyogdHBfZG9jICovDQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJKHJl
 > Y3Vyc2Vwcm9jKWluc3RhbmNlX3JlY3Vyc2UsCS8qIHRwX3JlY3Vyc2UgKi8NCisjZW5kaWYN
 > CiB9Ow0KIA0KIA0KQEAgLTE0OTMsNyArMTU0Miw3IEBADQogCQlfUHlfTmV3UmVmZXJlbmNl
 > KChQeU9iamVjdCAqKWltKTsNCiAJfQ0KIAllbHNlIHsNCi0JCWltID0gUHlPYmplY3RfTkVX
 > KFB5TWV0aG9kT2JqZWN0LCAmUHlNZXRob2RfVHlwZSk7DQorCQlpbSA9IFB5T2JqZWN0X05l
 > dyhQeU1ldGhvZE9iamVjdCwgJlB5TWV0aG9kX1R5cGUpOw0KIAkJaWYgKGltID09IE5VTEwp
 > DQogCQkJcmV0dXJuIE5VTEw7DQogCX0NCi0tLSBQeXRob24tY3ZzL09iamVjdHMvZGljdG9i
 > amVjdC5jCVRodSBNYXIgMzAgMjI6MDI6NTIgMjAwMA0KKysrIFB5dGhvbi1nYy9PYmplY3Rz
 > L2RpY3RvYmplY3QuYwlTYXQgQXByICA4IDAyOjA5OjU5IDIwMDANCkBAIC0xMjEsNyArMTIx
 > LDcgQEANCiAJCWlmIChkdW1teSA9PSBOVUxMKQ0KIAkJCXJldHVybiBOVUxMOw0KIAl9DQot
 > CW1wID0gUHlPYmplY3RfTkVXKGRpY3RvYmplY3QsICZQeURpY3RfVHlwZSk7DQorCW1wID0g
 > UHlPYmplY3RfTmV3KGRpY3RvYmplY3QsICZQeURpY3RfVHlwZSk7DQogCWlmIChtcCA9PSBO
 > VUxMKQ0KIAkJcmV0dXJuIE5VTEw7DQogCW1wLT5tYV9zaXplID0gMDsNCkBAIC0xMjksNiAr
 > MTI5LDkgQEANCiAJbXAtPm1hX3RhYmxlID0gTlVMTDsNCiAJbXAtPm1hX2ZpbGwgPSAwOw0K
 > IAltcC0+bWFfdXNlZCA9IDA7DQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJUHlHQ19JbnNl
 > cnQoKFB5T2JqZWN0ICopbXApOw0KKyNlbmRpZg0KIAlyZXR1cm4gKFB5T2JqZWN0ICopbXA7
 > DQogfQ0KIA0KQEAgLTQ4MCw2ICs0ODMsOSBAQA0KIAlyZWdpc3RlciBpbnQgaTsNCiAJcmVn
 > aXN0ZXIgZGljdGVudHJ5ICplcDsNCiAJUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihtcCkNCisj
 > aWZkZWYgV0lUSF9DWUNMRV9HQw0KKwlQeUdDX1JlbW92ZSgoUHlPYmplY3QgKiltcCk7DQor
 > I2VuZGlmDQogCWZvciAoaSA9IDAsIGVwID0gbXAtPm1hX3RhYmxlOyBpIDwgbXAtPm1hX3Np
 > emU7IGkrKywgZXArKykgew0KIAkJaWYgKGVwLT5tZV9rZXkgIT0gTlVMTCkgew0KIAkJCVB5
 > X0RFQ1JFRihlcC0+bWVfa2V5KTsNCkBAIC00ODksNyArNDk1LDcgQEANCiAJCX0NCiAJfQ0K
 > IAlQeU1lbV9YREVMKG1wLT5tYV90YWJsZSk7DQotCVB5TWVtX0RFTChtcCk7DQorCVB5T2Jq
 > ZWN0X0RlbCgoUHlPYmplY3QgKiltcCk7DQogCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKG1wKQ0K
 > IH0NCiANCkBAIC0xMDM2LDYgKzEwNDIsMzMgQEANCiAJcmV0dXJuIFB5X05vbmU7DQogfQ0K
 > IA0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorc3RhdGljIGludA0KK2RpY3RfcmVjdXJzZShQ
 > eU9iamVjdCAqb3AsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqY2xvc3VyZSkNCit7DQorCWlu
 > dCBpID0gMDsNCisJUHlPYmplY3QgKnBrOw0KKwlQeU9iamVjdCAqcHY7DQorDQorCXdoaWxl
 > IChQeURpY3RfTmV4dChvcCwgJmksICZwaywgJnB2KSkgew0KKwkJaWYgKCF2aXNpdChwaywg
 > Y2xvc3VyZSkpIHsNCisJCQlyZXR1cm4gMDsNCisJCX0NCisJCWlmICghdmlzaXQocHYsIGNs
 > b3N1cmUpKSB7DQorCQkJcmV0dXJuIDA7DQorCQl9DQorCX0NCisJcmV0dXJuIDE7DQorfQ0K
 > Kw0KK3N0YXRpYyBpbnQNCitkaWN0X2djX2NsZWFyKFB5T2JqZWN0ICpvcCkNCit7DQorCVB5
 > RGljdF9DbGVhcihvcCk7DQorCXJldHVybiAwOw0KK30NCisjZW5kaWYgLyogV0lUSF9DWUNM
 > RV9HQyAqLw0KKw0KIHN0YXRpYyBQeU1ldGhvZERlZiBtYXBwX21ldGhvZHNbXSA9IHsNCiAJ
 > eyJoYXNfa2V5IiwJKFB5Q0Z1bmN0aW9uKWRpY3RfaGFzX2tleSwgICAgICBNRVRIX1ZBUkFS
 > R1N9LA0KIAl7ImtleXMiLAkoUHlDRnVuY3Rpb24pZGljdF9rZXlzfSwNCkBAIC0xMDcxLDYg
 > KzExMDQsMTggQEANCiAJMCwJCQkvKnRwX2FzX251bWJlciovDQogCTAsCQkJLyp0cF9hc19z
 > ZXF1ZW5jZSovDQogCSZkaWN0X2FzX21hcHBpbmcsCS8qdHBfYXNfbWFwcGluZyovDQorI2lm
 > ZGVmIFdJVEhfQ1lDTEVfR0MNCisJMCwJCS8qIHRwX2hhc2ggKi8NCisJMCwJCS8qIHRwX2Nh
 > bGwgKi8NCisJMCwJCS8qIHRwX3N0ciAqLw0KKwkwLAkJLyogdHBfZ2V0YXR0cm8gKi8NCisJ
 > MCwJCS8qIHRwX3NldGF0dHJvICovDQorCTAsCQkvKiB0cF9hc19idWZmZXIgKi8NCisJUHlf
 > VFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDSU5GTywgLyp0cF9mbGFncyov
 > DQorCTAsCQkvKiB0cF9kb2MgKi8NCisJKHJlY3Vyc2Vwcm9jKWRpY3RfcmVjdXJzZSwJLyog
 > dHBfcmVjdXJzZSAqLw0KKwkoaW5xdWlyeSlkaWN0X2djX2NsZWFyLAkJLyogdHBfY2xlYXIg
 > Ki8NCisjZW5kaWYNCiB9Ow0KIA0KIC8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdp
 > dGggb2xkIGRpY3Rpb25hcnkgaW50ZXJmYWNlICovDQotLS0gUHl0aG9uLWN2cy9PYmplY3Rz
 > L2Z1bmNvYmplY3QuYwlUaHUgTWF5IDIxIDE4OjU1OjM0IDE5OTgNCisrKyBQeXRob24tZ2Mv
 > T2JqZWN0cy9mdW5jb2JqZWN0LmMJU2F0IEFwciAgOCAwMjowOTo1MCAyMDAwDQpAQCAtNDAs
 > NyArNDAsNyBAQA0KIAlQeU9iamVjdCAqY29kZTsNCiAJUHlPYmplY3QgKmdsb2JhbHM7DQog
 > ew0KLQlQeUZ1bmN0aW9uT2JqZWN0ICpvcCA9IFB5T2JqZWN0X05FVyhQeUZ1bmN0aW9uT2Jq
 > ZWN0LA0KKwlQeUZ1bmN0aW9uT2JqZWN0ICpvcCA9IFB5T2JqZWN0X05ldyhQeUZ1bmN0aW9u
 > T2JqZWN0LA0KIAkJCQkJICAgICZQeUZ1bmN0aW9uX1R5cGUpOw0KIAlpZiAob3AgIT0gTlVM
 > TCkgew0KIAkJUHlPYmplY3QgKmRvYzsNCkBAIC02Myw2ICs2Myw5IEBADQogCQlQeV9JTkNS
 > RUYoZG9jKTsNCiAJCW9wLT5mdW5jX2RvYyA9IGRvYzsNCiAJfQ0KKyNpZmRlZiBXSVRIX0NZ
 > Q0xFX0dDDQorCVB5R0NfSW5zZXJ0KChQeU9iamVjdCAqKW9wKTsNCisjZW5kaWYNCiAJcmV0
 > dXJuIChQeU9iamVjdCAqKW9wOw0KIH0NCiANCkBAIC0xODYsMTIgKzE4OSwxNSBAQA0KIGZ1
 > bmNfZGVhbGxvYyhvcCkNCiAJUHlGdW5jdGlvbk9iamVjdCAqb3A7DQogew0KKyNpZmRlZiBX
 > SVRIX0NZQ0xFX0dDDQorCVB5R0NfUmVtb3ZlKChQeU9iamVjdCAqKW9wKTsNCisjZW5kaWYN
 > CiAJUHlfREVDUkVGKG9wLT5mdW5jX2NvZGUpOw0KIAlQeV9ERUNSRUYob3AtPmZ1bmNfZ2xv
 > YmFscyk7DQogCVB5X0RFQ1JFRihvcC0+ZnVuY19uYW1lKTsNCiAJUHlfWERFQ1JFRihvcC0+
 > ZnVuY19kZWZhdWx0cyk7DQogCVB5X1hERUNSRUYob3AtPmZ1bmNfZG9jKTsNCi0JUHlNZW1f
 > REVMKG9wKTsNCisJUHlPYmplY3RfRGVsKChQeU9iamVjdCAqKW9wKTsNCiB9DQogDQogc3Rh
 > dGljIFB5T2JqZWN0Kg0KQEAgLTIzOSw2ICsyNDUsMTkgQEANCiAJcmV0dXJuIGg7DQogfQ0K
 > IA0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorc3RhdGljIGludA0KK2Z1bmNfcmVjdXJzZShQ
 > eUZ1bmN0aW9uT2JqZWN0ICpmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmNsb3N1cmUpDQor
 > ew0KKwlpZiAoZi0+ZnVuY19jb2RlKSB2aXNpdChmLT5mdW5jX2NvZGUsIGNsb3N1cmUpOw0K
 > KwlpZiAoZi0+ZnVuY19nbG9iYWxzKSB2aXNpdChmLT5mdW5jX2dsb2JhbHMsIGNsb3N1cmUp
 > Ow0KKwlpZiAoZi0+ZnVuY19kZWZhdWx0cykgdmlzaXQoZi0+ZnVuY19kZWZhdWx0cywgY2xv
 > c3VyZSk7DQorCWlmIChmLT5mdW5jX2RvYykgdmlzaXQoZi0+ZnVuY19kb2MsIGNsb3N1cmUp
 > Ow0KKwlpZiAoZi0+ZnVuY19uYW1lKSB2aXNpdChmLT5mdW5jX25hbWUsIGNsb3N1cmUpOw0K
 > KwlyZXR1cm4gMTsNCit9DQorI2VuZGlmIC8qIFdJVEhfQ1lDTEVfR0MgKi8NCisNCiBQeVR5
 > cGVPYmplY3QgUHlGdW5jdGlvbl9UeXBlID0gew0KIAlQeU9iamVjdF9IRUFEX0lOSVQoJlB5
 > VHlwZV9UeXBlKQ0KIAkwLA0KQEAgLTI1NSw0ICsyNzQsMTQgQEANCiAJMCwJCS8qdHBfYXNf
 > c2VxdWVuY2UqLw0KIAkwLAkJLyp0cF9hc19tYXBwaW5nKi8NCiAJKGhhc2hmdW5jKWZ1bmNf
 > aGFzaCwgLyp0cF9oYXNoKi8NCisjaWZkZWYgV0lUSF9DWUNMRV9HQw0KKwkwLAkJLyp0cF9j
 > YWxsKi8NCisJMCwJCS8qdHBfc3RyKi8NCisJMCwJCS8qdHBfZ2V0YXR0cm8qLw0KKwkwLAkJ
 > Lyp0cF9zZXRhdHRybyovDQorCTAsCQkvKiB0cF9hc19idWZmZXIgKi8NCisJUHlfVFBGTEFH
 > U19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDSU5GTywgLyp0cF9mbGFncyovDQorCTAs
 > CQkvKiB0cF9kb2MgKi8NCisJKHJlY3Vyc2Vwcm9jKWZ1bmNfcmVjdXJzZSwJLyogdHBfcmVj
 > dXJzZSAqLw0KKyNlbmRpZg0KIH07DQotLS0gUHl0aG9uLWN2cy9PYmplY3RzL2xpc3RvYmpl
 > Y3QuYwlGcmkgTWFyIDI0IDIyOjMyOjMwIDIwMDANCisrKyBQeXRob24tZ2MvT2JqZWN0cy9s
 > aXN0b2JqZWN0LmMJTW9uIEFwciAyNCAyMToxNDo0MiAyMDAwDQpAQCAtNjEsMzQgKzYxLDM3
 > IEBADQogCWludCBpOw0KIAlQeUxpc3RPYmplY3QgKm9wOw0KIAlzaXplX3QgbmJ5dGVzOw0K
 > KwlQeU9iamVjdCAqKml0ZW07DQorDQogCWlmIChzaXplIDwgMCkgew0KIAkJUHlFcnJfQmFk
 > SW50ZXJuYWxDYWxsKCk7DQogCQlyZXR1cm4gTlVMTDsNCiAJfQ0KLQluYnl0ZXMgPSBzaXpl
 > ICogc2l6ZW9mKFB5T2JqZWN0ICopOw0KLQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8NCi0J
 > aWYgKG5ieXRlcyAvIHNpemVvZihQeU9iamVjdCAqKSAhPSAoc2l6ZV90KXNpemUpIHsNCi0J
 > CXJldHVybiBQeUVycl9Ob01lbW9yeSgpOw0KLQl9DQotCW9wID0gKFB5TGlzdE9iamVjdCAq
 > KSBtYWxsb2Moc2l6ZW9mKFB5TGlzdE9iamVjdCkpOw0KLQlpZiAob3AgPT0gTlVMTCkgew0K
 > LQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7DQotCX0NCi0JaWYgKHNpemUgPD0gMCkgew0K
 > LQkJb3AtPm9iX2l0ZW0gPSBOVUxMOw0KLQl9DQorCWlmIChzaXplID09IDApDQorCQlpdGVt
 > ID0gTlVMTDsNCiAJZWxzZSB7DQotCQlvcC0+b2JfaXRlbSA9IChQeU9iamVjdCAqKikgbWFs
 > bG9jKG5ieXRlcyk7DQotCQlpZiAob3AtPm9iX2l0ZW0gPT0gTlVMTCkgew0KLQkJCWZyZWUo
 > KEFOWSAqKW9wKTsNCisJCW5ieXRlcyA9IHNpemUgKiBzaXplb2YoUHlPYmplY3QgKik7DQor
 > CQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8NCisJCWlmIChuYnl0ZXMgLyBzaXplb2YoUHlP
 > YmplY3QgKikgIT0gKHNpemVfdClzaXplKSB7DQogCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5
 > KCk7DQogCQl9DQorCQlpdGVtID0gKFB5T2JqZWN0ICoqKSBtYWxsb2MobmJ5dGVzKTsNCisJ
 > CWlmIChpdGVtID09IE5VTEwpDQorCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7DQorCX0N
 > CisJb3AgPSBQeU9iamVjdF9OZXcoUHlMaXN0T2JqZWN0LCAmUHlMaXN0X1R5cGUpOw0KKwlp
 > ZiAob3AgPT0gTlVMTCkgew0KKwkJaWYgKGl0ZW0gIT0gTlVMTCkNCisJCQlmcmVlKChBTlkg
 > KilpdGVtKTsNCisJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOw0KIAl9DQotCW9wLT5vYl90
 > eXBlID0gJlB5TGlzdF9UeXBlOw0KIAlvcC0+b2Jfc2l6ZSA9IHNpemU7DQorCW9wLT5vYl9p
 > dGVtID0gaXRlbTsNCiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykNCiAJCW9wLT5vYl9p
 > dGVtW2ldID0gTlVMTDsNCi0JX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilvcCk7DQor
 > I2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisJUHlHQ19JbnNlcnQoKFB5T2JqZWN0ICopb3ApOw0K
 > KyNlbmRpZg0KIAlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOw0KIH0NCiANCkBAIC0yMTYsNiAr
 > MjE5LDkgQEANCiB7DQogCWludCBpOw0KIAlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG9wKQ0K
 > KyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCVB5R0NfUmVtb3ZlKChQeU9iamVjdCAqKW9wKTsN
 > CisjZW5kaWYNCiAJaWYgKG9wLT5vYl9pdGVtICE9IE5VTEwpIHsNCiAJCS8qIERvIGl0IGJh
 > Y2t3YXJkcywgZm9yIENocmlzdGlhbiBUaXNtZXIuDQogCQkgICBUaGVyZSdzIGEgc2ltcGxl
 > IHRlc3QgY2FzZSB3aGVyZSBzb21laG93IHRoaXMgcmVkdWNlcw0KQEAgLTIyNyw3ICsyMzMs
 > NyBAQA0KIAkJfQ0KIAkJZnJlZSgoQU5ZICopb3AtPm9iX2l0ZW0pOw0KIAl9DQotCWZyZWUo
 > KEFOWSAqKW9wKTsNCisJUHlPYmplY3RfRGVsKChQeU9iamVjdCAqKW9wKTsNCiAJUHlfVFJB
 > U0hDQU5fU0FGRV9FTkQob3ApDQogfQ0KIA0KQEAgLTEzOTksNiArMTQwNSwyOSBAQA0KIAly
 > ZXR1cm4gTlVMTDsNCiB9DQogDQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCitzdGF0aWMgaW50
 > DQorbGlzdF9yZWN1cnNlKFB5TGlzdE9iamVjdCAqbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lk
 > ICpjbG9zdXJlKQ0KK3sNCisJaW50IGk7DQorCVB5T2JqZWN0ICp4Ow0KKw0KKwlmb3IgKGkg
 > PSBvLT5vYl9zaXplOyAtLWkgPj0gMDsgKSB7DQorCQl4ID0gby0+b2JfaXRlbVtpXTsNCisJ
 > CWlmICh4ICE9IE5VTEwgJiYgIXZpc2l0KHgsIGNsb3N1cmUpKQ0KKwkJCXJldHVybiAwOw0K
 > Kwl9DQorCXJldHVybiAxOw0KK30NCisNCitzdGF0aWMgaW50DQorbGlzdF9jbGVhcihQeUxp
 > c3RPYmplY3QgKmxwKQ0KK3sNCisJKHZvaWQpIFB5TGlzdF9TZXRTbGljZSgoUHlPYmplY3Qg
 > KilscCwgMCwgbHAtPm9iX3NpemUsIDApOw0KKwlyZXR1cm4gMDsNCit9DQorI2VuZGlmIC8q
 > IFdJVEhfQ1lDTEVfR0MgKi8NCisNCiBzdGF0aWMgY2hhciBhcHBlbmRfZG9jW10gPQ0KICJM
 > LmFwcGVuZChvYmplY3QpIC0tIGFwcGVuZCBvYmplY3QgdG8gZW5kIjsNCiBzdGF0aWMgY2hh
 > ciBleHRlbmRfZG9jW10gPQ0KQEAgLTE0NjQsNiArMTQ5MywxOCBAQA0KIAkwLAkJLyp0cF9h
 > c19udW1iZXIqLw0KIAkmbGlzdF9hc19zZXF1ZW5jZSwJLyp0cF9hc19zZXF1ZW5jZSovDQog
 > CTAsCQkvKnRwX2FzX21hcHBpbmcqLw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCTAsCQkv
 > KiB0cF9oYXNoICovDQorCTAsCQkvKiB0cF9jYWxsICovDQorCTAsCQkvKiB0cF9zdHIgKi8N
 > CisJMCwJCS8qIHRwX2dldGF0dHJvICovDQorCTAsCQkvKiB0cF9zZXRhdHRybyAqLw0KKwkw
 > LAkJLyogdHBfYXNfYnVmZmVyICovDQorCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxB
 > R1NfSEFWRV9HQ0lORk8sCS8qIHRwX2ZsYWdzICovDQorCTAsCQkvKiB0cF9kb2MgKi8NCisJ
 > KHJlY3Vyc2Vwcm9jKWxpc3RfcmVjdXJzZSwJLyogdHBfcmVjdXJzZSAqLw0KKwkoaW5xdWly
 > eSlsaXN0X2NsZWFyLAkvKiB0cF9jbGVhciAqLw0KKyNlbmRpZg0KIH07DQogDQogDQpAQCAt
 > MTUzMiw1ICsxNTczLDE2IEBADQogCTAsCQkvKnRwX2FzX251bWJlciovDQogCSZpbW11dGFi
 > bGVfbGlzdF9hc19zZXF1ZW5jZSwJLyp0cF9hc19zZXF1ZW5jZSovDQogCTAsCQkvKnRwX2Fz
 > X21hcHBpbmcqLw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorCTAsCQkvKiB0cF9oYXNoICov
 > DQorCTAsCQkvKiB0cF9jYWxsICovDQorCTAsCQkvKiB0cF9zdHIgKi8NCisJMCwJCS8qIHRw
 > X2dldGF0dHJvICovDQorCTAsCQkvKiB0cF9zZXRhdHRybyAqLw0KKwkwLAkJLyogdHBfYXNf
 > YnVmZmVyICovDQorCVB5X1RQRkxBR1NfREVGQVVMVCwJLyogdHBfZmxhZ3MgKi8NCisJMCwJ
 > CS8qIHRwX2RvYyAqLw0KKwkocmVjdXJzZXByb2MpbGlzdF9yZWN1cnNlLAkvKiB0cF9yZWN1
 > cnNlICovDQorI2VuZGlmDQogfTsNCiANCi0tLSBQeXRob24tY3ZzL09iamVjdHMvb2JqZWN0
 > LmMJVHVlIE1hciAyOCAwODoxMTowOSAyMDAwDQorKysgUHl0aG9uLWdjL09iamVjdHMvb2Jq
 > ZWN0LmMJU2F0IEFwciAgOCAwMjoxMDowNiAyMDAwDQpAQCAtMTA3LDIwICsxMDcsMTIgQEAN
 > CiB9DQogI2VuZGlmDQogDQotI2lmbmRlZiBNU19DT1JFRExMDQotUHlPYmplY3QgKg0KLV9Q
 > eU9iamVjdF9OZXcodHApDQotCVB5VHlwZU9iamVjdCAqdHA7DQotI2Vsc2UNCisNCiBQeU9i
 > amVjdCAqDQotX1B5T2JqZWN0X05ldyh0cCxvcCkNCitfUHlPYmplY3RfRnJvbVR5cGUodHAs
 > b3ApDQogCVB5VHlwZU9iamVjdCAqdHA7DQogCVB5T2JqZWN0ICpvcDsNCi0jZW5kaWYNCiB7
 > DQotI2lmbmRlZiBNU19DT1JFRExMDQotCVB5T2JqZWN0ICpvcCA9IChQeU9iamVjdCAqKSBt
 > YWxsb2ModHAtPnRwX2Jhc2ljc2l6ZSk7DQotI2VuZGlmDQogCWlmIChvcCA9PSBOVUxMKQ0K
 > IAkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7DQogCW9wLT5vYl90eXBlID0gdHA7DQpAQCAt
 > MTI4LDI5ICsxMjAsNzggQEANCiAJcmV0dXJuIG9wOw0KIH0NCiANCi0jaWZuZGVmIE1TX0NP
 > UkVETEwNCi1QeVZhck9iamVjdCAqDQotX1B5T2JqZWN0X05ld1Zhcih0cCwgc2l6ZSkNCi0J
 > UHlUeXBlT2JqZWN0ICp0cDsNCi0JaW50IHNpemU7DQotI2Vsc2UNCiBQeVZhck9iamVjdCAq
 > DQotX1B5T2JqZWN0X05ld1Zhcih0cCwgc2l6ZSwgb3ApDQorX1B5T2JqZWN0X1ZhckZyb21U
 > eXBlKHRwLCBzaXplLCBvcCkNCiAJUHlUeXBlT2JqZWN0ICp0cDsNCiAJaW50IHNpemU7DQog
 > CVB5VmFyT2JqZWN0ICpvcDsNCi0jZW5kaWYNCiB7DQotI2lmbmRlZiBNU19DT1JFRExMDQot
 > CVB5VmFyT2JqZWN0ICpvcCA9IChQeVZhck9iamVjdCAqKQ0KLQkJbWFsbG9jKHRwLT50cF9i
 > YXNpY3NpemUgKyBzaXplICogdHAtPnRwX2l0ZW1zaXplKTsNCi0jZW5kaWYNCiAJaWYgKG9w
 > ID09IE5VTEwpDQogCQlyZXR1cm4gKFB5VmFyT2JqZWN0ICopUHlFcnJfTm9NZW1vcnkoKTsN
 > CiAJb3AtPm9iX3R5cGUgPSB0cDsNCiAJb3AtPm9iX3NpemUgPSBzaXplOw0KIAlfUHlfTmV3
 > UmVmZXJlbmNlKChQeU9iamVjdCAqKW9wKTsNCiAJcmV0dXJuIG9wOw0KK30NCisNCitQeU9i
 > amVjdCAqDQorX1B5T2JqZWN0X05ldyh0cCkNCisJUHlUeXBlT2JqZWN0ICp0cDsNCit7DQor
 > CVB5T2JqZWN0ICpvcDsNCisjaWZkZWYgV0lUSF9DWUNMRV9HQw0KKwlpZiAoUFlfVFlQRUlT
 > R0ModHApKSB7DQorCQlQeUdDSW5mbyAqZzsNCisJCWcgPSAoUHlHQ0luZm8gKikgbWFsbG9j
 > KHNpemVvZigqZykgKyB0cC0+dHBfYmFzaWNzaXplKTsNCisJCWlmIChnID09IE5VTEwpIHsN
 > CisJCQlvcCA9IE5VTEw7DQorCQl9IGVsc2Ugew0KKwkJCW9wID0gUFlfR0NPQkooZyk7DQor
 > CQl9DQorCX0gZWxzZQ0KKyNlbmRpZiAvKiBXSVRIX0NZQ0xFX0dDICovDQorCXsNCisJCW9w
 > ID0gKFB5T2JqZWN0ICopIG1hbGxvYyh0cC0+dHBfYmFzaWNzaXplKTsNCisJfQ0KKwlyZXR1
 > cm4gX1B5T2JqZWN0X0Zyb21UeXBlKHRwLCBvcCk7DQorfQ0KKw0KK1B5VmFyT2JqZWN0ICoN
 > CitfUHlPYmplY3RfTmV3VmFyKHRwLCBzaXplKQ0KKwlQeVR5cGVPYmplY3QgKnRwOw0KKwlp
 > bnQgc2l6ZTsNCit7DQorCVB5VmFyT2JqZWN0ICpvcDsNCisjaWZkZWYgV0lUSF9DWUNMRV9H
 > Qw0KKwlpZiAoUFlfVFlQRUlTR0ModHApKSB7DQorCQlQeUdDSW5mbyAqZzsNCisJCWcgPSAo
 > UHlHQ0luZm8gKikgbWFsbG9jKHNpemVvZigqZykgKyANCisJCQkJCXRwLT50cF9iYXNpY3Np
 > emUgKw0KKwkJCQkJc2l6ZSAqIHRwLT50cF9pdGVtc2l6ZSk7DQorCQlpZiAoZyA9PSBOVUxM
 > KSB7DQorCQkJb3AgPSBOVUxMOw0KKwkJfSBlbHNlIHsNCisJCQlvcCA9IChQeVZhck9iamVj
 > dCAqKVBZX0dDT0JKKGcpOw0KKwkJfQ0KKwl9IGVsc2UNCisjZW5kaWYgLyogV0lUSF9DWUNM
 > RV9HQyAqLw0KKwl7DQorCQlvcCA9IChQeVZhck9iamVjdCAqKQ0KKwkJCW1hbGxvYyh0cC0+
 > dHBfYmFzaWNzaXplICsgc2l6ZSAqIHRwLT50cF9pdGVtc2l6ZSk7DQorCX0NCisJcmV0dXJu
 > IF9QeU9iamVjdF9WYXJGcm9tVHlwZSh0cCwgc2l6ZSwgb3ApOw0KK30NCisNCit2b2lkDQor
 > UHlPYmplY3RfRGVsKG9wKQ0KKwlQeU9iamVjdCAqb3A7DQorew0KKyNpZmRlZiBXSVRIX0NZ
 > Q0xFX0dDDQorCWlmIChQWV9JU0dDKG9wKSkgew0KKwkJb3AgPSAoUHlPYmplY3QgKilQWV9H
 > Q0lORk9fVU5TQUZFKG9wKTsNCisJfQ0KKyNlbmRpZg0KKwlmcmVlKG9wKTsNCiB9DQogDQog
 > aW50DQotLS0gUHl0aG9uLWN2cy9PYmplY3RzL3R1cGxlb2JqZWN0LmMJRnJpIE1hciAyNCAy
 > MjozMjozMCAyMDAwDQorKysgUHl0aG9uLWdjL09iamVjdHMvdHVwbGVvYmplY3QuYwlNb24g
 > QXByIDI0IDIxOjIxOjU5IDIwMDANCkBAIC04Miw4ICs4Miw4IEBADQogI2VuZGlmDQogI2lm
 > ZGVmIFB5X1RSQUNFX1JFRlMNCiAJCW9wLT5vYl90eXBlID0gJlB5VHVwbGVfVHlwZTsNCi0J
 > CW9wLT5vYl9zaXplID0gc2l6ZTsNCiAjZW5kaWYNCisJCV9QeV9OZXdSZWZlcmVuY2UoKFB5
 > T2JqZWN0ICopb3ApOw0KIAl9DQogCWVsc2UNCiAjZW5kaWYNCkBAIC05NywyMyArOTcsMjMg
 > QEANCiAJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsNCiAJCX0NCiAJCTsNCi0JCW9wID0g
 > KFB5VHVwbGVPYmplY3QgKikgbWFsbG9jKG5ieXRlcyk7DQorCQlvcCA9IFB5T2JqZWN0X05l
 > d1ZhcihQeVR1cGxlT2JqZWN0LCAmUHlUdXBsZV9UeXBlLCBzaXplKTsNCiAJCWlmIChvcCA9
 > PSBOVUxMKQ0KIAkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOw0KIA0KLQkJb3AtPm9iX3R5
 > cGUgPSAmUHlUdXBsZV9UeXBlOw0KLQkJb3AtPm9iX3NpemUgPSBzaXplOw0KIAl9DQogCWZv
 > ciAoaSA9IDA7IGkgPCBzaXplOyBpKyspDQogCQlvcC0+b2JfaXRlbVtpXSA9IE5VTEw7DQot
 > CV9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopb3ApOw0KKw0KICNpZiBNQVhTQVZFU0la
 > RSA+IDANCiAJaWYgKHNpemUgPT0gMCkgew0KIAkJZnJlZV90dXBsZXNbMF0gPSBvcDsNCi0J
 > CSsrbnVtX2ZyZWVfdHVwbGVzWzBdOw0KIAkJUHlfSU5DUkVGKG9wKTsJLyogZXh0cmEgSU5D
 > UkVGIHNvIHRoYXQgdGhpcyBpcyBuZXZlciBmcmVlZCAqLw0KIAl9DQogI2VuZGlmDQorI2lm
 > ZGVmIFdJVEhfQ1lDTEVfR0MNCisJUHlHQ19JbnNlcnQoKFB5T2JqZWN0ICopb3ApOw0KKyNl
 > bmRpZg0KIAlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOw0KIH0NCiANCkBAIC0xODAsNiArMTgw
 > LDkgQEANCiAJcmVnaXN0ZXIgaW50IGk7DQogCXJlZ2lzdGVyIGludCBsZW4gPSAgb3AtPm9i
 > X3NpemU7DQogCVB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ob3ApDQorI2lmZGVmIFdJVEhfQ1lD
 > TEVfR0MNCisJUHlHQ19SZW1vdmUoKFB5T2JqZWN0ICopb3ApOw0KKyNlbmRpZg0KIAlpZiAo
 > bGVuID4gMCkgew0KIAkJaSA9IGxlbjsNCiAJCXdoaWxlICgtLWkgPj0gMCkNCkBAIC0xOTMs
 > NyArMTk2LDcgQEANCiAJCX0NCiAjZW5kaWYNCiAJfQ0KLQlmcmVlKChBTlkgKilvcCk7DQor
 > CVB5T2JqZWN0X0RlbCgoUHlPYmplY3QgKilvcCk7DQogZG9uZToNCiAJUHlfVFJBU0hDQU5f
 > U0FGRV9FTkQob3ApDQogfQ0KQEAgLTQwMSw2ICs0MDQsMjIgQEANCiAJcmV0dXJuIChQeU9i
 > amVjdCAqKSBucDsNCiB9DQogDQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCitzdGF0aWMgaW50
 > DQordHVwbGVyZWN1cnNlKFB5VHVwbGVPYmplY3QgKm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9p
 > ZCAqY2xvc3VyZSkNCit7DQorCWludCBpOw0KKwlQeU9iamVjdCAqeDsNCisNCisJZm9yIChp
 > ID0gby0+b2Jfc2l6ZTsgLS1pID49IDA7ICkgew0KKwkJeCA9IG8tPm9iX2l0ZW1baV07DQor
 > CQlpZiAoeCAhPSBOVUxMICYmICF2aXNpdCh4LCBjbG9zdXJlKSkNCisJCQlyZXR1cm4gMDsN
 > CisJfQ0KKwlyZXR1cm4gMTsNCit9DQorI2VuZGlmIC8qIFdJVEhfQ1lDTEVfR0MgKi8NCisN
 > CiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgdHVwbGVfYXNfc2VxdWVuY2UgPSB7DQogCShp
 > bnF1aXJ5KXR1cGxlbGVuZ3RoLCAvKnNxX2xlbmd0aCovDQogCShiaW5hcnlmdW5jKXR1cGxl
 > Y29uY2F0LCAvKnNxX2NvbmNhdCovDQpAQCAtNDI3LDYgKzQ0NiwxNiBAQA0KIAkmdHVwbGVf
 > YXNfc2VxdWVuY2UsCS8qdHBfYXNfc2VxdWVuY2UqLw0KIAkwLAkJLyp0cF9hc19tYXBwaW5n
 > Ki8NCiAJKGhhc2hmdW5jKXR1cGxlaGFzaCwgLyp0cF9oYXNoKi8NCisjaWZkZWYgV0lUSF9D
 > WUNMRV9HQw0KKwkwLAkJLyogdHBfY2FsbCAqLw0KKwkwLAkJLyogdHBfc3RyICovDQorCTAs
 > CQkvKiB0cF9nZXRhdHRybyAqLw0KKwkwLAkJLyogdHBfc2V0YXR0cm8gKi8NCisJMCwJCS8q
 > IHRwX2FzX2J1ZmZlciAqLw0KKwlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hB
 > VkVfR0NJTkZPLAkvKiB0cF9mbGFncyAqLw0KKwkwLAkJLyogdHBfZG9jICovDQorCShyZWN1
 > cnNlcHJvYyl0dXBsZXJlY3Vyc2UsCS8qIHRwX3JlY3Vyc2UgKi8NCisjZW5kaWYNCiB9Ow0K
 > IA0KIC8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYnJlYWtzIHRoZSBub3Rpb24gdGhhdCB0
 > dXBsZXMgYXJlIGltbXV0YWJsZToNCkBAIC00NDksNiArNDc4LDkgQEANCiAJaW50IGk7DQog
 > CWludCBzaXplZGlmZjsNCiANCisjaWZkZWYgV0lUSF9DWUNMRV9HQw0KKwlQeUdDSW5mbyAq
 > ZyA9IFBZX0dDSU5GTygqcHYpOyANCisjZW5kaWYNCiAJdiA9IChQeVR1cGxlT2JqZWN0ICop
 > ICpwdjsNCiAJaWYgKHYgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayh2KSB8fCB2LT5vYl9y
 > ZWZjbnQgIT0gMSkgew0KIAkJKnB2ID0gMDsNCkBAIC00NzksNyArNTExLDYgQEANCiAJfQ0K
 > ICNpZiBNQVhTQVZFU0laRSA+IDANCiAJaWYgKG5ld3NpemUgPT0gMCAmJiBmcmVlX3R1cGxl
 > c1swXSkgew0KLQkJbnVtX2ZyZWVfdHVwbGVzWzBdLS07DQogCQlzdiA9IGZyZWVfdHVwbGVz
 > WzBdOw0KIAkJc3YtPm9iX3NpemUgPSAwOw0KIAkJUHlfSU5DUkVGKHN2KTsNCkBAIC01MTEs
 > OSArNTQyLDIyIEBADQogCX0gZWxzZSANCiAjZW5kaWYJCQ0KIAl7DQorI2lmZGVmIFdJVEhf
 > Q1lDTEVfR0MNCisJCVB5R0NfUmVtb3ZlKChQeU9iamVjdCAqKXYpOw0KKw0KKwkJZyA9IChQ
 > eUdDSW5mbyAqKSByZWFsbG9jKChjaGFyICopZywgc2l6ZW9mKCpnKSArIA0KKwkJCQlzaXpl
 > b2YoUHlUdXBsZU9iamVjdCkgKyANCisJCQkJbmV3c2l6ZSAqIHNpemVvZihQeU9iamVjdCAq
 > KSk7DQorCQlpZiAoZyA9PSBOVUxMKSB7DQorCQkJc3YgPT0gTlVMTDsNCisJCX0gZWxzZSB7
 > DQorCQkJc3YgPSAoUHlUdXBsZU9iamVjdCAqKSBQWV9HQ09CSihnKTsNCisJCX0NCisjZWxz
 > ZQ0KIAkJc3YgPSAoUHlUdXBsZU9iamVjdCAqKQ0KIAkJCXJlYWxsb2MoKGNoYXIgKil2LA0K
 > IAkJCQlzaXplb2YoUHlUdXBsZU9iamVjdCkgKyBuZXdzaXplICogc2l6ZW9mKFB5T2JqZWN0
 > ICopKTsNCisjZW5kaWYNCiAJCSpwdiA9IChQeU9iamVjdCAqKSBzdjsNCiAJCWlmIChzdiA9
 > PSBOVUxMKSB7DQogCQkJUHlNZW1fREVMKHYpOw0KQEAgLTUyMiw2ICs1NjYsOSBAQA0KIAkJ
 > fQ0KIAl9DQogCV9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopc3YpOw0KKyNpZmRlZiBX
 > SVRIX0NZQ0xFX0dDDQorCVB5R0NfSW5zZXJ0KChQeU9iamVjdCAqKXN2KTsNCisjZW5kaWYN
 > CiAJZm9yIChpID0gc3YtPm9iX3NpemU7IGkgPCBuZXdzaXplOyBpKyspDQogCQlzdi0+b2Jf
 > aXRlbVtpXSA9IE5VTEw7DQogCWlmIChsYXN0X2lzX3N0aWNreSAmJiBzaXplZGlmZiA+IDAp
 > IHsNCkBAIC01NTEsNyArNTk4LDExIEBADQogCQl3aGlsZSAocCkgew0KIAkJCXEgPSBwOw0K
 > IAkJCXAgPSAoUHlUdXBsZU9iamVjdCAqKShwLT5vYl9pdGVtWzBdKTsNCi0JCQlQeU1lbV9E
 > RUwocSk7DQorI2lmZGVmIFB5X1RSQUNFX1JFRlMNCisJCQlxLT5vYl90eXBlID0gICZQeVR1
 > cGxlX1R5cGU7DQorI2VuZGlmDQorCQkJUHlPYmplY3RfRGVsKChQeU9iamVjdCAqKXEpOw0K
 > KwkJCQ0KIAkJfQ0KIAl9DQogI2VuZGlmDQotLS0gUHl0aG9uLWN2cy9QQy9jb25maWcuYwlG
 > cmkgQXByICA3IDE1OjI3OjA0IDIwMDANCisrKyBQeXRob24tZ2MvUEMvY29uZmlnLmMJU2F0
 > IEFwciAgOCAwMzoxMjo1OCAyMDAwDQpAQCAtNDEsNiArNDEsOSBAQA0KIGV4dGVybiB2b2lk
 > IGluaXRiaW5hc2NpaSgpOw0KIGV4dGVybiB2b2lkIGluaXRjbWF0aCgpOw0KIGV4dGVybiB2
 > b2lkIGluaXRlcnJubygpOw0KKyNpZmRlZiBXSVRIX0NZQ0xFX0dDDQorZXh0ZXJuIHZvaWQg
 > aW5pdGdjKCk7DQorI2VuZGlmDQogZXh0ZXJuIHZvaWQgaW5pdGltYWdlb3AoKTsNCiBleHRl
 > cm4gdm9pZCBpbml0bWF0aCgpOw0KIGV4dGVybiB2b2lkIGluaXRtZDUoKTsNCkBAIC04MCw2
 > ICs4Myw5IEBADQogICAgICAgICB7ImJpbmFzY2lpIiwgaW5pdGJpbmFzY2lpfSwNCiAgICAg
 > ICAgIHsiY21hdGgiLCBpbml0Y21hdGh9LA0KICAgICAgICAgeyJlcnJubyIsIGluaXRlcnJu
 > b30sDQorI2lmZGVmIFdJVEhfQ1lDTEVfR0MNCisgICAgICAgIHsiZ2MiLCBpbml0Z2N9LA0K
 > KyNlbmRpZg0KICAgICAgICAgeyJpbWFnZW9wIiwgaW5pdGltYWdlb3B9LA0KICAgICAgICAg
 > eyJtYXRoIiwgaW5pdG1hdGh9LA0KICAgICAgICAgeyJtZDUiLCBpbml0bWQ1fSwNCi0tLSBQ
 > eXRob24tY3ZzL1BDL2NvbmZpZy5oCVRodSBNYXIgMzAgMjI6MDI6NTMgMjAwMA0KKysrIFB5
 > dGhvbi1nYy9QQy9jb25maWcuaAlTYXQgQXByICA4IDAyOjI0OjAwIDIwMDANCkBAIC0zODEs
 > NiArMzgxLDkgQEANCiAvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBHTlUgcmVh
 > ZGxpbmUgbGlicmFyeSAqLw0KIC8qICNkZWZpbmUgV0lUSF9SRUFETElORSAxICovDQogDQor
 > LyogRGVmaW5lIGlmIHlvdSB3YW50IGN5Y2xlIGdhcmJhZ2UgY29sbGVjdGlvbiAqLw0KKyNk
 > ZWZpbmUgV0lUSF9DWUNMRV9HQyAxDQorDQogLyogRGVmaW5lIGlmIHlvdSBoYXZlIGNsb2Nr
 > LiAgKi8NCiAvKiAjZGVmaW5lIEhBVkVfQ0xPQ0sgKi8NCiANCi0tLSBQeXRob24tY3ZzL01h
 > a2VmaWxlLmluCVN1biBBcHIgIDIgMjI6NTY6MjUgMjAwMA0KKysrIFB5dGhvbi1nYy9NYWtl
 > ZmlsZS5pbglTYXQgQXByICA4IDAxOjM4OjI1IDIwMDANCkBAIC00MDEsNyArNDAxLDcgQEAN
 > CiAJCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL01ha2VmaWxlICQoTElCUEwpL01ha2VmaWxl
 > DQogCQkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9TZXR1cCAkKExJQlBMKS9TZXR1cA0KIAkJ
 > JChJTlNUQUxMX0RBVEEpIE1vZHVsZXMvU2V0dXAubG9jYWwgJChMSUJQTCkvU2V0dXAubG9j
 > YWwNCi0JCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwLnRocmVhZCAkKExJQlBMKS9T
 > ZXR1cC50aHJlYWQNCisJCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwLmF1dG8gJChM
 > SUJQTCkvU2V0dXAuYXV0bw0KIAkJJChJTlNUQUxMX1BST0dSQU0pICQoc3JjZGlyKS9Nb2R1
 > bGVzL21ha2VzZXR1cCAkKExJQlBMKS9tYWtlc2V0dXANCiAJCSQoSU5TVEFMTF9QUk9HUkFN
 > KSAkKHNyY2RpcikvaW5zdGFsbC1zaCAkKExJQlBMKS9pbnN0YWxsLXNoDQogCQkkKElOU1RB
 > TExfREFUQSkgJChzcmNkaXIpL01pc2MvTWFrZWZpbGUucHJlLmluICQoTElCUEwpL01ha2Vm
 > aWxlLnByZS5pbg0KLS0tIFB5dGhvbi1jdnMvY29uZmlnLmguaW4JRnJpIE1hciAyNCAyMjoz
 > MTo0MiAyMDAwDQorKysgUHl0aG9uLWdjL2NvbmZpZy5oLmluCVNhdCBBcHIgIDggMDE6Mzg6
 > MjUgMjAwMA0KQEAgLTIwNCw2ICsyMDQsOSBAQA0KICAgIChzaGFyZWQgbGlicmFyeSBwbHVz
 > IGFjY2Vzc29yeSBmaWxlcykuICovDQogI3VuZGVmIFdJVEhfTkVYVF9GUkFNRVdPUksNCiAN
 > CisvKiBEZWZpbmUgaWYgeW91IHdhbnQgY3ljbGUgZ2FyYmFnZSBjb2xsZWN0aW9uICovDQor
 > I3VuZGVmIFdJVEhfQ1lDTEVfR0MNCisNCiAvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGFu
 > IG9mZl90LiAqLw0KICN1bmRlZiBTSVpFT0ZfT0ZGX1QNCiANCi0tLSBQeXRob24tY3ZzL2Nv
 > bmZpZ3VyZS5pbglTdW4gQXByICAyIDIyOjU2OjI1IDIwMDANCisrKyBQeXRob24tZ2MvY29u
 > ZmlndXJlLmluCVNhdCBBcHIgIDggMDE6Mzg6MjUgMjAwMA0KQEAgLTEwNjksMTAgKzEwNjks
 > MjEgQEANCiBmaV0sDQogW0FDX01TR19SRVNVTFQobm8pXSkNCiANCitBQ19TVUJTVChVU0Vf
 > R0NfTU9EVUxFKQ0KK1VTRV9HQ19NT0RVTEU9IiMiDQorDQorQUNfTVNHX0NIRUNLSU5HKGZv
 > ciAtLXdpdGgtY3ljbGUtZ2MpDQorQUNfQVJHX1dJVEgoY3ljbGUtZ2MsIFstLXdpdGgtY3lj
 > bGUtZ2MgICAgICAgICAgIGVuYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb25dLCBbDQorQUNfTVNH
 > X1JFU1VMVCgkd2l0aHZhbCkNCitBQ19ERUZJTkUoV0lUSF9DWUNMRV9HQykNCitVU0VfR0Nf
 > TU9EVUxFPQ0KK10sDQorQUNfTVNHX1JFU1VMVChubykpDQorDQogIyBnZW5lcmF0ZSBvdXRw
 > dXQgZmlsZXMNCiBBQ19PVVRQVVQoTWFrZWZpbGUgXA0KICBPYmplY3RzL01ha2VmaWxlIFwN
 > CiAgUGFyc2VyL01ha2VmaWxlIFwNCiAgUHl0aG9uL01ha2VmaWxlIFwNCiAgTW9kdWxlcy9N
 > YWtlZmlsZS5wcmUgXA0KLSBNb2R1bGVzL1NldHVwLnRocmVhZCkNCisgTW9kdWxlcy9TZXR1
 > cC5hdXRvKQ0KLS0tIFB5dGhvbi1jdnMvTWlzYy9NYWtlZmlsZS5wcmUuaW4JV2VkIERlYyAg
 > OSAxMDowNTozMyAxOTk4DQorKysgUHl0aG9uLWdjL01pc2MvTWFrZWZpbGUucHJlLmluCVNh
 > dCBBcHIgIDggMDE6Mzg6MjUgMjAwMA0KQEAgLTE2OCw3ICsxNjgsNyBAQA0KIE1BS0VGSUxF
 > PQkkKExJQlBMKS9NYWtlZmlsZQ0KIENPTkZJR0M9CSQoTElCUEwpL2NvbmZpZy5jDQogQ09O
 > RklHQ0lOPQkkKExJQlBMKS9jb25maWcuYy5pbg0KLVNFVFVQPQkJJChMSUJQTCkvU2V0dXAu
 > dGhyZWFkICQoTElCUEwpL1NldHVwLmxvY2FsICQoTElCUEwpL1NldHVwDQorU0VUVVA9CQkk
 > KExJQlBMKS9TZXR1cC5hdXRvICQoTElCUEwpL1NldHVwLmxvY2FsICQoTElCUEwpL1NldHVw
 > DQogDQogU1lTTElCUz0JJChMSUJNKSAkKExJQkMpDQogDQotLS0gUHl0aG9uLWN2cy9Nb2R1
 > bGVzL01ha2VmaWxlLnByZS5pbglGcmkgTWFyIDI0IDIyOjMyOjI1IDIwMDANCisrKyBQeXRo
 > b24tZ2MvTW9kdWxlcy9NYWtlZmlsZS5wcmUuaW4JU2F0IEFwciAgOCAwMTozODoyNSAyMDAw
 > DQpAQCAtMTQ3LDEwICsxNDcsMTAgQEANCiAjIGdldHMgcmVtYWRlIGZyb20gc2NyYXRjaDsg
 > dGhpcyBlbnN1cmVzIHRvIHJlbW92ZSBtb2R1bGVzIHRoYXQgYXJlIG5vDQogIyBsb25nZXIg
 > cGVydGluZW50IChidXQgdGhhdCB3ZXJlIGluIGEgcHJldmlvdXMgY29uZmlndXJhdGlvbiku
 > DQogY29uZmlnLmMgTWFrZWZpbGU6IE1ha2VmaWxlLnByZSBjb25maWcuYy5pbiAkKE1BS0VT
 > RVRVUCkNCi1jb25maWcuYyBNYWtlZmlsZTogU2V0dXAudGhyZWFkIFNldHVwIFNldHVwLmxv
 > Y2FsDQorY29uZmlnLmMgTWFrZWZpbGU6IFNldHVwLmF1dG8gU2V0dXAgU2V0dXAubG9jYWwN
 > CiBjb25maWcuYyBNYWtlZmlsZToNCiAJCS1ybSAtZiAkKExJQlJBUlkpDQotCQkkKFNIRUxM
 > KSAkKE1BS0VTRVRVUCkgU2V0dXAudGhyZWFkIFNldHVwLmxvY2FsIFNldHVwDQorCQkkKFNI
 > RUxMKSAkKE1BS0VTRVRVUCkgU2V0dXAuYXV0byBTZXR1cC5sb2NhbCBTZXR1cA0KIA0KIGhh
 > c3NpZ25hbDoNCiAJCS1ybSAtZiBoYXNzaWduYWwNCi0tLSBQeXRob24tY3ZzL01vZHVsZXMv
 > U2V0dXAuaW4JU3VuIEFwciAgMiAyMjo1NjozNyAyMDAwDQorKysgUHl0aG9uLWdjL01vZHVs
 > ZXMvU2V0dXAuaW4JU2F0IEFwciAgOCAwMTozODoyNSAyMDAwDQpAQCAtMTAwLDcgKzEwMCw3
 > IEBADQogR0xIQUNLPS1EY2xlYXI9X19HTGNsZWFyDQogI2dsIGdsbW9kdWxlLmMgY2dlbnN1
 > cHBvcnQuYyAtSSQoc3JjZGlyKSAkKEdMSEFDSykgLWxnbCAtbFgxMQ0KIA0KLSMgVGhlIHRo
 > cmVhZCBtb2R1bGUgaXMgbm93IGF1dG9tYXRpY2FsbHkgZW5hYmxlZCwgc2VlIFNldHVwLnRo
 > cmVhZC4NCisjIFRoZSB0aHJlYWQgbW9kdWxlIGlzIG5vdyBhdXRvbWF0aWNhbGx5IGVuYWJs
 > ZWQsIHNlZSBTZXR1cC5hdXRvLg0KIA0KICMgUHVyZSBtb2R1bGUuICBDYW5ub3QgYmUgbGlu
 > a2VkIGR5bmFtaWNhbGx5Lg0KICMgLURXSVRIX1FVQU5USUZZLCAtRFdJVEhfUFVSSUZZLCBv
 > ciAtRFdJVEhfQUxMX1BVUkUNCi0tLSBQeXRob24tY3ZzL01vZHVsZXMvU2V0dXAuYXV0by5p
 > bg0KKysrIFB5dGhvbi1nYy9Nb2R1bGVzL1NldHVwLmF1dG8uaW4JU2F0IEFwciAgOCAwMToz
 > ODoyNSAyMDAwDQpAQCAtMCwwICsxLDE2IEBADQorIyBUaGlzIGZpbGUgaXMgdHJhbnNtb2dy
 > aWZpZWQgaW50byBTZXR1cC5hdXRvIGJ5IGNvbmZpZy5zdGF0dXMuICBJdHMNCisjIHB1cnBv
 > c2UgaXMgdG8gYXV0b21hdGljYWxseSBlbmFibGUgbW9kdWxlcyBnaXZlbiB3aGVuIGNlcnRh
 > aW4NCisjIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuICBJ
 > dCByZXBsYWNlcyB0aGUgb2xkDQorIyBTZXR1cC50aHJlYWQuaW4gZmlsZS4NCisNCisjIElu
 > Y2x1ZGUgdGhlIHRocmVhZCBtb2R1bGUgd2hlbiB0aGUgLS13aXRoLXRocmVhZCBhcmd1bWVu
 > dCBpcyBnaXZlbiB0bw0KKyMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuDQorIw0KKyMgKk5PVEUq
 > OiBpZiB0aGUgY29uZmlndXJlIHNjcmlwdCBkZWNpZGVzIGl0IGNhbid0IHN1cHBvcnQgdGhy
 > ZWFkcywgdGhlDQorIyB0aHJlYWQgbW9kdWxlIHdpbGwgc3RpbGwgYmUgZW5hYmxlZCBhbmQg
 > Y2F1c2UgY29tcGlsZSBlcnJvcnMuICBUaGUNCisjIHNvbHV0aW9uIGlzIG5vdCB0byB1c2Ug
 > LS13aXRoLXRocmVhZCBvbiBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0DQorIyB0aHJl
 > YWRzLg0KK0BVU0VfVEhSRUFEX01PRFVMRUB0aHJlYWQgdGhyZWFkbW9kdWxlLmMNCisNCisj
 > IEdhcmJhZ2UgY29sbGVjdGlvbiBlbmFibGVkIHdpdGggLS13aXRoLWN5Y2xlLWdjDQorQFVT
 > RV9HQ19NT0RVTEVAZ2MgZ2Ntb2R1bGUuYw0KLS0tIFB5dGhvbi1jdnMvTGliL3Rlc3QvdGVz
 > dF9nYy5weQ0KKysrIFB5dGhvbi1nYy9MaWIvdGVzdC90ZXN0X2djLnB5CVNhdCBBcHIgIDgg
 > MDM6MjU6MjUgMjAwMA0KQEAgLTAsMCArMSw5MCBAQA0KK2ltcG9ydCBnYw0KKw0KK2RlZiB0
 > ZXN0X2xpc3QoKToNCisgICAgbCA9IFtdDQorICAgIGwuYXBwZW5kKGwpDQorICAgIHByaW50
 > ICdsaXN0IDB4JXgnICUgaWQobCkNCisgICAgZ2MuY29sbGVjdCgpDQorICAgIGRlbCBsDQor
 > ICAgIGFzc2VydCBnYy5jb2xsZWN0KCkgPT0gMQ0KKw0KK2RlZiB0ZXN0X2RpY3QoKToNCisg
 > ICAgZCA9IHt9DQorICAgIGRbMV0gPSBkDQorICAgIHByaW50ICdkaWN0IDB4JXgnICUgaWQo
 > ZCkNCisgICAgZ2MuY29sbGVjdCgpDQorICAgIGRlbCBkDQorICAgIGFzc2VydCBnYy5jb2xs
 > ZWN0KCkgPT0gMQ0KKw0KK2RlZiB0ZXN0X3R1cGxlKCk6DQorICAgIGwgPSBbXQ0KKyAgICB0
 > ID0gKGwsKQ0KKyAgICBsLmFwcGVuZCh0KQ0KKyAgICBwcmludCAnbGlzdCAweCV4JyAlIGlk
 > KGwpDQorICAgIHByaW50ICd0dXBsZSAweCV4JyAlIGlkKHQpDQorICAgIGdjLmNvbGxlY3Qo
 > KQ0KKyAgICBkZWwgdA0KKyAgICBkZWwgbA0KKyAgICBhc3NlcnQgZ2MuY29sbGVjdCgpID09
 > IDINCisNCitkZWYgdGVzdF9jbGFzcygpOg0KKyAgICBjbGFzcyBBOg0KKyAgICAgICAgcGFz
 > cw0KKyAgICBBLmEgPSBBDQorICAgIHByaW50ICdjbGFzcyAweCV4JyAlIGlkKEEpDQorICAg
 > IGdjLmNvbGxlY3QoKQ0KKyAgICBkZWwgQQ0KKyAgICBhc3NlcnQgZ2MuY29sbGVjdCgpID09
 > IDINCisNCitkZWYgdGVzdF9pbnN0YW5jZSgpOg0KKyAgICBjbGFzcyBBOg0KKyAgICAgICAg
 > cGFzcw0KKyAgICBhID0gQSgpDQorICAgIGEuYSA9IGENCisgICAgcHJpbnQgcmVwcihhKQ0K
 > KyAgICBnYy5jb2xsZWN0KCkNCisgICAgZGVsIGENCisgICAgYXNzZXJ0IGdjLmNvbGxlY3Qo
 > KSA9PSAyDQorDQorZGVmIHRlc3RfZmluYWxpemVyKCk6DQorICAgIGNsYXNzIEE6DQorICAg
 > ICAgICBkZWYgX19kZWxfXyhzZWxmKTogcGFzcw0KKyAgICBjbGFzcyBCOg0KKyAgICAgICAg
 > cGFzcw0KKyAgICBhID0gQSgpDQorICAgIGEuYSA9IGENCisgICAgaWRfYSA9IGlkKGEpDQor
 > ICAgIGIgPSBCKCkNCisgICAgYi5iID0gYg0KKyAgICBwcmludCAnYScsIHJlcHIoYSkNCisg
 > ICAgcHJpbnQgJ2InLCByZXByKGIpDQorICAgIGdjLmNvbGxlY3QoKQ0KKyAgICBnYy5nYXJi
 > YWdlWzpdID0gW10NCisgICAgZGVsIGENCisgICAgZGVsIGINCisgICAgYXNzZXJ0IGdjLmNv
 > bGxlY3QoKSA9PSA0DQorICAgIGFzc2VydCBpZChnYy5nYXJiYWdlWzBdKSA9PSBpZF9hDQor
 > DQorZGVmIHRlc3RfZnVuY3Rpb24oKToNCisgICAgZCA9IHt9DQorICAgIGV4ZWMoImRlZiBm
 > KCk6IHBhc3NcbiIpIGluIGQNCisgICAgcHJpbnQgJ2RpY3QgMHgleCcgJSBpZChkKQ0KKyAg
 > ICBwcmludCAnZnVuYyAweCV4JyAlIGlkKGRbJ2YnXSkNCisgICAgZ2MuY29sbGVjdCgpDQor
 > ICAgIGRlbCBkDQorICAgIGFzc2VydCBnYy5jb2xsZWN0KCkgPT0gMg0KKw0KKw0KK2RlZiB0
 > ZXN0X2FsbCgpOg0KKyAgICBkZWJ1ZyA9IGdjLmdldF9kZWJ1ZygpDQorICAgIGdjLnNldF9k
 > ZWJ1ZyhnYy5ERUJVR19MRUFLIHwgZ2MuREVCVUdfU1RBVFMpDQorICAgIHRlc3RfbGlzdCgp
 > DQorICAgIHRlc3RfZGljdCgpDQorICAgIHRlc3RfdHVwbGUoKQ0KKyAgICB0ZXN0X2NsYXNz
 > KCkNCisgICAgdGVzdF9pbnN0YW5jZSgpDQorICAgIHRlc3RfZmluYWxpemVyKCkNCisgICAg
 > dGVzdF9mdW5jdGlvbigpDQorICAgIGdjLnNldF9kZWJ1ZyhkZWJ1ZykNCisNCit0ZXN0X2Fs
 > bCgpDQotLS0gUHl0aG9uLWN2cy9QQ2J1aWxkL3B5dGhvbjE2LmRzcAlGcmkgQXByICA3IDE1
 > OjI3OjA0IDIwMDANCisrKyBQeXRob24tZ2MvUENidWlsZC9weXRob24xNi5kc3AJU2F0IEFw
 > ciAgOCAwMjoyMjo0OCAyMDAwDQpAQCAtNjQ1LDYgKzY0NSwyMSBAQA0KICMgRW5kIFNvdXJj
 > ZSBGaWxlDQ0KICMgQmVnaW4gU291cmNlIEZpbGUNDQogDQ0KK1NPVVJDRT0uLlxNb2R1bGVz
 > XGdjbW9kdWxlLmMNDQorDQ0KKyFJRiAgIiQoQ0ZHKSIgPT0gInB5dGhvbjE2IC0gV2luMzIg
 > UmVsZWFzZSINDQorDQ0KKyFFTFNFSUYgICIkKENGRykiID09ICJweXRob24xNiAtIFdpbjMy
 > IERlYnVnIg0NCisNDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInB5dGhvbjE2IC0gV2luMzIg
 > QWxwaGEgRGVidWciDQ0KKw0NCishRUxTRUlGICAiJChDRkcpIiA9PSAicHl0aG9uMTYgLSBX
 > aW4zMiBBbHBoYSBSZWxlYXNlIg0NCisNDQorIUVORElGIA0NCisNDQorIyBFbmQgU291cmNl
 > IEZpbGUNDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0NCisNDQogU09VUkNFPS4uXFB5dGhvblxn
 > ZXRhcmdzLmMNDQogDQ0KICFJRiAgIiQoQ0ZHKSIgPT0gInB5dGhvbjE2IC0gV2luMzIgUmVs
 > ZWFzZSIN
 > 
 > 
 > 
 > 
 > --__--__--
 > 
 > _______________________________________________
 > Patches mailing list
 > Patches@python.org
 > http://www.python.org/mailman/listinfo/patches
 > 
 > 
 > End of Patches Digest_______________________________________________
 > Patches mailing list
 > Patches@python.org
 > http://www.python.org/mailman/listinfo/patches