From f1d25bcc20467ca3fb58576b952e64283568f265 Mon Sep 17 00:00:00 2001
From: "mariano.iglesias"
Date: Sat, 14 Mar 2009 22:24:42 +0000
Subject: [PATCH 01/67] Removing need to explicitly set IDs for Containable
test, added in r6989
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8098 3807eeeb-6ff5-0310-8944-8be069107fe0
---
.../libs/model/behaviors/containable.test.php | 21 ++++++++++++-------
cake/tests/fixtures/comment_fixture.php | 12 +++++------
2 files changed, 20 insertions(+), 13 deletions(-)
diff --git a/cake/tests/cases/libs/model/behaviors/containable.test.php b/cake/tests/cases/libs/model/behaviors/containable.test.php
index 5c7b23e6e..9a7a2f4e1 100644
--- a/cake/tests/cases/libs/model/behaviors/containable.test.php
+++ b/cake/tests/cases/libs/model/behaviors/containable.test.php
@@ -2868,25 +2868,32 @@ class ContainableTest extends CakeTestCase {
$this->assertEqual($result, $expected);
$result = $this->Article->find('all', array('contain' => array('Comment(comment, published)' => 'Attachment(attachment)', 'User(user)'), 'fields' => array('title')));
+ if (!empty($result)) {
+ foreach($result as $i=>$article) {
+ foreach($article['Comment'] as $j=>$comment) {
+ $result[$i]['Comment'][$j] = array_diff_key($comment, array('id'=>true));
+ }
+ }
+ }
$expected = array(
array(
'Article' => array('title' => 'First Article', 'id' => 1),
'User' => array('user' => 'mariano', 'id' => 1),
'Comment' => array(
- array('comment' => 'First Comment for First Article', 'published' => 'Y', 'id' => 1, 'article_id' => 1, 'Attachment' => array()),
- array('comment' => 'Second Comment for First Article', 'published' => 'Y', 'id' => 2, 'article_id' => 1, 'Attachment' => array()),
- array('comment' => 'Third Comment for First Article', 'published' => 'Y', 'id' => 3, 'article_id' => 1, 'Attachment' => array()),
- array('comment' => 'Fourth Comment for First Article', 'published' => 'N', 'id' => 4, 'article_id' => 1, 'Attachment' => array()),
+ array('comment' => 'First Comment for First Article', 'published' => 'Y', 'article_id' => 1, 'Attachment' => array()),
+ array('comment' => 'Second Comment for First Article', 'published' => 'Y', 'article_id' => 1, 'Attachment' => array()),
+ array('comment' => 'Third Comment for First Article', 'published' => 'Y', 'article_id' => 1, 'Attachment' => array()),
+ array('comment' => 'Fourth Comment for First Article', 'published' => 'N', 'article_id' => 1, 'Attachment' => array()),
)
),
array(
'Article' => array('title' => 'Second Article', 'id' => 2),
'User' => array('user' => 'larry', 'id' => 3),
'Comment' => array(
- array('comment' => 'First Comment for Second Article', 'published' => 'Y', 'id' => 5, 'article_id' => 2, 'Attachment' => array(
+ array('comment' => 'First Comment for Second Article', 'published' => 'Y', 'article_id' => 2, 'Attachment' => array(
'attachment' => 'attachment.zip', 'id' => 1
)),
- array('comment' => 'Second Comment for Second Article', 'published' => 'Y', 'id' => 6, 'article_id' => 2, 'Attachment' => array())
+ array('comment' => 'Second Comment for Second Article', 'published' => 'Y', 'article_id' => 2, 'Attachment' => array())
)
),
array(
@@ -3535,4 +3542,4 @@ class ContainableTest extends CakeTestCase {
}
}
-?>
\ No newline at end of file
+?>
diff --git a/cake/tests/fixtures/comment_fixture.php b/cake/tests/fixtures/comment_fixture.php
index 3c563102b..0c5a11be3 100644
--- a/cake/tests/fixtures/comment_fixture.php
+++ b/cake/tests/fixtures/comment_fixture.php
@@ -60,12 +60,12 @@ class CommentFixture extends CakeTestFixture {
* @access public
*/
var $records = array(
- array('id' => 1, 'article_id' => 1, 'user_id' => 2, 'comment' => 'First Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:45:23', 'updated' => '2007-03-18 10:47:31'),
- array('id' => 2, 'article_id' => 1, 'user_id' => 4, 'comment' => 'Second Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:47:23', 'updated' => '2007-03-18 10:49:31'),
- array('id' => 3, 'article_id' => 1, 'user_id' => 1, 'comment' => 'Third Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:49:23', 'updated' => '2007-03-18 10:51:31'),
- array('id' => 4, 'article_id' => 1, 'user_id' => 1, 'comment' => 'Fourth Comment for First Article', 'published' => 'N', 'created' => '2007-03-18 10:51:23', 'updated' => '2007-03-18 10:53:31'),
- array('id' => 5, 'article_id' => 2, 'user_id' => 1, 'comment' => 'First Comment for Second Article', 'published' => 'Y', 'created' => '2007-03-18 10:53:23', 'updated' => '2007-03-18 10:55:31'),
- array('id' => 6, 'article_id' => 2, 'user_id' => 2, 'comment' => 'Second Comment for Second Article', 'published' => 'Y', 'created' => '2007-03-18 10:55:23', 'updated' => '2007-03-18 10:57:31')
+ array('article_id' => 1, 'user_id' => 2, 'comment' => 'First Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:45:23', 'updated' => '2007-03-18 10:47:31'),
+ array('article_id' => 1, 'user_id' => 4, 'comment' => 'Second Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:47:23', 'updated' => '2007-03-18 10:49:31'),
+ array('article_id' => 1, 'user_id' => 1, 'comment' => 'Third Comment for First Article', 'published' => 'Y', 'created' => '2007-03-18 10:49:23', 'updated' => '2007-03-18 10:51:31'),
+ array('article_id' => 1, 'user_id' => 1, 'comment' => 'Fourth Comment for First Article', 'published' => 'N', 'created' => '2007-03-18 10:51:23', 'updated' => '2007-03-18 10:53:31'),
+ array('article_id' => 2, 'user_id' => 1, 'comment' => 'First Comment for Second Article', 'published' => 'Y', 'created' => '2007-03-18 10:53:23', 'updated' => '2007-03-18 10:55:31'),
+ array('article_id' => 2, 'user_id' => 2, 'comment' => 'Second Comment for Second Article', 'published' => 'Y', 'created' => '2007-03-18 10:55:23', 'updated' => '2007-03-18 10:57:31')
);
}
From ed43e95cf3fc7891cdf484bcf5fe659a21406afb Mon Sep 17 00:00:00 2001
From: phpnut
Date: Sun, 15 Mar 2009 00:08:56 +0000
Subject: [PATCH 02/67] Adding methods for setting headers and handling header
output, will make testing easier on the class
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8099 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/view/media.php | 88 ++++++++++++++++++++++++++++++----------
1 file changed, 66 insertions(+), 22 deletions(-)
diff --git a/cake/libs/view/media.php b/cake/libs/view/media.php
index c1746544b..e56e73aa4 100644
--- a/cake/libs/view/media.php
+++ b/cake/libs/view/media.php
@@ -79,6 +79,13 @@ class MediaView extends View {
'iges' => 'model/iges', 'igs' => 'model/iges', 'mesh' => 'model/mesh', 'msh' => 'model/mesh',
'silo' => 'model/mesh', 'vrml' => 'model/vrml', 'wrl' => 'model/vrml',
'mime' => 'www/mime', 'pdb' => 'chemical/x-pdb', 'xyz' => 'chemical/x-pdb');
+/**
+ * Holds headers sent to browser before rendering media
+ *
+ * @var array
+ * @access protected
+ */
+ var $_headers = array();
/**
* Constructor
*
@@ -105,7 +112,7 @@ class MediaView extends View {
} else {
$path = APP . $path . $id;
}
-
+
if (!file_exists($path)) {
header('Content-Type: text/html');
$this->cakeError('error404');
@@ -118,7 +125,7 @@ class MediaView extends View {
if (is_array($mimeType)) {
$this->mimeType = array_merge($this->mimeType, $mimeType);
}
-
+
if (isset($extension) && isset($this->mimeType[$extension]) && connection_status() == 0) {
$chunkSize = 8192;
$buffer = '';
@@ -148,13 +155,14 @@ class MediaView extends View {
));
}
foreach($contentTypes as $contentType) {
- header('Content-Type: ' . $contentType);
+ $this->_header('Content-Type: ' . $contentType);
}
- header('Content-Disposition: attachment; filename="' . $name . '.' . $extension . '";');
- header('Expires: 0');
- header('Accept-Ranges: bytes');
- header('Cache-Control: private', false);
- header('Pragma: private');
+ $this->_header(array(
+ 'Content-Disposition: attachment; filename="' . $name . '.' . $extension . '";',
+ 'Expires: 0',
+ 'Accept-Ranges: bytes',
+ 'Cache-Control: private' => false,
+ 'Pragma: private'));
$httpRange = env('HTTP_RANGE');
if (isset($httpRange)) {
@@ -163,30 +171,36 @@ class MediaView extends View {
$size = $fileSize - 1;
$length = $fileSize - $range;
- header('HTTP/1.1 206 Partial Content');
- header('Content-Length: ' . $length);
- header('Content-Range: bytes ' . $range . $size . '/' . $fileSize);
+ $this->_header(array(
+ 'HTTP/1.1 206 Partial Content',
+ 'Content-Length: ' . $length,
+ 'Content-Range: bytes ' . $range . $size . '/' . $fileSize));
+
fseek($handle, $range);
} else {
- header('Content-Length: ' . $fileSize);
+ $this->_header('Content-Length: ' . $fileSize);
}
} else {
- header('Date: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
+ $this->_header('Date: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
if ($cache) {
if (!is_numeric($cache)) {
$cache = strtotime($cache) - time();
}
- header('Cache-Control: max-age=' . $cache);
- header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $cache) . ' GMT');
- header('Pragma: cache');
+ $this->_header(array(
+ 'Cache-Control: max-age=' . $cache,
+ 'Expires: ' . gmdate('D, d M Y H:i:s', time() + $cache) . ' GMT',
+ 'Pragma: cache'));
} else {
- header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
- header('Pragma: no-cache');
+ $this->_header(array(
+ 'Cache-Control: must-revalidate, post-check=0, pre-check=0',
+ 'Pragma: no-cache'));
}
- header('Last-Modified: ' . $modified);
- header('Content-Type: ' . $this->mimeType[$extension]);
- header('Content-Length: ' . $fileSize);
+ $this->_header(array(
+ 'Last-Modified: ' . $modified,
+ 'Content-Type: ' . $this->mimeType[$extension],
+ 'Content-Length: ' . $fileSize));
}
+ $this->_output();
@ob_end_clean();
while (!feof($handle) && connection_status() == 0 && !connection_aborted()) {
@@ -201,5 +215,35 @@ class MediaView extends View {
}
return false;
}
+/**
+ * Method to set headers
+ * @param mixed $key
+ * @param boolean $boolean
+ * @access protected
+ */
+ function _header($header, $boolean = true) {
+ if (is_array($header)) {
+ foreach ($header as $string => $boolean) {
+ if (is_numeric($string)) {
+ $this->_headers[] = array($boolean => true);
+ } else {
+ $this->_headers[] = array($string => $boolean);
+ }
+ }
+ return;
+ }
+ $this->_headers[] = array($header => $boolean);
+ return;
+ }
+/**
+ * Method to output headers
+ * @access protected
+ */
+ function _output() {
+ foreach ($this->_headers as $header => $value) {
+ $string = key($header);
+ header($string, $value[$string]);
+ }
+ }
}
-?>
+?>
\ No newline at end of file
From 70f18af78d7be4a9d8252078d1e6983c4f1e7d67 Mon Sep 17 00:00:00 2001
From: davidpersson
Date: Sun, 15 Mar 2009 00:10:53 +0000
Subject: [PATCH 03/67] Adding Folder tests, fixes cases where ordered
directory entries were expected
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8100 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/tests/cases/libs/folder.test.php | 35 ++++++++++++++++++++++++---
1 file changed, 32 insertions(+), 3 deletions(-)
diff --git a/cake/tests/cases/libs/folder.test.php b/cake/tests/cases/libs/folder.test.php
index 1dd8e8ff0..34fe46e0e 100644
--- a/cake/tests/cases/libs/folder.test.php
+++ b/cake/tests/cases/libs/folder.test.php
@@ -271,13 +271,16 @@ class FolderTest extends CakeTestCase {
);
$result = $Folder->tree(TEST_CAKE_CORE_INCLUDE_PATH . 'config', false);
- $this->assertEqual($result, $expected);
+ $this->assertIdentical(array_diff($expected[0], $result[0]), array());
+ $this->assertIdentical(array_diff($result[0], $expected[0]), array());
$result = $Folder->tree(TEST_CAKE_CORE_INCLUDE_PATH . 'config', false, 'dir');
- $this->assertEqual($result, $expected[0]);
+ $this->assertIdentical(array_diff($expected[0], $result), array());
+ $this->assertIdentical(array_diff($result, $expected[0]), array());
$result = $Folder->tree(TEST_CAKE_CORE_INCLUDE_PATH . 'config', false, 'files');
- $this->assertEqual($result, $expected[1]);
+ $this->assertIdentical(array_diff($expected[1], $result), array());
+ $this->assertIdentical(array_diff($result, $expected[1]), array());
}
/**
* testWindowsPath method
@@ -405,10 +408,20 @@ class FolderTest extends CakeTestCase {
$Folder->cd(TEST_CAKE_CORE_INCLUDE_PATH . 'config');
$result = $Folder->find();
$expected = array('config.php', 'paths.php');
+ $this->assertIdentical(array_diff($expected, $result), array());
+ $this->assertIdentical(array_diff($result, $expected), array());
+
+ $result = $Folder->find('.*', true);
+ $expected = array('config.php', 'paths.php');
$this->assertIdentical($result, $expected);
$result = $Folder->find('.*\.php');
$expected = array('config.php', 'paths.php');
+ $this->assertIdentical(array_diff($expected, $result), array());
+ $this->assertIdentical(array_diff($result, $expected), array());
+
+ $result = $Folder->find('.*\.php', true);
+ $expected = array('config.php', 'paths.php');
$this->assertIdentical($result, $expected);
$result = $Folder->find('.*ig\.php');
@@ -450,6 +463,14 @@ class FolderTest extends CakeTestCase {
TEST_CAKE_CORE_INCLUDE_PATH . 'config' . DS . 'config.php',
TEST_CAKE_CORE_INCLUDE_PATH . 'config' . DS . 'paths.php'
);
+ $this->assertIdentical(array_diff($expected, $result), array());
+ $this->assertIdentical(array_diff($result, $expected), array());
+
+ $result = $Folder->findRecursive('(config|paths)\.php', true);
+ $expected = array(
+ TEST_CAKE_CORE_INCLUDE_PATH . 'config' . DS . 'config.php',
+ TEST_CAKE_CORE_INCLUDE_PATH . 'config' . DS . 'paths.php'
+ );
$this->assertIdentical($result, $expected);
$Folder->cd(TMP);
@@ -472,6 +493,14 @@ class FolderTest extends CakeTestCase {
TMP . 'testme' . DS . 'my.php',
TMP . 'testme' . DS . 'paths.php'
);
+ $this->assertIdentical(array_diff($expected, $result), array());
+ $this->assertIdentical(array_diff($result, $expected), array());
+
+ $result = $Folder->findRecursive('(paths|my)\.php', true);
+ $expected = array(
+ TMP . 'testme' . DS . 'my.php',
+ TMP . 'testme' . DS . 'paths.php'
+ );
$this->assertIdentical($result, $expected);
$Folder->cd(TEST_CAKE_CORE_INCLUDE_PATH . 'config');
From e89bc0be102219410b2a7cc70ddaa05b913d8037 Mon Sep 17 00:00:00 2001
From: phpnut
Date: Sun, 15 Mar 2009 00:19:02 +0000
Subject: [PATCH 04/67] Committed [8099] before I finished changing variable
names
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8101 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/view/media.php | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/cake/libs/view/media.php b/cake/libs/view/media.php
index e56e73aa4..5be837840 100644
--- a/cake/libs/view/media.php
+++ b/cake/libs/view/media.php
@@ -217,7 +217,7 @@ class MediaView extends View {
}
/**
* Method to set headers
- * @param mixed $key
+ * @param mixed $header
* @param boolean $boolean
* @access protected
*/
@@ -240,9 +240,9 @@ class MediaView extends View {
* @access protected
*/
function _output() {
- foreach ($this->_headers as $header => $value) {
- $string = key($header);
- header($string, $value[$string]);
+ foreach ($this->_headers as $key => $value) {
+ $header = key($value);
+ header($header, $value[$header]);
}
}
}
From 374898759941e77b0fbed7614cd1ca395b126202 Mon Sep 17 00:00:00 2001
From: phpnut
Date: Sun, 15 Mar 2009 00:21:28 +0000
Subject: [PATCH 05/67] Adding fix from davidpersson: sort not working for
subdirectories in Folder::findRecursive
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8102 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/folder.php | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/cake/libs/folder.php b/cake/libs/folder.php
index 7bf8716ef..28f32672a 100644
--- a/cake/libs/folder.php
+++ b/cake/libs/folder.php
@@ -212,17 +212,18 @@ class Folder extends Object {
*/
function _findRecursive($pattern, $sort = false) {
list($dirs, $files) = $this->read($sort);
-
$found = array();
+
foreach ($files as $file) {
if (preg_match('/^' . $pattern . '$/i', $file)) {
$found[] = Folder::addPathElement($this->path, $file);
}
}
$start = $this->path;
+
foreach ($dirs as $dir) {
$this->cd(Folder::addPathElement($start, $dir));
- $found = array_merge($found, $this->findRecursive($pattern));
+ $found = array_merge($found, $this->findRecursive($pattern, $sort));
}
return $found;
}
From e3b027288bf6c5990d632dc34f1d4f7495d91f22 Mon Sep 17 00:00:00 2001
From: phpnut
Date: Sun, 15 Mar 2009 00:27:25 +0000
Subject: [PATCH 06/67] Removing unused setting in Session configuration. Fixed
bug in CakeSession::watch(); that allowed setting multiple vars to watch and
CakeSession::ignore(); would only unset the first one found. Fixed errors
being thrown when testing database sessions and the database was dropped
before script process ended.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8103 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/session.php | 6 +++---
cake/tests/cases/libs/session.test.php | 5 +++++
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/cake/libs/session.php b/cake/libs/session.php
index 2bd4ab0fd..88b90da52 100644
--- a/cake/libs/session.php
+++ b/cake/libs/session.php
@@ -349,7 +349,9 @@ class CakeSession extends Object {
if (empty($var)) {
return false;
}
- $this->watchKeys[] = $var;
+ if (!in_array($var, $this->watchKeys, true)) {
+ $this->watchKeys[] = $var;
+ }
}
/**
* Tells Session to stop watching a given key path
@@ -571,10 +573,8 @@ class CakeSession extends Object {
$this->__setError(1, 'Session Highjacking Attempted !!!');
}
} else {
- srand ((double)microtime() * 1000000);
$this->write('Config.userAgent', $this->_userAgent);
$this->write('Config.time', $this->sessionTime);
- $this->write('Config.rand', mt_rand());
$this->write('Config.timeout', 10);
$this->valid = true;
$this->__setError(1, 'Session is valid');
diff --git a/cake/tests/cases/libs/session.test.php b/cake/tests/cases/libs/session.test.php
index 91d773cc7..d3f9f5ec0 100644
--- a/cake/tests/cases/libs/session.test.php
+++ b/cake/tests/cases/libs/session.test.php
@@ -369,6 +369,11 @@ class SessionTest extends CakeTestCase {
$this->Session->destroy();
$this->assertFalse($this->Session->read('SessionTestCase'));
session_write_close();
+
+ unset($_SESSION);
+ ini_set('session.save_handler', 'files');
+ Configure::write('Session.save', 'php');
+ $this->setUp();
}
}
?>
\ No newline at end of file
From 93bf4fd0dc39b1059de7c3dbc9921389488ee247 Mon Sep 17 00:00:00 2001
From: davidpersson
Date: Sun, 15 Mar 2009 19:31:59 +0000
Subject: [PATCH 07/67] Fixing debug() test making it match truncated paths
too. Adding skip to uses() test to make running all tests in sequence more
smooth.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8104 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/tests/cases/basics.test.php | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/cake/tests/cases/basics.test.php b/cake/tests/cases/basics.test.php
index 14a5e99c4..06ef9a37c 100644
--- a/cake/tests/cases/basics.test.php
+++ b/cake/tests/cases/basics.test.php
@@ -119,6 +119,8 @@ class BasicsTest extends CakeTestCase {
* @return void
*/
function testUses() {
+ $this->skipIf(class_exists('Security') || class_exists('Sanitize'), 'Security and/or Sanitize class already loaded');
+
$this->assertFalse(class_exists('Security'));
$this->assertFalse(class_exists('Sanitize'));
@@ -532,15 +534,17 @@ class BasicsTest extends CakeTestCase {
ob_start();
debug('this-is-a-test');
$result = ob_get_clean();
- $pattern = '/.*' . preg_quote(substr(__FILE__, 1), '/')
- . '.*line.*' . (__LINE__ - 3) . '.*this-is-a-test.*/s';
+ $pattern = '/.*\>(cake(\/|\\\)tests(\/|\\\)cases(\/|\\\)basics\.test\.php|';
+ $pattern .= preg_quote(substr(__FILE__, 1), '/') . ')';
+ $pattern .= '.*line.*' . (__LINE__ - 4) . '.*this-is-a-test.*/s';
$this->assertPattern($pattern, $result);
ob_start();
debug('this-is-a-test
', true);
$result = ob_get_clean();
- $pattern = '/.*' . preg_quote(substr(__FILE__, 1), '/')
- . '.*line.*' . (__LINE__ - 3) . '.*<div>this-is-a-test<\/div>.*/s';
+ $pattern = '/.*\>(cake(\/|\\\)tests(\/|\\\)cases(\/|\\\)basics\.test\.php|';
+ $pattern .= preg_quote(substr(__FILE__, 1), '/') . ')';
+ $pattern .= '.*line.*' . (__LINE__ - 4) . '.*<div>this-is-a-test<\/div>.*/s';
$this->assertPattern($pattern, $result);
}
/**
From 056402efa708d986b9da283d5f5b831840cdabcd Mon Sep 17 00:00:00 2001
From: gwoo
Date: Sun, 15 Mar 2009 19:39:35 +0000
Subject: [PATCH 08/67] moving checks for Set::extract() so that null will be
returned when empty data is passed and classicExtract is expected.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8105 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/set.php | 6 +++---
cake/tests/cases/libs/set.test.php | 8 +++++---
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/cake/libs/set.php b/cake/libs/set.php
index 4376f5c05..bed03379a 100644
--- a/cake/libs/set.php
+++ b/cake/libs/set.php
@@ -374,12 +374,12 @@ class Set extends Object {
$data = $path;
$path = $tmp;
}
- if (empty($data)) {
- return array();
- }
if (strpos($path, '/') === false) {
return Set::classicExtract($data, $path);
}
+ if (empty($data)) {
+ return array();
+ }
if ($path === '/') {
return $data;
}
diff --git a/cake/tests/cases/libs/set.test.php b/cake/tests/cases/libs/set.test.php
index ed2f4f04c..81f884394 100644
--- a/cake/tests/cases/libs/set.test.php
+++ b/cake/tests/cases/libs/set.test.php
@@ -1052,15 +1052,17 @@ class SetTest extends CakeTestCase {
*/
function testSetExtractReturnsEmptyArray() {
- $this->assertEqual(Set::extract(array(), '/Post/id'), array());
+ $this->assertIdentical(Set::extract(array(), '/Post/id'), array());
- $this->assertEqual(Set::extract('/Post/id', array()), array());
+ $this->assertIdentical(Set::extract('/Post/id', array()), array());
- $this->assertEqual(Set::extract('/Post/id', array(
+ $this->assertIdentical(Set::extract('/Post/id', array(
array('Post' => array('name' => 'bob')),
array('Post' => array('name' => 'jim'))
)), array());
+ $this->assertIdentical(Set::extract(array(), 'Message.flash'), null);
+
}
/**
* testClassicExtract method
From beb6aeec0c884a5a8183ae669fd7b3370d500505 Mon Sep 17 00:00:00 2001
From: jperras
Date: Sun, 15 Mar 2009 23:01:21 +0000
Subject: [PATCH 09/67] Fixing incorrect doc blocks for connection_manager.php.
Thanks to ADmad for noticing the inconsistency.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8106 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/model/connection_manager.php | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/cake/libs/model/connection_manager.php b/cake/libs/model/connection_manager.php
index 524d2bd36..3cb92901b 100644
--- a/cake/libs/model/connection_manager.php
+++ b/cake/libs/model/connection_manager.php
@@ -1,9 +1,9 @@
\ No newline at end of file
+?>
From 4dceb5be3179811b32d8a59a576cf917826f320d Mon Sep 17 00:00:00 2001
From: mark_story
Date: Mon, 16 Mar 2009 03:01:51 +0000
Subject: [PATCH 10/67] Adding doc blocks for properties that previously had no
documentation. Closes #6199
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8107 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/controller/controller.php | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/cake/libs/controller/controller.php b/cake/libs/controller/controller.php
index f50a98913..f07a2b723 100644
--- a/cake/libs/controller/controller.php
+++ b/cake/libs/controller/controller.php
@@ -291,6 +291,32 @@ class Controller extends Object {
* @link
*/
var $methods = array();
+/**
+ * This controller's primary model class name, the Inflector::classify()'ed verision of
+ * the controller's $name property.
+ *
+ * Example: For a controller named 'Comments', the modelClass would be 'Comment'
+ *
+ * @var string
+ * @access public
+ */
+ var $modelClass = null;
+/**
+ * This controller's model key name, an underscored version of the controller's $modelClass property.
+ *
+ * Example: For a controller named 'ArticleComments', the modelKey would be 'article_comment'
+ *
+ * @var string
+ * @access public
+ */
+ var $modelKey = null;
+/**
+ * Holds any validation errors produced by the last call of the validateErrors() method/
+ *
+ * @var array Validation errors, or false if none
+ * @access public
+ */
+ var $validationErrors = null;
/**
* Constructor.
*
From eba2e78d06e8bd3a2a4f6676bc80c6ebb0c45647 Mon Sep 17 00:00:00 2001
From: mark_story
Date: Mon, 16 Mar 2009 03:06:28 +0000
Subject: [PATCH 11/67] Fixing typo in last commit.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8108 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/controller/controller.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cake/libs/controller/controller.php b/cake/libs/controller/controller.php
index f07a2b723..116e993d8 100644
--- a/cake/libs/controller/controller.php
+++ b/cake/libs/controller/controller.php
@@ -292,7 +292,7 @@ class Controller extends Object {
*/
var $methods = array();
/**
- * This controller's primary model class name, the Inflector::classify()'ed verision of
+ * This controller's primary model class name, the Inflector::classify()'ed version of
* the controller's $name property.
*
* Example: For a controller named 'Comments', the modelClass would be 'Comment'
From a9062e2e0293b70a984fdb9b431cd3a57d36de04 Mon Sep 17 00:00:00 2001
From: "mariano.iglesias"
Date: Mon, 16 Mar 2009 12:54:25 +0000
Subject: [PATCH 12/67] Adding new email validation
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8109 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/tests/cases/libs/validation.test.php | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/cake/tests/cases/libs/validation.test.php b/cake/tests/cases/libs/validation.test.php
index c8c4c145c..310b7a8ae 100644
--- a/cake/tests/cases/libs/validation.test.php
+++ b/cake/tests/cases/libs/validation.test.php
@@ -83,7 +83,7 @@ class ValidationTestCase extends CakeTestCase {
$this->assertTrue(Validation::notEmpty('π'));
$this->assertFalse(Validation::notEmpty("\t "));
$this->assertFalse(Validation::notEmpty(""));
-
+
}
/**
* testNotEmptyISO88591Encoding method
@@ -1514,6 +1514,7 @@ class ValidationTestCase extends CakeTestCase {
$this->assertTrue(Validation::email('abc@g.cn'));
$this->assertTrue(Validation::email('abc@x.com'));
$this->assertTrue(Validation::email('henrik@sbcglobal.net'));
+ $this->assertTrue(Validation::email('sani@sbcglobal.net'));
// all ICANN TLDs
$this->assertTrue(Validation::email('abc@example.aero'));
@@ -1974,4 +1975,4 @@ class ValidationTestCase extends CakeTestCase {
// $this->assertTrue(Validation::file(TEST_CAKE_CORE_INCLUDE_PATH. 'VERSION.txt'));
// }
}
-?>
\ No newline at end of file
+?>
From 0ead89639a77f4e958240230d36296e2b172aaad Mon Sep 17 00:00:00 2001
From: davidpersson
Date: Mon, 16 Mar 2009 14:07:26 +0000
Subject: [PATCH 13/67] Adding tests for Controller::redirect. Proves #6200 is
invalid. Making original tests more strict.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8110 3807eeeb-6ff5-0310-8944-8be069107fe0
---
.../cases/libs/controller/controller.test.php | 98 +++++++++++++++----
1 file changed, 79 insertions(+), 19 deletions(-)
diff --git a/cake/tests/cases/libs/controller/controller.test.php b/cake/tests/cases/libs/controller/controller.test.php
index e0bbfeda9..3f64adbc8 100644
--- a/cake/tests/cases/libs/controller/controller.test.php
+++ b/cake/tests/cases/libs/controller/controller.test.php
@@ -30,14 +30,14 @@ App::import('Component', 'Cookie');
/**
* AppController class
*
- * @package cake
+ * @package cake.tests
* @subpackage cake.tests.cases.libs.controller
*/
if (!class_exists('AppController')) {
/**
* AppController class
*
- * @package cake
+ * @package cake.tests
* @subpackage cake.tests.cases.libs.controller
*/
class AppController extends Controller {
@@ -131,7 +131,7 @@ class ControllerPost extends CakeTestModel {
/**
* ControllerPostsController class
*
- * @package cake
+ * @package cake.tests
* @subpackage cake.tests.cases.libs.controller
*/
class ControllerCommentsController extends AppController {
@@ -251,7 +251,7 @@ class ControllerPaginateModel extends CakeTestModel {
/**
* NameTest class
*
- * @package cake
+ * @package cake.tests
* @subpackage cake.tests.cases.libs.controller
*/
class NameTest extends CakeTestModel {
@@ -278,7 +278,7 @@ class NameTest extends CakeTestModel {
/**
* TestController class
*
- * @package cake
+ * @package cake.tests
* @subpackage cake.tests.cases.libs.controller
*/
class TestController extends AppController {
@@ -325,7 +325,7 @@ class TestController extends AppController {
/**
* TestComponent class
*
- * @package cake
+ * @package cake.tests
* @subpackage cake.tests.cases.libs.controller
*/
class TestComponent extends Object {
@@ -336,13 +336,12 @@ class TestComponent extends Object {
* @return void
*/
function beforeRedirect() {
- return true;
}
}
/**
* AnotherTestController class
*
- * @package cake
+ * @package cake.tests
* @subpackage cake.tests.cases.libs.controller
*/
class AnotherTestController extends AppController {
@@ -352,7 +351,6 @@ class AnotherTestController extends AppController {
* @access public
*/
var $name = 'AnotherTest';
-
/**
* uses property
*
@@ -417,7 +415,12 @@ class ControllerTest extends CakeTestCase {
Configure::write('pluginPaths', $_back['pluginPaths']);
unset($Controller);
}
-
+/**
+ * testAliasName method
+ *
+ * @access public
+ * @return void
+ */
function testAliasName() {
$Controller =& new Controller();
$Controller->uses = array('NameTest');
@@ -428,7 +431,6 @@ class ControllerTest extends CakeTestCase {
unset($Controller);
}
-
/**
* testPersistent method
*
@@ -735,7 +737,6 @@ class ControllerTest extends CakeTestCase {
* @return void
*/
function testRedirect() {
- $url = 'cakephp.org';
$codes = array(
100 => "Continue",
101 => "Switching Protocols",
@@ -779,26 +780,85 @@ class ControllerTest extends CakeTestCase {
);
Mock::generatePartial('Controller', 'MockController', array('header'));
+ Mock::generate('TestComponent', 'MockTestComponent');
+ Mock::generate('TestComponent', 'MockTestBComponent');
+
App::import('Helper', 'Cache');
-// $codes = array_merge($codes, array_flip($codes));
foreach ($codes as $code => $msg) {
$MockController =& new MockController();
- $MockController->components = array('Test');
$MockController->Component =& new Component();
$MockController->Component->init($MockController);
+ $MockController->expectAt(0, 'header', array("HTTP/1.1 {$code} {$msg}"));
+ $MockController->expectAt(1, 'header', array('Location: http://cakephp.org'));
$MockController->expectCallCount('header', 2);
- $MockController->redirect($url, (int) $code, false);
+ $MockController->redirect('http://cakephp.org', (int)$code, false);
+ $this->assertFalse($MockController->autoRender);
}
- $codes = array_flip($codes);
foreach ($codes as $code => $msg) {
$MockController =& new MockController();
- $MockController->components = array('Test');
$MockController->Component =& new Component();
$MockController->Component->init($MockController);
+ $MockController->expectAt(0, 'header', array("HTTP/1.1 {$code} {$msg}"));
+ $MockController->expectAt(1, 'header', array('Location: http://cakephp.org'));
$MockController->expectCallCount('header', 2);
- $MockController->redirect($url, $code, false);
+ $MockController->redirect('http://cakephp.org', $msg, false);
+ $this->assertFalse($MockController->autoRender);
}
+
+ $MockController =& new MockController();
+ $MockController->Component =& new Component();
+ $MockController->Component->init($MockController);
+ $MockController->expectAt(0, 'header', array('Location: http://www.example.org/users/login'));
+ $MockController->expectCallCount('header', 1);
+ $MockController->redirect('http://www.example.org/users/login', null, false);
+
+ $MockController =& new MockController();
+ $MockController->Component =& new Component();
+ $MockController->Component->init($MockController);
+ $MockController->expectAt(0, 'header', array('HTTP/1.1 301 Moved Permanently'));
+ $MockController->expectAt(1, 'header', array('Location: http://www.example.org/users/login'));
+ $MockController->expectCallCount('header', 2);
+ $MockController->redirect('http://www.example.org/users/login', 301, false);
+
+ $MockController =& new MockController();
+ $MockController->components = array('MockTest');
+ $MockController->Component =& new Component();
+ $MockController->Component->init($MockController);
+ $MockController->MockTest->setReturnValue('beforeRedirect', null);
+ $MockController->expectAt(0, 'header', array('HTTP/1.1 301 Moved Permanently'));
+ $MockController->expectAt(1, 'header', array('Location: http://cakephp.org'));
+ $MockController->expectCallCount('header', 2);
+ $MockController->redirect('http://cakephp.org', 301, false);
+
+ $MockController =& new MockController();
+ $MockController->components = array('MockTest');
+ $MockController->Component =& new Component();
+ $MockController->Component->init($MockController);
+ $MockController->MockTest->setReturnValue('beforeRedirect', 'http://book.cakephp.org');
+ $MockController->expectAt(0, 'header', array('HTTP/1.1 301 Moved Permanently'));
+ $MockController->expectAt(1, 'header', array('Location: http://book.cakephp.org'));
+ $MockController->expectCallCount('header', 2);
+ $MockController->redirect('http://cakephp.org', 301, false);
+
+ $MockController =& new MockController();
+ $MockController->components = array('MockTest');
+ $MockController->Component =& new Component();
+ $MockController->Component->init($MockController);
+ $MockController->MockTest->setReturnValue('beforeRedirect', false);
+ $MockController->expectNever('header');
+ $MockController->redirect('http://cakephp.org', 301, false);
+
+ $MockController =& new MockController();
+ $MockController->components = array('MockTest', 'MockTestB');
+ $MockController->Component =& new Component();
+ $MockController->Component->init($MockController);
+ $MockController->MockTest->setReturnValue('beforeRedirect', 'http://book.cakephp.org');
+ $MockController->MockTestB->setReturnValue('beforeRedirect', 'http://bakery.cakephp.org');
+ $MockController->expectAt(0, 'header', array('HTTP/1.1 301 Moved Permanently'));
+ $MockController->expectAt(1, 'header', array('Location: http://bakery.cakephp.org'));
+ $MockController->expectCallCount('header', 2);
+ $MockController->redirect('http://cakephp.org', 301, false);
}
/**
* testMergeVars method
@@ -859,7 +919,7 @@ class ControllerTest extends CakeTestCase {
$this->assertTrue(isset($TestController->ControllerComment));
}
/**
- * Ensure that __mergeVars is not being greedy and merging with
+ * Ensure that __mergeVars is not being greedy and merging with
* AppController when you make an instance of Controller
*
* @return void
From 1c76e2e18eda4379e3537b35f0f4e620b90b2b33 Mon Sep 17 00:00:00 2001
From: davidpersson
Date: Mon, 16 Mar 2009 22:54:22 +0000
Subject: [PATCH 14/67] Fixing ShellDispatcher tests. Order of paths should not
be taken into account. CONSOLE_LIBS constant is not guaranteed to hold a
relative path only. Matching expectations for the output of help command to
show correct shortened paths.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8111 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/tests/cases/console/cake.test.php | 32 +++++++++++++-------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/cake/tests/cases/console/cake.test.php b/cake/tests/cases/console/cake.test.php
index 04e4ecae2..14227718b 100644
--- a/cake/tests/cases/console/cake.test.php
+++ b/cake/tests/cases/console/cake.test.php
@@ -76,7 +76,6 @@ class TestShellDispatcher extends ShellDispatcher {
* @return void
*/
function _initEnvironment() {
- //
}
/**
* stderr method
@@ -128,10 +127,11 @@ class ShellDispatcherTest extends UnitTestCase {
$this->pluginPaths = Configure::read('pluginPaths');
$this->shellPaths = Configure::read('shellPaths');
}
-
- Configure::write('pluginPaths', array(TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'plugins' . DS));
+ Configure::write('pluginPaths', array(
+ TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'plugins' . DS
+ ));
Configure::write('shellPaths', array(
- ROOT . DS . CONSOLE_LIBS,
+ CORE_PATH ? CONSOLE_LIBS : ROOT . DS . CONSOLE_LIBS,
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'vendors' . DS . 'shells' . DS
));
}
@@ -406,14 +406,18 @@ class ShellDispatcherTest extends UnitTestCase {
*/
function testBuildPaths() {
$Dispatcher =& new TestShellDispatcher();
- $this->assertEqual($Dispatcher->shellPaths, array(
+
+ $result = $Dispatcher->shellPaths;
+ $expected = array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'plugins' . DS . 'test_plugin' . DS . 'vendors' . DS . 'shells' . DS,
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'plugins' . DS . 'test_plugin_two' . DS . 'vendors' . DS . 'shells' . DS,
APP . 'vendors' . DS . 'shells' . DS,
VENDORS . 'shells' . DS,
- ROOT . DS . CONSOLE_LIBS,
+ CORE_PATH ? CONSOLE_LIBS : ROOT . DS . CONSOLE_LIBS,
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'vendors' . DS . 'shells' . DS,
- ));
+ );
+ $this->assertIdentical(array_diff($result, $expected), array());
+ $this->assertIdentical(array_diff($expected, $result), array());
}
/**
* testDispatch method
@@ -440,20 +444,18 @@ class ShellDispatcherTest extends UnitTestCase {
function testHelpCommand() {
$Dispatcher =& new TestShellDispatcher();
- $expected = "/ ROOT(\\\|\/)cake(\\\|\/)tests(\\\|\/)test_app(\\\|\/)plugins(\\\|\/)test_plugin(\\\|\/)vendors(\\\|\/)shells:";
+ $expected = "/ CORE(\\\|\/)tests(\\\|\/)test_app(\\\|\/)plugins(\\\|\/)test_plugin(\\\|\/)vendors(\\\|\/)shells:";
$expected .= "\n\t example";
$expected .= "\n/";
$this->assertPattern($expected, $Dispatcher->stdout);
- // Shells need to be returned ordered
- // See Configure::__list/Folder::read
- $expected = "/ ROOT(\\\|\/)cake(\\\|\/)tests(\\\|\/)test_app(\\\|\/)plugins(\\\|\/)test_plugin_two(\\\|\/)vendors(\\\|\/)shells:";
+ $expected = "/ CORE(\\\|\/)tests(\\\|\/)test_app(\\\|\/)plugins(\\\|\/)test_plugin_two(\\\|\/)vendors(\\\|\/)shells:";
$expected .= "\n\t example";
$expected .= "\n\t welcome";
$expected .= "\n/";
$this->assertPattern($expected, $Dispatcher->stdout);
- $expected = "/ ROOT(\\\|\/)app(\\\|\/)vendors(\\\|\/)shells:";
+ $expected = "/ APP(\\\|\/)vendors(\\\|\/)shells:";
$expected .= "\n\t - none";
$expected .= "\n/";
$this->assertPattern($expected, $Dispatcher->stdout);
@@ -463,9 +465,7 @@ class ShellDispatcherTest extends UnitTestCase {
$expected .= "\n/";
$this->assertPattern($expected, $Dispatcher->stdout);
- // Shells need to be returned ordered
- // See Configure::__list/Folder::read
- $expected = "/ ROOT(\\\|\/)cake(\\\|\/)console(\\\|\/)libs:";
+ $expected = "/ CORE(\\\|\/)console(\\\|\/)libs:";
$expected .= "\n\t acl";
$expected .= "\n\t api";
$expected .= "\n\t bake";
@@ -476,7 +476,7 @@ class ShellDispatcherTest extends UnitTestCase {
$expected .= "\n/";
$this->assertPattern($expected, $Dispatcher->stdout);
- $expected = "/ ROOT(\\\|\/)cake(\\\|\/)tests(\\\|\/)test_app(\\\|\/)vendors(\\\|\/)shells:";
+ $expected = "/ CORE(\\\|\/)tests(\\\|\/)test_app(\\\|\/)vendors(\\\|\/)shells:";
$expected .= "\n\t sample";
$expected .= "\n/";
$this->assertPattern($expected, $Dispatcher->stdout);
From 7f853532d9a47040aaabf8c60fb525b6e7667ef4 Mon Sep 17 00:00:00 2001
From: gwoo
Date: Mon, 16 Mar 2009 23:08:39 +0000
Subject: [PATCH 15/67] updating ShellDispatcher to pass tests
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8112 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/console/cake.php | 14 ++++++++++----
cake/tests/cases/console/cake.test.php | 2 --
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/cake/console/cake.php b/cake/console/cake.php
index 97824e62d..823e6fc00 100644
--- a/cake/console/cake.php
+++ b/cake/console/cake.php
@@ -198,10 +198,14 @@ class ShellDispatcher {
*/
function __buildPaths() {
$paths = array();
-
$pluginPaths = Configure::read('pluginPaths');
+ if (!class_exists('Folder')) {
+ require LIBS . 'folder.php';
+ }
+
foreach ($pluginPaths as $pluginPath) {
- $plugins = Configure::listObjects('plugin', $pluginPath);
+ $Folder =& new Folder($pluginPath);
+ list($plugins,) = $Folder->read(false, true);
foreach ((array)$plugins as $plugin) {
$path = $pluginPath . Inflector::underscore($plugin) . DS . 'vendors' . DS . 'shells' . DS;
if (file_exists($path)) {
@@ -262,7 +266,6 @@ class ShellDispatcher {
Configure::write('debug', 1);
return true;
}
-
/**
* Dispatches a CLI request
*
@@ -542,16 +545,19 @@ class ShellDispatcher {
$this->stdout("\nAvailable Shells:");
$_shells = array();
+
foreach ($this->shellPaths as $path) {
if (is_dir($path)) {
$shells = Configure::listObjects('file', $path);
- $path = str_replace(CORE_PATH, 'CORE/', $path);
+ $path = str_replace(CAKE_CORE_INCLUDE_PATH . DS . 'cake' . DS, 'CORE' . DS, $path);
+ $path = str_replace(APP, 'APP' . DS, $path);
$path = str_replace(ROOT, 'ROOT', $path);
$path = rtrim($path, DS);
$this->stdout("\n " . $path . ":");
if (empty($shells)) {
$this->stdout("\t - none");
} else {
+ sort($shells);
foreach ($shells as $shell) {
if ($shell !== 'shell.php') {
$this->stdout("\t " . str_replace('.php', '', $shell));
diff --git a/cake/tests/cases/console/cake.test.php b/cake/tests/cases/console/cake.test.php
index 14227718b..c881a67de 100644
--- a/cake/tests/cases/console/cake.test.php
+++ b/cake/tests/cases/console/cake.test.php
@@ -456,12 +456,10 @@ class ShellDispatcherTest extends UnitTestCase {
$this->assertPattern($expected, $Dispatcher->stdout);
$expected = "/ APP(\\\|\/)vendors(\\\|\/)shells:";
- $expected .= "\n\t - none";
$expected .= "\n/";
$this->assertPattern($expected, $Dispatcher->stdout);
$expected = "/ ROOT(\\\|\/)vendors(\\\|\/)shells:";
- $expected .= "\n\t - none";
$expected .= "\n/";
$this->assertPattern($expected, $Dispatcher->stdout);
From de5907326e567cbeb083a7d58b97165e823537bd Mon Sep 17 00:00:00 2001
From: gwoo
Date: Tue, 17 Mar 2009 18:19:12 +0000
Subject: [PATCH 16/67] fixes #6203, Model::invalidFields respecting
Model::whitelist
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8113 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/model/model.php | 10 +++++--
cake/tests/cases/libs/model/model.test.php | 33 +++++++++++++---------
2 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/cake/libs/model/model.php b/cake/libs/model/model.php
index 5bc46348e..838d51b7e 100644
--- a/cake/libs/model/model.php
+++ b/cake/libs/model/model.php
@@ -2343,9 +2343,15 @@ class Model extends Overloadable {
$this->exists();
$_validate = $this->validate;
- if (array_key_exists('fieldList', $options) && is_array($options['fieldList']) && !empty($options['fieldList'])) {
+ $whitelist = $this->whitelist;
+
+ if (array_key_exists('fieldList', $options)) {
+ $whitelist = $options['fieldList'];
+ }
+
+ if (!empty($whitelist)) {
$validate = array();
- foreach ($options['fieldList'] as $f) {
+ foreach ((array)$whitelist as $f) {
if (!empty($this->validate[$f])) {
$validate[$f] = $this->validate[$f];
}
diff --git a/cake/tests/cases/libs/model/model.test.php b/cake/tests/cases/libs/model/model.test.php
index 51d3d2f5f..6c9760b81 100644
--- a/cake/tests/cases/libs/model/model.test.php
+++ b/cake/tests/cases/libs/model/model.test.php
@@ -2999,16 +2999,16 @@ class ModelTest extends CakeTestCase {
)
);
$this->assertEqual($result, $expected);
-
-
+
+
$this->loadFixtures('JoinA', 'JoinC', 'JoinAC', 'JoinB', 'JoinAB');
$TestModel = new JoinA();
$TestModel->hasBelongsToMany['JoinC']['unique'] = true;
$data = array(
'JoinA' => array(
'id' => 1,
- 'name' => 'Join A 1',
- 'body' => 'Join A 1 Body',
+ 'name' => 'Join A 1',
+ 'body' => 'Join A 1 Body',
),
'JoinC' => array(
'JoinC' => array(
@@ -3279,10 +3279,10 @@ class ModelTest extends CakeTestCase {
$this->assertEqual(count($result['Comment']), 1);
$this->assertEqual(count($result['Comment'][0]['comment']['Article comment']), 1);
}
-
+
function testSaveAllHabtmWithExtraJoinTableFields() {
$this->loadFixtures('Something', 'SomethingElse', 'JoinThing');
-
+
$data = array(
'Something' => array(
'id' => 4,
@@ -3301,18 +3301,18 @@ class ModelTest extends CakeTestCase {
$result = $Something->saveAll($data);
$this->assertTrue($result);
$result = $Something->read();
-
+
$this->assertEqual(count($result['SomethingElse']), 3);
$this->assertTrue(Set::matches('/Something[id=4]', $result));
-
+
$this->assertTrue(Set::matches('/SomethingElse[id=1]', $result));
$this->assertTrue(Set::matches('/SomethingElse[id=1]/JoinThing[something_else_id=1]', $result));
$this->assertTrue(Set::matches('/SomethingElse[id=1]/JoinThing[doomed=1]', $result));
-
+
$this->assertTrue(Set::matches('/SomethingElse[id=2]', $result));
$this->assertTrue(Set::matches('/SomethingElse[id=2]/JoinThing[something_else_id=2]', $result));
$this->assertTrue(Set::matches('/SomethingElse[id=2]/JoinThing[doomed=0]', $result));
-
+
$this->assertTrue(Set::matches('/SomethingElse[id=3]', $result));
$this->assertTrue(Set::matches('/SomethingElse[id=3]/JoinThing[something_else_id=3]', $result));
$this->assertTrue(Set::matches('/SomethingElse[id=3]/JoinThing[doomed=1]', $result));
@@ -3800,8 +3800,8 @@ class ModelTest extends CakeTestCase {
$model->deleteAll(true);
$data = array(
'Article' => array(
- 'title' => 'Post with Author saveAlled from comment',
- 'body' => 'This post will be saved with an author',
+ 'title' => 'Post with Author saveAlled from comment',
+ 'body' => 'This post will be saved with an author',
'user_id' => 2
),
'Comment' => array(
@@ -3810,7 +3810,7 @@ class ModelTest extends CakeTestCase {
);
$result = $model->Comment->saveAll($data, array('validate' => 'first'));
$this->assertTrue($result);
-
+
$result = $model->find('all');
$this->assertEqual($result[0]['Article']['title'], 'Post with Author saveAlled from comment');
$this->assertEqual($result[0]['Comment'][0]['comment'], 'Only new comment');
@@ -4983,6 +4983,13 @@ class ModelTest extends CakeTestCase {
$TestModel->invalidFields(array('fieldList' => array('name', 'title')));
$expected = array('name' => 'This field cannot be left blank', 'title' => 'This field cannot be left blank');
$this->assertEqual($TestModel->validationErrors, $expected);
+ $TestModel->validationErrors = array();
+
+ $TestModel->whitelist = array('name');
+ $TestModel->invalidFields();
+ $expected = array('name' => 'This field cannot be left blank');
+ $this->assertEqual($TestModel->validationErrors, $expected);
+ $TestModel->validationErrors = array();
$this->assertEqual($TestModel->validate, $validate);
}
From 76e0f17dbcaeaffa0484c62e26a6b9922b9cc27e Mon Sep 17 00:00:00 2001
From: "renan.saddam"
Date: Tue, 17 Mar 2009 21:10:28 +0000
Subject: [PATCH 17/67] Updating documentation to improve code completion
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8114 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/console/libs/acl.php | 2 +-
cake/console/libs/shell.php | 4 +-
cake/libs/cache.php | 2 +-
cake/libs/cache/file.php | 2 +-
cake/libs/cache/memcache.php | 2 +-
cake/libs/controller/scaffold.php | 2 +-
cake/libs/error.php | 2 +-
cake/libs/file.php | 4 +-
cake/libs/i18n.php | 2 +-
cake/libs/model/behavior.php | 4 +-
cake/libs/model/connection_manager.php | 4 +-
cake/libs/model/model.php | 2 +-
cake/libs/object.php | 2 +-
cake/libs/view/helpers/ajax.php | 6 +-
cake/libs/view/helpers/cache.php | 2 +-
cake/tests/cases/libs/magic_db.test.php | 2 +-
.../model/datasources/dbo/dbo_adodb.test.php | 2 +-
.../model/datasources/dbo/dbo_mssql.test.php | 14 +-
.../model/datasources/dbo/dbo_mysql.test.php | 134 +++++++++---------
.../model/datasources/dbo/dbo_mysqli.test.php | 2 +-
.../datasources/dbo/dbo_postgres.test.php | 24 ++--
.../model/datasources/dbo/dbo_sqlite.test.php | 12 +-
22 files changed, 116 insertions(+), 116 deletions(-)
diff --git a/cake/console/libs/acl.php b/cake/console/libs/acl.php
index c1593bba4..0e44bd82b 100644
--- a/cake/console/libs/acl.php
+++ b/cake/console/libs/acl.php
@@ -36,7 +36,7 @@ class AclShell extends Shell {
/**
* Contains instance of AclComponent
*
- * @var object
+ * @var AclComponent
* @access public
*/
var $Acl;
diff --git a/cake/console/libs/shell.php b/cake/console/libs/shell.php
index 04e444d2d..bac6c347b 100644
--- a/cake/console/libs/shell.php
+++ b/cake/console/libs/shell.php
@@ -34,7 +34,7 @@ class Shell extends Object {
/**
* An instance of the ShellDispatcher object that loaded this script
*
- * @var object
+ * @var ShellDispatcher
* @access public
*/
var $Dispatch = null;
@@ -49,7 +49,7 @@ class Shell extends Object {
* Holds the DATABASE_CONFIG object for the app. Null if database.php could not be found,
* or the app does not exist.
*
- * @var object
+ * @var DATABASE_CONFIG
* @access public
*/
var $DbConfig = null;
diff --git a/cake/libs/cache.php b/cake/libs/cache.php
index 6a6550cdb..aabd27951 100644
--- a/cake/libs/cache.php
+++ b/cake/libs/cache.php
@@ -33,7 +33,7 @@ class Cache extends Object {
/**
* Cache engine to use
*
- * @var object
+ * @var CacheEngine
* @access protected
*/
var $_Engine = null;
diff --git a/cake/libs/cache/file.php b/cake/libs/cache/file.php
index 40ec52c27..29dde9249 100644
--- a/cake/libs/cache/file.php
+++ b/cake/libs/cache/file.php
@@ -34,7 +34,7 @@ class FileEngine extends CacheEngine {
/**
* Instance of File class
*
- * @var object
+ * @var File
* @access private
*/
var $__File = null;
diff --git a/cake/libs/cache/memcache.php b/cake/libs/cache/memcache.php
index c2118098e..2d70a6e86 100644
--- a/cake/libs/cache/memcache.php
+++ b/cake/libs/cache/memcache.php
@@ -33,7 +33,7 @@ class MemcacheEngine extends CacheEngine {
/**
* Memcache wrapper.
*
- * @var object
+ * @var Memcache
* @access private
*/
var $__Memcache = null;
diff --git a/cake/libs/controller/scaffold.php b/cake/libs/controller/scaffold.php
index a76966bdb..1c326cffe 100644
--- a/cake/libs/controller/scaffold.php
+++ b/cake/libs/controller/scaffold.php
@@ -39,7 +39,7 @@ class Scaffold extends Object {
/**
* Controller object
*
- * @var object
+ * @var Controller
* @access public
*/
var $controller = null;
diff --git a/cake/libs/error.php b/cake/libs/error.php
index 2cce9861f..e8db8276a 100644
--- a/cake/libs/error.php
+++ b/cake/libs/error.php
@@ -70,7 +70,7 @@ class ErrorHandler extends Object {
/**
* Controller instance.
*
- * @var object
+ * @var Controller
* @access public
*/
var $controller = null;
diff --git a/cake/libs/file.php b/cake/libs/file.php
index fbb5aa8c7..e22031749 100644
--- a/cake/libs/file.php
+++ b/cake/libs/file.php
@@ -42,7 +42,7 @@ class File extends Object {
/**
* Folder object of the File
*
- * @var object
+ * @var Folder
* @access public
*/
var $Folder = null;
@@ -376,7 +376,7 @@ class File extends Object {
}
/**
* Returns the full path of the File.
- *
+ *
* @return string Full path to file
* @access public
*/
diff --git a/cake/libs/i18n.php b/cake/libs/i18n.php
index 36af0284d..850ac5782 100644
--- a/cake/libs/i18n.php
+++ b/cake/libs/i18n.php
@@ -40,7 +40,7 @@ class I18n extends Object {
/**
* Instance of the I10n class for localization
*
- * @var object
+ * @var I10n
* @access public
*/
var $l10n = null;
diff --git a/cake/libs/model/behavior.php b/cake/libs/model/behavior.php
index ff98f5144..fdbc64e30 100644
--- a/cake/libs/model/behavior.php
+++ b/cake/libs/model/behavior.php
@@ -205,11 +205,11 @@ class ModelBehavior extends Object {
* @subpackage cake.cake.libs.model
*/
class BehaviorCollection extends Object {
-
/**
* Stores a reference to the attached name
*
- * @var object
+ * @var string
+ * @access public
*/
var $modelName = null;
/**
diff --git a/cake/libs/model/connection_manager.php b/cake/libs/model/connection_manager.php
index 3cb92901b..32f169840 100644
--- a/cake/libs/model/connection_manager.php
+++ b/cake/libs/model/connection_manager.php
@@ -3,7 +3,7 @@
/**
* Datasource connection manager
*
- * Provides an interface for loading and enumerating connections defined in app/config/database.php
+ * Provides an interface for loading and enumerating connections defined in app/config/database.php
*
* PHP versions 4 and 5
*
@@ -39,7 +39,7 @@ class ConnectionManager extends Object {
/**
* Holds a loaded instance of the Connections object
*
- * @var object
+ * @var DATABASE_CONFIG
* @access public
*/
var $config = null;
diff --git a/cake/libs/model/model.php b/cake/libs/model/model.php
index 838d51b7e..d1da65496 100644
--- a/cake/libs/model/model.php
+++ b/cake/libs/model/model.php
@@ -221,7 +221,7 @@ class Model extends Overloadable {
/**
* Holds the Behavior objects currently bound to this model.
*
- * @var object
+ * @var BehaviorCollection
* @access public
*/
var $Behaviors = null;
diff --git a/cake/libs/object.php b/cake/libs/object.php
index 538a858b4..7b62f4e76 100644
--- a/cake/libs/object.php
+++ b/cake/libs/object.php
@@ -38,7 +38,7 @@ class Object {
/**
* Log object
*
- * @var object
+ * @var CakeLog
* @access protected
*/
var $_log = null;
diff --git a/cake/libs/view/helpers/ajax.php b/cake/libs/view/helpers/ajax.php
index e8df8f759..bc4aad584 100644
--- a/cake/libs/view/helpers/ajax.php
+++ b/cake/libs/view/helpers/ajax.php
@@ -42,14 +42,14 @@ class AjaxHelper extends AppHelper {
/**
* HtmlHelper instance
*
- * @var object
+ * @var HtmlHelper
* @access public
*/
var $Html = null;
/**
* JavaScriptHelper instance
*
- * @var object
+ * @var JavaScriptHelper
* @access public
*/
var $Javascript = null;
@@ -901,7 +901,7 @@ class AjaxHelper extends AppHelper {
}
if (isset($options['bind'])) {
$bind = $options['bind'];
-
+
$hasBinding = (
(is_array($bind) && in_array($callback, $bind)) ||
(is_string($bind) && strpos($bind, $callback) !== false)
diff --git a/cake/libs/view/helpers/cache.php b/cake/libs/view/helpers/cache.php
index c40de01b5..dd4f1b499 100644
--- a/cake/libs/view/helpers/cache.php
+++ b/cake/libs/view/helpers/cache.php
@@ -52,7 +52,7 @@ class CacheHelper extends AppHelper {
/**
* holds the View object passed in final call to CacheHelper::cache()
*
- * @var object
+ * @var View
* @access public
*/
var $view;
diff --git a/cake/tests/cases/libs/magic_db.test.php b/cake/tests/cases/libs/magic_db.test.php
index def8d11de..db270803e 100644
--- a/cake/tests/cases/libs/magic_db.test.php
+++ b/cake/tests/cases/libs/magic_db.test.php
@@ -34,7 +34,7 @@ class MagicDbTest extends UnitTestCase {
/**
* The MagicDb instance to be tested
*
- * @var object
+ * @var MagicDb
* @access public
*/
var $Db = null;
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_adodb.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_adodb.test.php
index 63a80779a..1621c6f11 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_adodb.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_adodb.test.php
@@ -182,7 +182,7 @@ class DboAdodbTest extends CakeTestCase {
/**
* The Dbo instance to be tested
*
- * @var object
+ * @var DboSource
* @access public
*/
var $db = null;
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
index d1c1801cb..cc8448a3e 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
@@ -54,7 +54,7 @@ class DboMssqlTestDb extends DboMssql {
var $simulated = array();
/**
* fetchAllResultsStack
- *
+ *
* @var array
* @access public
*/
@@ -72,8 +72,8 @@ class DboMssqlTestDb extends DboMssql {
}
/**
* fetchAll method
- *
- * @param mixed $sql
+ *
+ * @param mixed $sql
* @access protected
* @return void
*/
@@ -82,8 +82,8 @@ class DboMssqlTestDb extends DboMssql {
}
/**
* fetchAll method
- *
- * @param mixed $sql
+ *
+ * @param mixed $sql
* @access protected
* @return void
*/
@@ -192,7 +192,7 @@ class DboMssqlTest extends CakeTestCase {
/**
* The Dbo instance to be tested
*
- * @var object
+ * @var DboSource
* @access public
*/
var $db = null;
@@ -284,7 +284,7 @@ class DboMssqlTest extends CakeTestCase {
}
/**
* testDescribe method
- *
+ *
* @access public
* @return void
*/
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mysql.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mysql.test.php
index 54e029077..dda8322cf 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mysql.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mysql.test.php
@@ -156,7 +156,7 @@ class DboMysqlTest extends CakeTestCase {
/**
* The Dbo instance to be tested
*
- * @var object
+ * @var DboSource
* @access public
*/
var $Db = null;
@@ -372,76 +372,76 @@ class DboMysqlTest extends CakeTestCase {
$name = $this->db->fullTableName('simple');
$mockDbo =& new QueryMockDboMysql($this);
- $columnData = array(
+ $columnData = array(
array('0' => array(
- 'Table' => 'with_compound_keys',
- 'Non_unique' => '0',
- 'Key_name' => 'PRIMARY',
- 'Seq_in_index' => '1',
- 'Column_name' => 'id',
- 'Collation' => 'A',
- 'Cardinality' => '0',
- 'Sub_part' => NULL,
- 'Packed' => NULL,
- 'Null' => '',
- 'Index_type' => 'BTREE',
- 'Comment' => ''
- )),
- array('0' => array(
- 'Table' => 'with_compound_keys',
- 'Non_unique' => '1',
- 'Key_name' => 'pointless_bool',
- 'Seq_in_index' => '1',
- 'Column_name' => 'bool',
- 'Collation' => 'A',
- 'Cardinality' => NULL,
- 'Sub_part' => NULL,
- 'Packed' => NULL,
- 'Null' => 'YES',
- 'Index_type' => 'BTREE',
+ 'Table' => 'with_compound_keys',
+ 'Non_unique' => '0',
+ 'Key_name' => 'PRIMARY',
+ 'Seq_in_index' => '1',
+ 'Column_name' => 'id',
+ 'Collation' => 'A',
+ 'Cardinality' => '0',
+ 'Sub_part' => NULL,
+ 'Packed' => NULL,
+ 'Null' => '',
+ 'Index_type' => 'BTREE',
'Comment' => ''
)),
array('0' => array(
- 'Table' => 'with_compound_keys',
- 'Non_unique' => '1',
- 'Key_name' => 'pointless_small_int',
- 'Seq_in_index' => '1',
- 'Column_name' => 'small_int',
- 'Collation' => 'A',
- 'Cardinality' => NULL,
- 'Sub_part' => NULL,
- 'Packed' => NULL,
- 'Null' => 'YES',
- 'Index_type' => 'BTREE',
+ 'Table' => 'with_compound_keys',
+ 'Non_unique' => '1',
+ 'Key_name' => 'pointless_bool',
+ 'Seq_in_index' => '1',
+ 'Column_name' => 'bool',
+ 'Collation' => 'A',
+ 'Cardinality' => NULL,
+ 'Sub_part' => NULL,
+ 'Packed' => NULL,
+ 'Null' => 'YES',
+ 'Index_type' => 'BTREE',
'Comment' => ''
- )),
+ )),
array('0' => array(
- 'Table' => 'with_compound_keys',
- 'Non_unique' => '1',
- 'Key_name' => 'one_way',
- 'Seq_in_index' => '1',
- 'Column_name' => 'bool',
- 'Collation' => 'A',
- 'Cardinality' => NULL,
- 'Sub_part' => NULL,
- 'Packed' => NULL,
- 'Null' => 'YES',
- 'Index_type' => 'BTREE',
+ 'Table' => 'with_compound_keys',
+ 'Non_unique' => '1',
+ 'Key_name' => 'pointless_small_int',
+ 'Seq_in_index' => '1',
+ 'Column_name' => 'small_int',
+ 'Collation' => 'A',
+ 'Cardinality' => NULL,
+ 'Sub_part' => NULL,
+ 'Packed' => NULL,
+ 'Null' => 'YES',
+ 'Index_type' => 'BTREE',
'Comment' => ''
- )),
+ )),
array('0' => array(
- 'Table' => 'with_compound_keys',
- 'Non_unique' => '1',
- 'Key_name' => 'one_way',
- 'Seq_in_index' => '2',
- 'Column_name' => 'small_int',
- 'Collation' => 'A',
- 'Cardinality' => NULL,
- 'Sub_part' => NULL,
- 'Packed' => NULL,
- 'Null' => 'YES',
- 'Index_type' => 'BTREE',
- 'Comment' => ''
+ 'Table' => 'with_compound_keys',
+ 'Non_unique' => '1',
+ 'Key_name' => 'one_way',
+ 'Seq_in_index' => '1',
+ 'Column_name' => 'bool',
+ 'Collation' => 'A',
+ 'Cardinality' => NULL,
+ 'Sub_part' => NULL,
+ 'Packed' => NULL,
+ 'Null' => 'YES',
+ 'Index_type' => 'BTREE',
+ 'Comment' => ''
+ )),
+ array('0' => array(
+ 'Table' => 'with_compound_keys',
+ 'Non_unique' => '1',
+ 'Key_name' => 'one_way',
+ 'Seq_in_index' => '2',
+ 'Column_name' => 'small_int',
+ 'Collation' => 'A',
+ 'Cardinality' => NULL,
+ 'Sub_part' => NULL,
+ 'Packed' => NULL,
+ 'Null' => 'YES',
+ 'Index_type' => 'BTREE',
+ 'Comment' => ''
))
);
$mockDbo->setReturnValue('query', $columnData, array('SHOW INDEX FROM ' . $name));
@@ -504,7 +504,7 @@ class DboMysqlTest extends CakeTestCase {
}
/**
* testAlterSchemaIndexes method
- *
+ *
* @access public
* @return void
*/
@@ -538,10 +538,10 @@ class DboMysqlTest extends CakeTestCase {
'PRIMARY' => array('column' => 'id', 'unique' => 1))
)));
$this->db->query($this->db->alterSchema($schema2->compare($schema1)));
-
+
$indexes = $this->db->index('altertest');
$this->assertEqual($schema2->tables['altertest']['indexes'], $indexes);
-
+
// Change three indexes, delete one and add another one
$schema3 =& new CakeSchema(array(
'name' => 'AlterTest3',
@@ -552,7 +552,7 @@ class DboMysqlTest extends CakeTestCase {
'group1' => array('type' => 'integer', 'null' => true),
'group2' => array('type' => 'integer', 'null' => true),
'indexes' => array(
- 'name_idx' => array('column' => 'name', 'unique' => 1),
+ 'name_idx' => array('column' => 'name', 'unique' => 1),
'group_idx' => array('column' => 'group2', 'unique' => 0),
'compound_idx' => array('column' => array('group2', 'group1'), 'unique' => 0),
'id_name_idx' => array('column' => array('id', 'name'), 'unique' => 0))
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mysqli.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mysqli.test.php
index ea1dd7b26..38ab1b891 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mysqli.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mysqli.test.php
@@ -159,7 +159,7 @@ class DboMysqliTest extends CakeTestCase {
/**
* The Dbo instance to be tested
*
- * @var object
+ * @var DboSource
* @access public
*/
var $Db = null;
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_postgres.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_postgres.test.php
index d27289a2e..c6ff8a5f0 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_postgres.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_postgres.test.php
@@ -159,19 +159,19 @@ class DboPostgresTest extends CakeTestCase {
* @var object
* @access public
*/
- var $fixtures = array('core.user', 'core.binary_test', 'core.comment', 'core.article',
+ var $fixtures = array('core.user', 'core.binary_test', 'core.comment', 'core.article',
'core.tag', 'core.articles_tag', 'core.attachment', 'core.person', 'core.post', 'core.author');
/**
* Actual DB connection used in testing
*
- * @var object
+ * @var DboSource
* @access public
*/
var $db = null;
/**
* Simulated DB connection used in testing
*
- * @var object
+ * @var DboSource
* @access public
*/
var $db2 = null;
@@ -479,7 +479,7 @@ class DboPostgresTest extends CakeTestCase {
$db1->query('DROP TABLE ' . $db1->fullTableName('datatypes'));
}
-
+
/**
* Test index generation from table info.
*
@@ -498,7 +498,7 @@ class DboPostgresTest extends CakeTestCase {
);
$result = $this->db->index($name);
$this->assertEqual($expected, $result);
-
+
$this->db->query('DROP TABLE ' . $name);
$name = $this->db->fullTableName('index_test_2', false);
$this->db->query('CREATE TABLE ' . $name . ' ("id" serial NOT NULL PRIMARY KEY, "bool" integer, "small_char" varchar(50), "description" varchar(40) )');
@@ -532,7 +532,7 @@ class DboPostgresTest extends CakeTestCase {
)
));
$this->db->query($this->db->createSchema($Old));
-
+
$New =& new CakeSchema(array(
'connection' => 'test_suite',
'name' => 'AlterPosts',
@@ -547,13 +547,13 @@ class DboPostgresTest extends CakeTestCase {
)
));
$this->db->query($this->db->alterSchema($New->compare($Old), 'alter_posts'));
-
+
$model = new CakeTestModel(array('table' => 'alter_posts', 'ds' => 'test_suite'));
$result = $model->schema();
$this->assertTrue(isset($result['status']));
$this->assertFalse(isset($result['published']));
$this->assertEqual($result['body']['type'], 'string');
-
+
$this->db->query($this->db->dropSchema($New));
}
/**
@@ -561,7 +561,7 @@ class DboPostgresTest extends CakeTestCase {
*
* @access public
* @return void
- */
+ */
function testAlterIndexes() {
$this->db->cacheSources = false;
@@ -594,10 +594,10 @@ class DboPostgresTest extends CakeTestCase {
)
));
$this->db->query($this->db->alterSchema($schema2->compare($schema1)));
-
+
$indexes = $this->db->index('altertest');
$this->assertEqual($schema2->tables['altertest']['indexes'], $indexes);
-
+
// Change three indexes, delete one and add another one
$schema3 =& new CakeSchema(array(
'name' => 'AlterTest3',
@@ -608,7 +608,7 @@ class DboPostgresTest extends CakeTestCase {
'group1' => array('type' => 'integer', 'null' => true),
'group2' => array('type' => 'integer', 'null' => true),
'indexes' => array(
- 'name_idx' => array('column' => 'name', 'unique' => 1),
+ 'name_idx' => array('column' => 'name', 'unique' => 1),
'group_idx' => array('column' => 'group2', 'unique' => 0),
'compound_idx' => array('column' => array('group2', 'group1'), 'unique' => 0),
'another_idx' => array('column' => array('group1', 'name'), 'unique' => 0))
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php
index 47f1acea5..a22cc7721 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php
@@ -83,14 +83,14 @@ class DboSqliteTest extends CakeTestCase {
/**
* Actual DB connection used in testing
*
- * @var object
+ * @var DboSource
* @access public
*/
var $db = null;
/**
* Simulated DB connection used in testing
*
- * @var object
+ * @var DboSource
* @access public
*/
var $db2 = null;
@@ -150,7 +150,7 @@ class DboSqliteTest extends CakeTestCase {
*
* @access public
* @return void
- */
+ */
function testIndex() {
$name = $this->db->fullTableName('with_a_key');
$this->db->query('CREATE TABLE ' . $name . ' ("id" int(11) PRIMARY KEY, "bool" int(1), "small_char" varchar(50), "description" varchar(40) );');
@@ -160,12 +160,12 @@ class DboSqliteTest extends CakeTestCase {
'PRIMARY' => array('column' => 'id', 'unique' => 1),
'pointless_bool' => array('column' => 'bool', 'unique' => 0),
'char_index' => array('column' => 'small_char', 'unique' => 1),
-
+
);
$result = $this->db->index($name);
$this->assertEqual($expected, $result);
$this->db->query('DROP TABLE ' . $name);
-
+
$this->db->query('CREATE TABLE ' . $name . ' ("id" int(11) PRIMARY KEY, "bool" int(1), "small_char" varchar(50), "description" varchar(40) );');
$this->db->query('CREATE UNIQUE INDEX multi_col ON ' . $name . '("small_char", "bool")');
$expected = array(
@@ -199,7 +199,7 @@ class DboSqliteTest extends CakeTestCase {
$db->cacheSources = false;
$fileName = '_' . preg_replace('/[^A-Za-z0-9_\-+]/', '_', TMP . $dbName) . '_list';
-
+
$result = Cache::read($fileName, '_cake_model_');
$this->assertEqual($result, array('test_list'));
From 78daa139008b0a71126511fc3eaffd6d0bcfa6c0 Mon Sep 17 00:00:00 2001
From: "renan.saddam"
Date: Wed, 18 Mar 2009 00:43:21 +0000
Subject: [PATCH 18/67] Defining the default answer as the current path. Fixes
#6204
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8115 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/console/libs/tasks/extract.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cake/console/libs/tasks/extract.php b/cake/console/libs/tasks/extract.php
index 644cf5ed3..7918e8cd7 100644
--- a/cake/console/libs/tasks/extract.php
+++ b/cake/console/libs/tasks/extract.php
@@ -135,7 +135,7 @@ class ExtractTask extends Shell{
} else {
$response = '';
while ($response == '') {
- $response = $this->in("What is the full path you would like to extract?\nExample: " . $this->params['root'] . DS . "myapp\n[Q]uit", null, 'Q');
+ $response = $this->in("What is the full path you would like to extract?\nExample: " . $this->params['root'] . DS . "myapp\n[Q]uit", null, $this->params['working']);
if (strtoupper($response) === 'Q') {
$this->out('Extract Aborted');
$this->_stop();
From 3c3b8520991700a2208219aae78191cf27388d3c Mon Sep 17 00:00:00 2001
From: davidpersson
Date: Wed, 18 Mar 2009 17:55:58 +0000
Subject: [PATCH 19/67] Changing package of tests from "cake.tests" to "cake".
Moving tearDown et al. to the top of each test class. Adding short
descriptions to docblocks. Adding missing docblocks. Removing unnecessary
blank lines and whitespaces. Updating labels of test groups.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8116 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/tests/cases/basics.test.php | 6 +-
cake/tests/cases/console/cake.test.php | 8 +-
cake/tests/cases/console/libs/shell.test.php | 14 +-
.../cases/console/libs/tasks/extract.test.php | 17 +-
.../cases/console/libs/tasks/test.test.php | 8 +-
cake/tests/cases/dispatcher.test.php | 31 +-
cake/tests/cases/libs/cache.test.php | 8 +-
cake/tests/cases/libs/cache/apc.test.php | 26 +-
cake/tests/cases/libs/cache/file.test.php | 17 +-
cake/tests/cases/libs/cache/memcache.test.php | 9 +-
cake/tests/cases/libs/cache/xcache.test.php | 26 +-
cake/tests/cases/libs/cake_log.test.php | 9 +-
cake/tests/cases/libs/cake_test_case.test.php | 57 +--
.../cases/libs/cake_test_fixture.test.php | 57 +--
cake/tests/cases/libs/class_registry.test.php | 20 +-
.../cases/libs/code_coverage_manager.test.php | 26 +-
cake/tests/cases/libs/configure.test.php | 13 +-
.../cases/libs/controller/component.test.php | 51 ++-
.../libs/controller/components/acl.test.php | 27 +-
.../libs/controller/components/auth.test.php | 57 ++-
.../controller/components/cookie.test.php | 86 +++--
.../libs/controller/components/email.test.php | 36 +-
.../components/request_handler.test.php | 59 ++--
.../controller/components/security.test.php | 46 ++-
.../controller/components/session.test.php | 38 +-
.../cases/libs/controller/controller.test.php | 30 +-
.../libs/controller/pages_controller.test.php | 8 +-
.../cases/libs/controller/scaffold.test.php | 69 ++--
cake/tests/cases/libs/debugger.test.php | 70 ++--
cake/tests/cases/libs/error.test.php | 28 +-
cake/tests/cases/libs/file.test.php | 9 +-
cake/tests/cases/libs/flay.test.php | 12 +-
cake/tests/cases/libs/folder.test.php | 8 +-
cake/tests/cases/libs/http_socket.test.php | 71 ++--
cake/tests/cases/libs/i18n.test.php | 15 +-
cake/tests/cases/libs/inflector.test.php | 26 +-
cake/tests/cases/libs/l10n.test.php | 6 +-
cake/tests/cases/libs/magic_db.test.php | 16 +-
cake/tests/cases/libs/model/behavior.test.php | 33 +-
.../cases/libs/model/behaviors/acl.test.php | 90 +++--
.../libs/model/behaviors/containable.test.php | 10 +-
.../libs/model/behaviors/translate.test.php | 11 +-
.../cases/libs/model/behaviors/tree.test.php | 26 +-
.../model/datasources/dbo/dbo_adodb.test.php | 27 +-
.../model/datasources/dbo/dbo_mssql.test.php | 65 ++--
.../model/datasources/dbo/dbo_mysql.test.php | 15 +-
.../model/datasources/dbo/dbo_mysqli.test.php | 17 +-
.../model/datasources/dbo/dbo_oracle.test.php | 12 +-
.../datasources/dbo/dbo_postgres.test.php | 19 +-
.../model/datasources/dbo/dbo_sqlite.test.php | 13 +-
.../model/datasources/dbo_source.test.php | 55 +--
cake/tests/cases/libs/model/db_acl.test.php | 84 +++--
cake/tests/cases/libs/model/model.test.php | 64 ++--
cake/tests/cases/libs/model/models.php | 219 ++++++------
cake/tests/cases/libs/model/schema.test.php | 57 ++-
cake/tests/cases/libs/multibyte.test.php | 8 +-
cake/tests/cases/libs/object.test.php | 36 +-
cake/tests/cases/libs/overloadable.test.php | 10 +-
cake/tests/cases/libs/router.test.php | 10 +-
cake/tests/cases/libs/sanitize.test.php | 11 +-
cake/tests/cases/libs/security.test.php | 8 +-
cake/tests/cases/libs/session.test.php | 8 +-
cake/tests/cases/libs/set.test.php | 11 +-
cake/tests/cases/libs/socket.test.php | 26 +-
cake/tests/cases/libs/string.test.php | 8 +-
cake/tests/cases/libs/test_manager.test.php | 47 +--
cake/tests/cases/libs/validation.test.php | 13 +-
cake/tests/cases/libs/view/helper.test.php | 42 ++-
.../cases/libs/view/helpers/ajax.test.php | 44 ++-
.../cases/libs/view/helpers/cache.test.php | 76 ++--
.../cases/libs/view/helpers/form.test.php | 77 ++--
.../cases/libs/view/helpers/html.test.php | 25 +-
.../libs/view/helpers/javascript.test.php | 9 +-
.../tests/cases/libs/view/helpers/js.test.php | 21 +-
.../cases/libs/view/helpers/number.test.php | 33 +-
.../libs/view/helpers/paginator.test.php | 30 +-
.../cases/libs/view/helpers/rss.test.php | 11 +-
.../cases/libs/view/helpers/session.test.php | 9 +-
.../cases/libs/view/helpers/text.test.php | 30 +-
.../cases/libs/view/helpers/time.test.php | 30 +-
.../cases/libs/view/helpers/xml.test.php | 27 +-
cake/tests/cases/libs/view/theme.test.php | 32 +-
cake/tests/cases/libs/view/view.test.php | 33 +-
cake/tests/cases/libs/xml.test.php | 328 +++++++++---------
cake/tests/fixtures/account_fixture.php | 4 +-
cake/tests/fixtures/aco_action_fixture.php | 4 +-
cake/tests/fixtures/aco_fixture.php | 4 +-
cake/tests/fixtures/aco_two_fixture.php | 4 +-
cake/tests/fixtures/advertisement_fixture.php | 4 +-
.../fixtures/another_article_fixture.php | 4 +-
cake/tests/fixtures/apple_fixture.php | 4 +-
cake/tests/fixtures/aro_fixture.php | 4 +-
cake/tests/fixtures/aro_two_fixture.php | 4 +-
cake/tests/fixtures/aros_aco_fixture.php | 4 +-
cake/tests/fixtures/aros_aco_two_fixture.php | 4 +-
.../fixtures/article_featured_fixture.php | 4 +-
.../article_featureds_tags_fixture.php | 4 +-
cake/tests/fixtures/article_fixture.php | 4 +-
cake/tests/fixtures/articles_tag_fixture.php | 4 +-
cake/tests/fixtures/attachment_fixture.php | 4 +-
.../auth_user_custom_field_fixture.php | 4 +-
cake/tests/fixtures/auth_user_fixture.php | 4 +-
cake/tests/fixtures/author_fixture.php | 4 +-
cake/tests/fixtures/basket_fixture.php | 4 +-
cake/tests/fixtures/bid_fixture.php | 4 +-
cake/tests/fixtures/binary_test_fixture.php | 4 +-
cake/tests/fixtures/book_fixture.php | 4 +-
.../fixtures/cache_test_model_fixture.php | 4 +-
cake/tests/fixtures/callback_fixture.php | 4 +-
cake/tests/fixtures/category_fixture.php | 4 +-
.../fixtures/category_thread_fixture.php | 4 +-
cake/tests/fixtures/cd_fixture.php | 4 +-
cake/tests/fixtures/comment_fixture.php | 4 +-
.../fixtures/content_account_fixture.php | 4 +-
cake/tests/fixtures/content_fixture.php | 4 +-
.../fixtures/counter_cache_post_fixture.php | 4 +-
.../fixtures/counter_cache_user_fixture.php | 4 +-
cake/tests/fixtures/data_test_fixture.php | 4 +-
cake/tests/fixtures/datatype_fixture.php | 4 +-
cake/tests/fixtures/dependency_fixture.php | 4 +-
cake/tests/fixtures/device_fixture.php | 4 +-
.../fixtures/device_type_category_fixture.php | 4 +-
cake/tests/fixtures/device_type_fixture.php | 4 +-
.../fixtures/document_directory_fixture.php | 4 +-
cake/tests/fixtures/document_fixture.php | 4 +-
.../exterior_type_category_fixture.php | 4 +-
cake/tests/fixtures/feature_set_fixture.php | 4 +-
cake/tests/fixtures/featured_fixture.php | 4 +-
cake/tests/fixtures/film_file_fixture.php | 4 +-
cake/tests/fixtures/flag_tree_fixture.php | 2 +-
cake/tests/fixtures/fruit_fixture.php | 4 +-
.../fixtures/fruits_uuid_tag_fixture.php | 4 +-
cake/tests/fixtures/home_fixture.php | 4 +-
cake/tests/fixtures/image_fixture.php | 4 +-
cake/tests/fixtures/item_fixture.php | 4 +-
.../fixtures/items_portfolio_fixture.php | 4 +-
cake/tests/fixtures/join_a_b_fixture.php | 4 +-
cake/tests/fixtures/join_a_c_fixture.php | 4 +-
cake/tests/fixtures/join_a_fixture.php | 4 +-
cake/tests/fixtures/join_b_fixture.php | 4 +-
cake/tests/fixtures/join_c_fixture.php | 4 +-
cake/tests/fixtures/join_thing_fixture.php | 4 +-
cake/tests/fixtures/message_fixture.php | 4 +-
.../my_categories_my_products_fixture.php | 4 +-
.../my_categories_my_users_fixture.php | 4 +-
cake/tests/fixtures/my_category_fixture.php | 4 +-
cake/tests/fixtures/my_product_fixture.php | 4 +-
cake/tests/fixtures/my_user_fixture.php | 4 +-
cake/tests/fixtures/node_fixture.php | 4 +-
cake/tests/fixtures/number_tree_fixture.php | 2 +-
.../fixtures/numeric_article_fixture.php | 4 +-
.../fixtures/overall_favorite_fixture.php | 4 +-
cake/tests/fixtures/person_fixture.php | 4 +-
cake/tests/fixtures/portfolio_fixture.php | 4 +-
cake/tests/fixtures/post_fixture.php | 4 +-
cake/tests/fixtures/posts_tag_fixture.php | 4 +-
cake/tests/fixtures/primary_model_fixture.php | 4 +-
cake/tests/fixtures/product_fixture.php | 4 +-
cake/tests/fixtures/project_fixture.php | 4 +-
cake/tests/fixtures/sample_fixture.php | 4 +-
.../fixtures/secondary_model_fixture.php | 4 +-
cake/tests/fixtures/session_fixture.php | 4 +-
.../tests/fixtures/something_else_fixture.php | 4 +-
cake/tests/fixtures/something_fixture.php | 4 +-
cake/tests/fixtures/stories_tag_fixture.php | 4 +-
cake/tests/fixtures/story_fixture.php | 4 +-
cake/tests/fixtures/syfile_fixture.php | 4 +-
cake/tests/fixtures/tag_fixture.php | 4 +-
.../fixtures/test_plugin_article_fixture.php | 4 +-
.../fixtures/test_plugin_comment_fixture.php | 4 +-
.../fixtures/the_paper_monkies_fixture.php | 4 +-
cake/tests/fixtures/thread_fixture.php | 4 +-
.../fixtures/translate_article_fixture.php | 4 +-
cake/tests/fixtures/translate_fixture.php | 4 +-
.../fixtures/translate_table_fixture.php | 4 +-
.../fixtures/translated_article_fixture.php | 4 +-
.../fixtures/translated_item_fixture.php | 4 +-
.../fixtures/unconventional_tree_fixture.php | 2 +-
.../fixtures/underscore_field_fixture.php | 2 +-
cake/tests/fixtures/user_fixture.php | 4 +-
cake/tests/fixtures/uuid_fixture.php | 4 +-
cake/tests/fixtures/uuid_tag_fixture.php | 4 +-
cake/tests/fixtures/uuid_tree_fixture.php | 2 +-
cake/tests/fixtures/uuiditem_fixture.php | 4 +-
.../uuiditems_uuidportfolio_fixture.php | 4 +-
...ditems_uuidportfolio_numericid_fixture.php | 6 +-
cake/tests/fixtures/uuidportfolio_fixture.php | 4 +-
cake/tests/groups/acl.group.php | 17 +-
cake/tests/groups/cache.group.php | 17 +-
cake/tests/groups/components.group.php | 17 +-
cake/tests/groups/configure.group.php | 17 +-
cake/tests/groups/console.group.php | 15 +-
cake/tests/groups/helpers.group.php | 17 +-
cake/tests/groups/lib.group.php | 17 +-
cake/tests/groups/lib_controller.group.php | 10 +-
cake/tests/groups/model.group.php | 17 +-
cake/tests/groups/no_database.group.php | 21 +-
cake/tests/groups/routing_system.group.php | 17 +-
cake/tests/groups/socket.group.php | 17 +-
cake/tests/groups/test_suite.group.php | 17 +-
cake/tests/groups/view.group.php | 17 +-
cake/tests/groups/xml.group.php | 17 +-
.../controllers/tests_apps_controller.php | 2 +-
.../tests_apps_posts_controller.php | 2 +-
.../components/other_component.php | 2 +-
.../components/plugins_component.php | 2 +-
.../components/test_plugin_component.php | 2 +-
.../test_plugin_other_component.php | 2 +-
.../controllers/tests_controller.php | 2 +-
.../test_plugin_app_controller.php | 2 +-
.../test_plugin/test_plugin_app_model.php | 2 +-
.../vendors/sample/sample_plugin.php | 2 +-
.../test_plugin/vendors/shells/example.php | 2 +-
.../plugins/test_plugin/vendors/welcome.php | 2 +-
.../views/helpers/other_helper.php | 2 +-
.../views/helpers/plugged_helper.php | 2 +-
.../vendors/shells/example.php | 2 +-
.../vendors/shells/welcome.php | 2 +-
cake/tests/test_app/vendors/Test/MyTest.php | 2 +-
cake/tests/test_app/vendors/Test/hello.php | 2 +-
.../sample/configure_test_vendor_sample.php | 2 +-
cake/tests/test_app/vendors/shells/sample.php | 2 +-
.../test_app/vendors/somename/some.name.php | 2 +-
cake/tests/test_app/vendors/welcome.php | 2 +-
224 files changed, 1884 insertions(+), 1804 deletions(-)
diff --git a/cake/tests/cases/basics.test.php b/cake/tests/cases/basics.test.php
index 06ef9a37c..141473cde 100644
--- a/cake/tests/cases/basics.test.php
+++ b/cake/tests/cases/basics.test.php
@@ -1,7 +1,7 @@
_get;
+ }
/**
* testParseParamsWithoutZerosAndEmptyPost method
*
@@ -2088,14 +2092,5 @@ class DispatcherTest extends CakeTestCase {
}
return $filename;
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- $_GET = $this->_get;
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/cache.test.php b/cake/tests/cases/libs/cache.test.php
index 54079700f..84102a13e 100644
--- a/cake/tests/cases/libs/cache.test.php
+++ b/cake/tests/cases/libs/cache.test.php
@@ -1,7 +1,7 @@
'Apc', 'prefix' => 'cake_'));
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ Cache::config('default');
+ }
/**
* testReadAndWriteCache method
*
@@ -127,14 +136,5 @@ class ApcEngineTest extends UnitTestCase {
$result = Cache::delete('delete_test');
$this->assertTrue($result);
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- Cache::config('default');
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/cache/file.test.php b/cake/tests/cases/libs/cache/file.test.php
index 5a57b704e..cc8e0fbc6 100644
--- a/cake/tests/cases/libs/cache/file.test.php
+++ b/cake/tests/cases/libs/cache/file.test.php
@@ -1,7 +1,7 @@
assertEqual($result, $expecting);
-
+
Cache::delete('test');
}
/**
@@ -331,7 +331,12 @@ class FileEngineTest extends CakeTestCase {
Cache::delete('test_dir_map');
$this->assertEqual($expected, $data);
}
-
+/**
+ * testWriteQuotedString method
+ *
+ * @access public
+ * @return void
+ */
function testWriteQuotedString() {
Cache::engine('File', array('path' => TMP . 'tests'));
Cache::write('App.doubleQuoteTest', '"this is a quoted string"');
diff --git a/cake/tests/cases/libs/cache/memcache.test.php b/cake/tests/cases/libs/cache/memcache.test.php
index e258c66d9..09d454739 100644
--- a/cake/tests/cases/libs/cache/memcache.test.php
+++ b/cake/tests/cases/libs/cache/memcache.test.php
@@ -1,7 +1,7 @@
_Engine['Memcache']->connect('127.0.0.1');
$this->assertTrue($result);
}
-
/**
* testReadAndWriteCache method
*
diff --git a/cake/tests/cases/libs/cache/xcache.test.php b/cake/tests/cases/libs/cache/xcache.test.php
index 15d535b68..9a50a8757 100644
--- a/cake/tests/cases/libs/cache/xcache.test.php
+++ b/cake/tests/cases/libs/cache/xcache.test.php
@@ -1,7 +1,7 @@
'Xcache', 'prefix' => 'cake_'));
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ Cache::config('default');
+ }
/**
* testSettings method
*
@@ -156,14 +165,5 @@ class XcacheEngineTest extends UnitTestCase {
$result = Cache::clear();
$this->assertTrue($result);
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- Cache::config('default');
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/cake_log.test.php b/cake/tests/cases/libs/cake_log.test.php
index bb688af41..05dc39452 100644
--- a/cake/tests/cases/libs/cake_log.test.php
+++ b/cake/tests/cases/libs/cake_log.test.php
@@ -1,7 +1,7 @@
\ No newline at end of file
diff --git a/cake/tests/cases/libs/cake_test_case.test.php b/cake/tests/cases/libs/cake_test_case.test.php
index 7be184316..bd1550bf6 100644
--- a/cake/tests/cases/libs/cake_test_case.test.php
+++ b/cake/tests/cases/libs/cake_test_case.test.php
@@ -1,9 +1,9 @@
_reporter = &$reporter;
}
-
+/**
+ * testDummy method
+ *
+ * @return void
+ * @access public
+ */
function testDummy() {
-
}
}
-
/**
* CakeTestCaseTest
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs
- **/
+ */
class CakeTestCaseTest extends CakeTestCase {
/**
* setUp
@@ -76,6 +78,16 @@ class CakeTestCaseTest extends CakeTestCase {
$this->Case->setReporter($reporter);
$this->Reporter = $reporter;
}
+/**
+ * tearDown
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->Case);
+ unset($this->Reporter);
+ }
/**
* testAssertGoodTags
*
@@ -214,7 +226,6 @@ class CakeTestCaseTest extends CakeTestCase {
$this->assertEqual(array_slice($result, 0, 2), array('start', 'startCase'));
$this->assertEqual(array_slice($result, -2), array('endCase', 'end'));
}
-
/**
* TestTestAction
*
@@ -303,7 +314,7 @@ class CakeTestCaseTest extends CakeTestCase {
$fixture =& new PostFixture($db);
$fixture->create($db);
$fixture->insert($db);
-
+
$result = $this->Case->testAction('/tests_apps_posts/fixtured', array(
'return' => 'vars',
'fixturize' => true,
@@ -334,17 +345,17 @@ class CakeTestCaseTest extends CakeTestCase {
$fixture =& new PostFixture($db);
$fixture->create($db);
$fixture->insert($db);
-
+
$this->Case->dropTables = false;
$result = $this->Case->testAction('/tests_apps_posts/fixtured', array(
'return' => 'vars',
'fixturize' => true,
'connection' => 'cake_test_case',
));
-
+
$tables = $db->listSources();
$this->assertTrue(in_array('cake_testaction_test_suite_posts', $tables));
-
+
$fixture->drop($db);
$db =& ConnectionManager::getDataSource('test_suite');
$db->config['prefix'] = $_backPrefix;
@@ -396,15 +407,5 @@ class CakeTestCaseTest extends CakeTestCase {
Configure::write('viewPaths', $_back['view']);
Configure::write('pluginPaths', $_back['plugin']);
}
-/**
- * tearDown
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->Case);
- unset($this->Reporter);
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/cake_test_fixture.test.php b/cake/tests/cases/libs/cake_test_fixture.test.php
index d7b04cfc7..5e17ed25b 100644
--- a/cake/tests/cases/libs/cake_test_fixture.test.php
+++ b/cake/tests/cases/libs/cake_test_fixture.test.php
@@ -1,7 +1,7 @@
'Chewbacca')
);
}
-
-
/**
- * Import Fixture Test Fixture
+ * CakeTestFixtureImportFixture class
*
* @package cake
* @subpackage cake.cake.tests.cases.libs
@@ -88,9 +85,8 @@ class CakeTestFixtureImportFixture extends CakeTestFixture {
*/
var $import = array('table' => 'fixture_tests', 'connection' => 'test_suite');
}
-
/**
- * Import Fixture Test Fixture
+ * CakeTestFixtureDefaultImportFixture class
*
* @package cake
* @subpackage cake.cake.tests.cases.libs
@@ -103,9 +99,8 @@ class CakeTestFixtureDefaultImportFixture extends CakeTestFixture {
*/
var $name = 'ImportFixture';
}
-
/**
- * Fixture Test Case Model
+ * FixtureImportTestModel class
*
* @package default
* @subpackage cake.cake.tests.cases.libs.
@@ -115,9 +110,7 @@ class FixtureImportTestModel extends Model {
var $useTable = 'fixture_tests';
var $useDbConfig = 'test_suite';
}
-
Mock::generate('DboSource', 'FixtureMockDboSource');
-
/**
* Test case for CakeTestFixture
*
@@ -125,10 +118,25 @@ Mock::generate('DboSource', 'FixtureMockDboSource');
* @subpackage cake.cake.tests.cases.libs
*/
class CakeTestFixtureTest extends CakeTestCase {
+/**
+ * setUp method
+ *
+ * @access public
+ * @return void
+ */
function setUp() {
$this->criticDb =& new FixtureMockDboSource();
$this->criticDb->fullDebug = true;
}
+/**
+ * tearDown
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->criticDb);
+ }
/**
* testInit
*
@@ -215,8 +223,9 @@ class CakeTestFixtureTest extends CakeTestCase {
/**
* test create method
*
+ * @access public
* @return void
- **/
+ */
function testCreate() {
$Fixture =& new CakeTestFixtureTestFixture();
$this->criticDb->expectAtLeastOnce('execute');
@@ -229,12 +238,12 @@ class CakeTestFixtureTest extends CakeTestCase {
$return = $Fixture->create($this->criticDb);
$this->assertFalse($return);
}
-
/**
* test the insert method
*
+ * @access public
* @return void
- **/
+ */
function testInsert() {
$Fixture =& new CakeTestFixtureTestFixture();
$this->criticDb->setReturnValue('insertMulti', true);
@@ -244,12 +253,12 @@ class CakeTestFixtureTest extends CakeTestCase {
$this->assertTrue($this->criticDb->fullDebug);
$this->assertTrue($return);
}
-
/**
* Test the drop method
*
+ * @access public
* @return void
- **/
+ */
function testDrop() {
$Fixture =& new CakeTestFixtureTestFixture();
$this->criticDb->setReturnValueAt(0, 'execute', true);
@@ -267,22 +276,14 @@ class CakeTestFixtureTest extends CakeTestCase {
/**
* Test the truncate method.
*
+ * @access public
* @return void
- **/
+ */
function testTruncate() {
$Fixture =& new CakeTestFixtureTestFixture();
$this->criticDb->expectAtLeastOnce('truncate');
$Fixture->truncate($this->criticDb);
$this->assertTrue($this->criticDb->fullDebug);
}
-/**
- * tearDown
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->criticDb);
- }
}
-?>
+?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/class_registry.test.php b/cake/tests/cases/libs/class_registry.test.php
index fd145ea8e..d40ed0e83 100644
--- a/cake/tests/cases/libs/class_registry.test.php
+++ b/cake/tests/cases/libs/class_registry.test.php
@@ -1,7 +1,7 @@
skipif (!extension_loaded('xdebug'), 'XDebug not installed');
+ }
/**
* startTest Method
* Store reference of $_GET to restore later.
@@ -44,7 +51,6 @@ class CodeCoverageManagerTest extends CakeTestCase {
function startCase() {
$this->_get = $_GET;
}
-
/**
* End Case - restore GET vars.
*
@@ -53,14 +59,6 @@ class CodeCoverageManagerTest extends CakeTestCase {
function endCase() {
$_GET = $this->_get;
}
-/**
- * Skip if XDebug not installed
- *
- * @access public
- */
- function skip() {
- $this->skipif (!extension_loaded('xdebug'), 'XDebug not installed');
- }
/**
* testNoTestCaseSupplied method
*
diff --git a/cake/tests/cases/libs/configure.test.php b/cake/tests/cases/libs/configure.test.php
index a8cd784c5..f5da1d324 100644
--- a/cake/tests/cases/libs/configure.test.php
+++ b/cake/tests/cases/libs/configure.test.php
@@ -1,9 +1,9 @@
assertEqual($result, null);
}
-
/**
* testSetErrorReporting Level
*
@@ -537,5 +535,4 @@ class AppImportTest extends UnitTestCase {
$this->assertEqual($text, 'This is the welcome.php file in test_plugin/vendors directory');
}
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/controller/component.test.php b/cake/tests/cases/libs/controller/component.test.php
index a3204e4fd..25b0d6fb6 100644
--- a/cake/tests/cases/libs/controller/component.test.php
+++ b/cake/tests/cases/libs/controller/component.test.php
@@ -1,7 +1,7 @@
Banana->testField = 'OrangeField';
$this->settings = $settings;
}
-
+/**
+ * startup method
+ *
+ * @param Controller $controller
+ * @return string
+ * @access public
+ */
function startup(&$controller) {
$controller->foo = 'pass';
}
@@ -204,7 +211,13 @@ class BananaComponent extends Object {
* @access public
*/
var $testField = 'BananaField';
-
+/**
+ * startup method
+ *
+ * @param Controller $controller
+ * @return string
+ * @access public
+ */
function startup(&$controller) {
$controller->bar = 'fail';
}
@@ -216,6 +229,12 @@ class BananaComponent extends Object {
* @subpackage cake.tests.cases.libs.controller
*/
class MutuallyReferencingOneComponent extends Object {
+/**
+ * components property
+ *
+ * @var array
+ * @access public
+ */
var $components = array('MutuallyReferencingTwo');
}
/**
@@ -225,9 +244,14 @@ class MutuallyReferencingOneComponent extends Object {
* @subpackage cake.tests.cases.libs.controller
*/
class MutuallyReferencingTwoComponent extends Object {
+/**
+ * components property
+ *
+ * @var array
+ * @access public
+ */
var $components = array('MutuallyReferencingOne');
}
-
/**
* SomethingWithEmailComponent class
*
@@ -235,6 +259,12 @@ class MutuallyReferencingTwoComponent extends Object {
* @subpackage cake.tests.cases.libs.controller
*/
class SomethingWithEmailComponent extends Object {
+/**
+ * components property
+ *
+ * @var array
+ * @access public
+ */
var $components = array('Email');
}
/**
@@ -321,7 +351,7 @@ class ComponentTest extends CakeTestCase {
$this->assertTrue(is_a($Controller->Apple->Orange->Banana, 'BananaComponent'));
$this->assertTrue(is_a($Controller->Apple->Orange->Controller, 'ComponentTestController'));
$this->assertTrue(empty($Controller->Apple->Session));
- $this->assertTrue(empty($Controller->Apple->Orange->Session));
+ $this->assertTrue(empty($Controller->Apple->Orange->Session));
}
/**
* Tests Component::startup() and only running callbacks for components directly attached to
@@ -430,7 +460,7 @@ class ComponentTest extends CakeTestCase {
$Controller->Component->initialize($Controller);
$Controller->beforeFilter();
$Controller->Component->startup($Controller);
-
+
$this->assertTrue(is_a(
$Controller->SomethingWithEmail,
'SomethingWithEmailComponent'
@@ -458,5 +488,4 @@ class ComponentTest extends CakeTestCase {
$this->assertEqual($Controller->components, array('Session' => '', 'Orange' => array('colour' => 'blood orange')));
}
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/controller/components/acl.test.php b/cake/tests/cases/libs/controller/components/acl.test.php
index 7e6856dae..e651ebe0d 100644
--- a/cake/tests/cases/libs/controller/components/acl.test.php
+++ b/cake/tests/cases/libs/controller/components/acl.test.php
@@ -1,7 +1,7 @@
Acl);
+ }
/**
* testAclCreate method
*
@@ -543,15 +549,6 @@ class AclComponentTest extends CakeTestCase {
$this->assertFalse($this->Acl->check('nobody', 'comments'));
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->Acl);
- }
/**
* debug function - to help editing/creating test cases for the ACL component
*
diff --git a/cake/tests/cases/libs/controller/components/auth.test.php b/cake/tests/cases/libs/controller/components/auth.test.php
index 83f7cc8a2..8daeee4f6 100644
--- a/cake/tests/cases/libs/controller/components/auth.test.php
+++ b/cake/tests/cases/libs/controller/components/auth.test.php
@@ -1,7 +1,7 @@
redirect($this->Auth->logout());
+ // $this->redirect($this->Auth->logout());
}
/**
* add method
@@ -403,9 +403,9 @@ class AjaxAuthController extends Controller {
}
}
/**
-* Short description for class.
+* AuthTest class
*
-* @package cake.tests
+* @package cake
* @subpackage cake.tests.cases.libs.controller.components
*/
class AuthTest extends CakeTestCase {
@@ -448,6 +448,15 @@ class AuthTest extends CakeTestCase {
$this->Controller->Session->del('Message.auth');
$this->initialized = true;
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->Controller, $this->AuthUser);
+ }
/**
* testNoAuth method
*
@@ -622,7 +631,6 @@ class AuthTest extends CakeTestCase {
$result = $this->Controller->Auth->isAuthorized();
$this->assertFalse($result);
}
-
/**
* testAuthorizeCrud method
*
@@ -1035,7 +1043,6 @@ class AuthTest extends CakeTestCase {
$user = $this->Controller->Auth->user();
$this->assertTrue(!!$user);
}
-
/**
* testCustomField method
*
@@ -1070,7 +1077,6 @@ class AuthTest extends CakeTestCase {
$user = $this->Controller->Auth->user();
$this->assertTrue(!!$user);
}
-
/**
* testAdminRoute method
*
@@ -1177,14 +1183,5 @@ class AuthTest extends CakeTestCase {
$this->Controller->Auth->shutdown($this->Controller);
$this->assertFalse($this->Controller->Session->read('Auth.redirect'));
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->Controller, $this->AuthUser);
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/controller/components/cookie.test.php b/cake/tests/cases/libs/controller/components/cookie.test.php
index 7503d5a46..5d8d87aa0 100644
--- a/cake/tests/cases/libs/controller/components/cookie.test.php
+++ b/cake/tests/cases/libs/controller/components/cookie.test.php
@@ -1,7 +1,7 @@
Cookie->name = 'CakeTestCookie';
$this->Cookie->time = 10;
@@ -38,29 +55,19 @@ class CookieComponentTestController extends Controller {
}
}
/**
- * Short description for class.
+ * CookieComponentTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.controller.components
*/
class CookieComponentTest extends CakeTestCase {
+/**
+ * Controller property
+ *
+ * @var CookieComponentTestController
+ * @access public
+ */
var $Controller;
-
- function __encrypt($value) {
- if (is_array($value)) {
- $value = $this->__implode($value);
- }
- return "Q2FrZQ==." .base64_encode(Security::cipher($value, $this->Controller->Cookie->key));
- }
-
-
- function __implode($array) {
- $string = '';
- foreach ($array as $key => $value) {
- $string .= ',' . $key . '|' . $value;
- }
- return substr($string, 1);
- }
/**
* start
*
@@ -75,6 +82,15 @@ class CookieComponentTest extends CakeTestCase {
$this->Controller->Component->startup($this->Controller);
$this->Controller->Cookie->destroy();
}
+/**
+ * end
+ *
+ * @access public
+ * @return void
+ */
+ function end() {
+ $this->Controller->Cookie->destroy();
+ }
/**
* testCookieName
*
@@ -393,13 +409,31 @@ class CookieComponentTest extends CakeTestCase {
unset($_COOKIE['CakeTestCookie']);
}
/**
- * end
+ * encrypt method
*
- * @access public
- * @return void
+ * @param mixed $value
+ * @return string
+ * @access private
*/
- function end() {
- $this->Controller->Cookie->destroy();
+ function __encrypt($value) {
+ if (is_array($value)) {
+ $value = $this->__implode($value);
+ }
+ return "Q2FrZQ==." . base64_encode(Security::cipher($value, $this->Controller->Cookie->key));
+ }
+/**
+ * implode method
+ *
+ * @param array $value
+ * @return string
+ * @access private
+ */
+ function __implode($array) {
+ $string = '';
+ foreach ($array as $key => $value) {
+ $string .= ',' . $key . '|' . $value;
+ }
+ return substr($string, 1);
}
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/controller/components/email.test.php b/cake/tests/cases/libs/controller/components/email.test.php
index 18c0f7c57..bf42ad877 100644
--- a/cake/tests/cases/libs/controller/components/email.test.php
+++ b/cake/tests/cases/libs/controller/components/email.test.php
@@ -1,9 +1,9 @@
My own html content
";
$this->assertEqual($result, $expected);
}
-
+/**
+ * testMultibyte method
+ *
+ * @access public
+ * @return void
+ */
function testMultibyte() {
$this->Controller->Email->reset();
$this->Controller->Email->to = 'postmaster@localhost';
@@ -396,10 +413,15 @@ TEXTBLOC;
preg_match('/Subject: (.*)Header:/s', $this->Controller->Session->read('Message.email.message'), $matches);
$this->assertEqual(trim($matches[1]), $subject);
}
-
+/**
+ * osFix method
+ *
+ * @param string $string
+ * @access private
+ * @return string
+ */
function __osFix($string) {
return str_replace(array("\r\n", "\r"), "\n", $string);
}
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/controller/components/request_handler.test.php b/cake/tests/cases/libs/controller/components/request_handler.test.php
index a839dd213..3a597e8de 100644
--- a/cake/tests/cases/libs/controller/components/request_handler.test.php
+++ b/cake/tests/cases/libs/controller/components/request_handler.test.php
@@ -1,7 +1,7 @@
RequestHandler->enabled = false;
}
}
/**
- * Short description for class.
+ * RequestHandlerComponentTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.controller.components
*/
class RequestHandlerComponentTest extends CakeTestCase {
+/**
+ * Controller property
+ *
+ * @var RequestHandlerTestController
+ * @access public
+ */
+ var $Controller;
+/**
+ * RequestHandler property
+ *
+ * @var RequestHandlerComponent
+ * @access public
+ */
+ var $RequestHandler;
/**
* setUp method
*
@@ -114,15 +133,17 @@ class RequestHandlerComponentTest extends CakeTestCase {
$this->_init();
}
/**
- * init method
+ * tearDown method
*
- * @access protected
+ * @access public
* @return void
*/
- function _init() {
- $this->Controller = new RequestHandlerTestController(array('components' => array('RequestHandler')));
- $this->Controller->constructClasses();
- $this->RequestHandler =& $this->Controller->RequestHandler;
+ function tearDown() {
+ unset($this->RequestHandler);
+ unset($this->Controller);
+ if (!headers_sent()) {
+ header('Content-type: text/html'); //reset content type.
+ }
}
/**
* testInitializeCallback method
@@ -196,7 +217,7 @@ class RequestHandlerComponentTest extends CakeTestCase {
$_SERVER['CONTENT_TYPE'] = 'application/xml; charset=UTF-8';
$this->RequestHandler->startup($this->Controller);
$this->assertTrue(is_object($this->Controller->data));
- $this->assertEqual(strtolower(get_class($this->Controller->data)), 'xml');
+ $this->assertEqual(strtolower(get_class($this->Controller->data)), 'xml');
}
/**
* testNonAjaxRedirect method
@@ -481,17 +502,15 @@ class RequestHandlerComponentTest extends CakeTestCase {
unset($_SERVER['HTTP_X_REQUESTED_WITH']);
}
/**
- * tearDown method
+ * init method
*
- * @access public
+ * @access protected
* @return void
*/
- function tearDown() {
- unset($this->RequestHandler);
- unset($this->Controller);
- if (!headers_sent()) {
- header('Content-type: text/html'); //reset content type.
- }
+ function _init() {
+ $this->Controller = new RequestHandlerTestController(array('components' => array('RequestHandler')));
+ $this->Controller->constructClasses();
+ $this->RequestHandler =& $this->Controller->RequestHandler;
}
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/controller/components/security.test.php b/cake/tests/cases/libs/controller/components/security.test.php
index 468f68452..8314a18a2 100644
--- a/cake/tests/cases/libs/controller/components/security.test.php
+++ b/cake/tests/cases/libs/controller/components/security.test.php
@@ -1,7 +1,7 @@
_validatePost($controller);
}
}
/**
-* Short description for class.
+* SecurityTestController
*
-* @package cake.tests
+* @package cake
* @subpackage cake.tests.cases.libs.controller.components
*/
class SecurityTestController extends Controller {
@@ -104,14 +109,27 @@ class SecurityTestController extends Controller {
$this->testHeaders[] = $status;
}
}
-
/**
- * Short description for class.
+ * SecurityComponentTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.controller.components
*/
class SecurityComponentTest extends CakeTestCase {
+/**
+ * Controller property
+ *
+ * @var SecurityTestController
+ * @access public
+ */
+ var $Controller;
+/**
+ * oldSalt property
+ *
+ * @var string
+ * @access public
+ */
+ var $oldSalt;
/**
* setUp method
*
@@ -128,7 +146,7 @@ class SecurityComponentTest extends CakeTestCase {
Configure::write('Security.salt', 'foo!');
}
/**
- * Tear-down method. Resets environment state.
+ * Tear-down method. Resets environment state.
*
* @access public
* @return void
@@ -139,7 +157,6 @@ class SecurityComponentTest extends CakeTestCase {
unset($this->Controller);
Configure::write('Security.salt', $this->oldSalt);
}
-
/**
* testStartup method
*
@@ -584,7 +601,6 @@ DIGEST;
$result = $this->Controller->Security->validatePost($this->Controller);
$this->assertTrue($result);
}
-
/**
* test ValidatePost with multiple select elements.
*
@@ -776,7 +792,6 @@ DIGEST;
$result = $this->Controller->Security->validatePost($this->Controller);
$this->assertTrue($result);
}
-
/**
* testValidateHasManyRecordsPass method
*
@@ -1079,5 +1094,4 @@ DIGEST;
$this->assertEqual(current($this->Controller->testHeaders), $expected);
}
}
-
-?>
+?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/controller/components/session.test.php b/cake/tests/cases/libs/controller/components/session.test.php
index f0dde24b1..1fe1f61e6 100644
--- a/cake/tests/cases/libs/controller/components/session.test.php
+++ b/cake/tests/cases/libs/controller/components/session.test.php
@@ -1,7 +1,7 @@
Session->id();
}
@@ -42,20 +53,31 @@ class SessionTestController extends Controller {
/**
* OrangeSessionTestController class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.controller.components
*/
class OrangeSessionTestController extends Controller {
+/**
+ * uses property
+ *
+ * @var array
+ * @access public
+ */
var $uses = array();
-
+/**
+ * session_id method
+ *
+ * @return string
+ * @access public
+ */
function session_id() {
return $this->Session->id();
}
}
/**
- * Short description for class.
+ * SessionComponentTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.controller.components
*/
class SessionComponentTest extends CakeTestCase {
diff --git a/cake/tests/cases/libs/controller/controller.test.php b/cake/tests/cases/libs/controller/controller.test.php
index 3f64adbc8..5e16708a8 100644
--- a/cake/tests/cases/libs/controller/controller.test.php
+++ b/cake/tests/cases/libs/controller/controller.test.php
@@ -1,7 +1,7 @@
_params;
}
}
-
/**
* ScaffoldMock class
*
@@ -112,9 +110,8 @@ class ScaffoldMock extends CakeTestModel {
)
);
}
-
/**
- * ScaffoldAuthor class
+ * ScaffoldUser class
*
* @package cake
* @subpackage cake.tests.cases.libs.controller
@@ -140,7 +137,6 @@ class ScaffoldUser extends CakeTestModel {
)
);
}
-
/**
* ScaffoldComment class
*
@@ -168,7 +164,6 @@ class ScaffoldComment extends CakeTestModel {
)
);
}
-
/**
* TestScaffoldView class
*
@@ -188,9 +183,9 @@ class TestScaffoldView extends ScaffoldView {
}
}
/**
- * ScaffoldViewTest Case.
+ * ScaffoldViewTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.controller
*/
class ScaffoldViewTest extends CakeTestCase {
@@ -210,6 +205,15 @@ class ScaffoldViewTest extends CakeTestCase {
function setUp() {
$this->Controller =& new ScaffoldMockController();
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->Controller);
+ }
/**
* testGetViewFilename method
*
@@ -298,7 +302,6 @@ class ScaffoldViewTest extends CakeTestCase {
Configure::write('pluginPaths', $_back['pluginPaths']);
Configure::write('Routing.admin', $_admin);
}
-
/**
* test default index scaffold generation
*
@@ -505,26 +508,21 @@ class ScaffoldViewTest extends CakeTestCase {
Configure::write('Routing.admin', $_backAdmin);
}
-
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->Controller);
- }
}
-
-
/**
- * Scaffold Test Case
+ * Scaffold Test class
*
* @package cake
* @subpackage cake.tests.cases.libs.controller
*/
-class ScaffoldTestCase extends CakeTestCase {
+class ScaffoldTest extends CakeTestCase {
+/**
+ * Controller property
+ *
+ * @var SecurityTestController
+ * @access public
+ */
+ var $Controller;
/**
* fixtures property
*
@@ -541,6 +539,15 @@ class ScaffoldTestCase extends CakeTestCase {
function setUp() {
$this->Controller =& new ScaffoldMockController();
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->Controller);
+ }
/**
* Test the correct Generation of Scaffold Params.
* This ensures that the correct action and view will be generated
@@ -573,15 +580,5 @@ class ScaffoldTestCase extends CakeTestCase {
$result = $Scaffold->getParams();
$this->assertEqual($result['action'], 'admin_edit');
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->Controller);
- }
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/debugger.test.php b/cake/tests/cases/libs/debugger.test.php
index 0f80d2bf8..57f8b03dc 100644
--- a/cake/tests/cases/libs/debugger.test.php
+++ b/cake/tests/cases/libs/debugger.test.php
@@ -1,7 +1,7 @@
assertEqual(ini_get('docref_root'), 'http://php.net/');
}
-
/**
* test Excerpt writing
*
+ * @access public
* @return void
- **/
+ */
function testExcerpt() {
$return = Debugger::excerpt(__FILE__, 2, 2);
$this->assertTrue(is_array($return));
$this->assertEqual(count($return), 4);
$this->assertPattern('#/* SVN FILE: \$Id: debugger.test.php#', $return[1]);
-
+
$return = Debugger::excerpt('[internal]', 2, 2);
$this->assertTrue(empty($return));
}
@@ -247,34 +257,24 @@ class DebuggerTest extends CakeTestCase {
$expected = "array(\n\t\"People\" => array()\n)
";
$this->assertEqual($expected, $result);
}
-
/**
* test getInstance.
*
- * @return void
- **/
- function testGetInstance() {
- $result = Debugger::getInstance();
- $this->assertIsA($result, 'Debugger');
-
- $result = Debugger::getInstance('DebuggerTestCaseDebugger');
- $this->assertIsA($result, 'DebuggerTestCaseDebugger');
-
- $result = Debugger::getInstance();
- $this->assertIsA($result, 'DebuggerTestCaseDebugger');
-
- $result = Debugger::getInstance('Debugger');
- $this->assertIsA($result, 'Debugger');
- }
-/**
- * tearDown method
- *
* @access public
* @return void
*/
- function tearDown() {
- Configure::write('log', true);
- }
+ function testGetInstance() {
+ $result = Debugger::getInstance();
+ $this->assertIsA($result, 'Debugger');
+ $result = Debugger::getInstance('DebuggerTestCaseDebugger');
+ $this->assertIsA($result, 'DebuggerTestCaseDebugger');
+
+ $result = Debugger::getInstance();
+ $this->assertIsA($result, 'DebuggerTestCaseDebugger');
+
+ $result = Debugger::getInstance('Debugger');
+ $this->assertIsA($result, 'Debugger');
+ }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/error.test.php b/cake/tests/cases/libs/error.test.php
index b0b85947f..ef09072c0 100644
--- a/cake/tests/cases/libs/error.test.php
+++ b/cake/tests/cases/libs/error.test.php
@@ -1,7 +1,7 @@
assertPattern('/Not Found<\/h2>/', $result);
$this->assertPattern("/'\/test_error'<\/strong>/", $result);
-
+
ob_start();
$TestErrorHandler =& new TestErrorHandler('error404', array('message' => 'Page not found'));
ob_get_clean();
diff --git a/cake/tests/cases/libs/file.test.php b/cake/tests/cases/libs/file.test.php
index 6ec5ffbb9..2daff0f20 100644
--- a/cake/tests/cases/libs/file.test.php
+++ b/cake/tests/cases/libs/file.test.php
@@ -1,7 +1,7 @@
skipif (true, 'FlayTest not implemented');
+ $this->skipif(true, 'FlayTest not implemented');
}
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/folder.test.php b/cake/tests/cases/libs/folder.test.php
index 34fe46e0e..d9edfc83f 100644
--- a/cake/tests/cases/libs/folder.test.php
+++ b/cake/tests/cases/libs/folder.test.php
@@ -1,7 +1,7 @@
Socket, $this->RequestSocket);
@@ -69,6 +73,8 @@ class HttpSocketTest extends CakeTestCase {
/**
* Test that HttpSocket::__construct does what one would expect it to do
*
+ * @access public
+ * @return void
*/
function testConstruct() {
$this->Socket->reset();
@@ -92,10 +98,11 @@ class HttpSocketTest extends CakeTestCase {
$this->Socket->__construct(array('request' => array('uri' => 'http://www.cakephp.org:23/')));
$this->assertIdentical($this->Socket->config, $baseConfig);
}
-
/**
* Test that HttpSocket::configUri works properly with different types of arguments
*
+ * @access public
+ * @return void
*/
function testConfigUri() {
$this->Socket->reset();
@@ -158,10 +165,11 @@ class HttpSocketTest extends CakeTestCase {
$this->assertIdentical($this->Socket->config, $expected);
$this->assertIdentical($r, false);
}
-
/**
* Tests that HttpSocket::request (the heart of the HttpSocket) is working properly.
*
+ * @access public
+ * @return void
*/
function testRequest() {
$this->Socket->reset();
@@ -515,10 +523,11 @@ class HttpSocketTest extends CakeTestCase {
$this->RequestSocket->{low($method)}('http://www.google.com/', null, array('line' => 'Hey Server'));
}
}
-
/**
- * Enter description here...
+ * testParseResponse method
*
+ * @access public
+ * @return void
*/
function testParseResponse() {
$this->Socket->reset();
@@ -605,10 +614,11 @@ class HttpSocketTest extends CakeTestCase {
}
}
}
-
/**
- * Enter description here...
+ * testDecodeBody method
*
+ * @access public
+ * @return void
*/
function testDecodeBody() {
$this->Socket->reset();
@@ -647,10 +657,11 @@ class HttpSocketTest extends CakeTestCase {
}
}
}
-
/**
- * Enter description here...
+ * testDecodeChunkedBody method
*
+ * @access public
+ * @return void
*/
function testDecodeChunkedBody() {
$this->Socket->reset();
@@ -763,10 +774,11 @@ class HttpSocketTest extends CakeTestCase {
$r = $this->Socket->buildRequestLine("GET * HTTP/1.1\r\n");
$this->assertIdentical($r, "GET * HTTP/1.1\r\n");
}
-
/**
* Asserts that HttpSocket::parseUri is working properly
*
+ * @access public
+ * @return void
*/
function testParseUri() {
$this->Socket->reset();
@@ -867,10 +879,11 @@ class HttpSocketTest extends CakeTestCase {
'port' => 8080,
));
}
-
/**
* Tests that HttpSocket::buildUri can turn all kinds of uri arrays (and strings) into fully or partially qualified URI's
*
+ * @access public
+ * @return void
*/
function testBuildUri() {
$this->Socket->reset();
@@ -929,10 +942,11 @@ class HttpSocketTest extends CakeTestCase {
$r = $this->Socket->buildUri(array('scheme' => 'foo', 'host' => 'www.cakephp.org'));
$this->assertIdentical($r, 'foo://www.cakephp.org:80/');
}
-
/**
* Asserts that HttpSocket::parseQuery is working properly
*
+ * @access public
+ * @return void
*/
function testParseQuery() {
$this->Socket->reset();
@@ -1033,11 +1047,12 @@ class HttpSocketTest extends CakeTestCase {
);
$this->assertIdentical($query, $expectedQuery);
}
-
/**
* Tests that HttpSocket::buildHeader can turn a given $header array into a proper header string according to
* HTTP 1.1 specs.
*
+ * @access public
+ * @return void
*/
function testBuildHeader() {
$this->Socket->reset();
@@ -1070,10 +1085,11 @@ class HttpSocketTest extends CakeTestCase {
$this->assertIdentical($r, "Test\"@\"Field: My value\r\n");
}
-
/**
* Test that HttpSocket::parseHeader can take apart a given (and valid) $header string and turn it into an array.
*
+ * @access public
+ * @return void
*/
function testParseHeader() {
$this->Socket->reset();
@@ -1131,10 +1147,10 @@ class HttpSocketTest extends CakeTestCase {
$this->assertIdentical($r, $expected);
}
/**
- * undocumented function
+ * testParseCookies method
*
- * @return void
* @access public
+ * @return void
*/
function testParseCookies() {
$header = array(
@@ -1168,7 +1184,7 @@ class HttpSocketTest extends CakeTestCase {
$this->assertEqual($cookies, $expected);
}
/**
- * undocumented function
+ * testBuildCookies method
*
* @return void
* @access public
@@ -1191,6 +1207,8 @@ class HttpSocketTest extends CakeTestCase {
/**
* Tests that HttpSocket::__tokenEscapeChars() returns the right characters.
*
+ * @access public
+ * @return void
*/
function testTokenEscapeChars() {
$this->Socket->reset();
@@ -1211,10 +1229,11 @@ class HttpSocketTest extends CakeTestCase {
$r = $this->Socket->__tokenEscapeChars(false);
$this->assertEqual($r, $expected);
}
-
/**
* Test that HttpSocket::escapeToken is escaping all characters as descriped in RFC 2616 (HTTP 1.1 specs)
*
+ * @access public
+ * @return void
*/
function testEscapeToken() {
$this->Socket->reset();
@@ -1235,10 +1254,11 @@ class HttpSocketTest extends CakeTestCase {
$expectedToken = 'Extreme-":"Token-" "-""""@"-test';
$this->assertIdentical($expectedToken, $escapedToken);
}
-
/**
* Test that escaped token strings are properly unescaped by HttpSocket::unescapeToken
*
+ * @access public
+ * @return void
*/
function testUnescapeToken() {
$this->Socket->reset();
@@ -1259,11 +1279,12 @@ class HttpSocketTest extends CakeTestCase {
$expectedToken = 'Extreme-:Token- -"@-test';
$this->assertIdentical($expectedToken, $escapedToken);
}
-
/**
* This tests asserts HttpSocket::reset() resets a HttpSocket instance to it's initial state (before Object::__construct
* got executed)
*
+ * @access public
+ * @return void
*/
function testReset() {
$this->Socket->reset();
@@ -1281,11 +1302,12 @@ class HttpSocketTest extends CakeTestCase {
$this->assertIdentical($return, true);
}
-
/**
* This tests asserts HttpSocket::reset(false) resets certain HttpSocket properties to their initial state (before
* Object::__construct got executed).
*
+ * @access public
+ * @return void
*/
function testPartialReset() {
$this->Socket->reset();
@@ -1308,6 +1330,5 @@ class HttpSocketTest extends CakeTestCase {
}
$this->assertIdentical($return, true);
}
-
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/i18n.test.php b/cake/tests/cases/libs/i18n.test.php
index d10a61f73..89d87cc23 100644
--- a/cake/tests/cases/libs/i18n.test.php
+++ b/cake/tests/cases/libs/i18n.test.php
@@ -1,7 +1,7 @@
assertFalse(in_array('24 everything else (from core translated)', $corePlurals));
$this->assertFalse(in_array('25 everything else (from core translated)', $corePlurals));
}
-
+/**
+ * testPluginTranslation method
+ *
+ * @access public
+ * @return void
+ */
function testPluginTranslation() {
$pluginPaths = Configure::read('pluginPaths');
Configure::write('pluginPaths', array(TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'plugins'));
diff --git a/cake/tests/cases/libs/inflector.test.php b/cake/tests/cases/libs/inflector.test.php
index e3f1b5710..089fe5e9c 100644
--- a/cake/tests/cases/libs/inflector.test.php
+++ b/cake/tests/cases/libs/inflector.test.php
@@ -1,7 +1,7 @@
Inflector = Inflector::getInstance();
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->Inflector);
+ }
/**
* testInstantiation method
*
@@ -246,14 +255,5 @@ class InflectorTest extends CakeTestCase {
$this->assertEqual(Inflector::humanize('posts_tags'), 'Posts Tags');
$this->assertEqual(Inflector::humanize('file_systems'), 'File Systems');
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->Inflector);
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/l10n.test.php b/cake/tests/cases/libs/l10n.test.php
index 4737ff4a6..f3aaea211 100644
--- a/cake/tests/cases/libs/l10n.test.php
+++ b/cake/tests/cases/libs/l10n.test.php
@@ -1,7 +1,7 @@
Db =& new MagicDb();
}
-
/**
* MagicDb::analyze should properly detect the file type and output additional info as requested.
*
@@ -63,7 +60,6 @@ class MagicDbTest extends UnitTestCase {
$r = $this->Db->analyze(WWW_ROOT.'img'.DS.'cake.icon.gif');
// TODO: Check several serialized file samples for accurate detection
}
-
/**
* MagicDb::read should properly read MagicDb databases from .php-/.db-files and plain data arguments passed in and return false if the file wasn't found or
* if the readed data did not validate.
@@ -103,7 +99,6 @@ class MagicDbTest extends UnitTestCase {
$r = $this->Db->read(MagicDbTestData::get('magic.snippet.db'));
$this->assertTrue($r === true);
}
-
/**
* MagicDb::toArray should either return the MagicDb::db property, or the parsed array data if a magic.db dump is passed in as the first argument
*
@@ -127,7 +122,6 @@ class MagicDbTest extends UnitTestCase {
$r = $this->Db->toArray(MagicDbTestData::get('magic.snippet.db'));
$this->assertTrue($r === MagicDbTestData::get('magic.snippet.db.result'));
}
-
/**
* The MagicDb::validates function should return if the array passed to it or the local db property contains a valid MagicDb record set
*
@@ -152,11 +146,10 @@ class MagicDbTest extends UnitTestCase {
$this->assertTrue($r === true);
}
}
-
/**
* Test data holding object for MagicDb tests
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs
*/
/**
@@ -177,7 +170,6 @@ class MagicDbTestData extends Object {
'magic.snippet.db.result' => 'YToyOntzOjY6ImhlYWRlciI7YToyOntzOjQ6IkRhdGUiO3M6MTA6IjIwMDUtMDMtMjkiO3M6NjoiU291cmNlIjtzOjIyOiJodHRwOi8vd3d3Lm1hZ2ljZGIub3JnIjt9czo4OiJkYXRhYmFzZSI7YToyOntpOjA7YTo0OntpOjA7YTo0OntpOjA7czoxOiIwIjtpOjE7czo2OiJzdHJpbmciO2k6MjtzOjg6IlxceEZGV1BDIjtpOjM7czo1OToiW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBoZWxwIGZpbGUiO31pOjE7YTo0OntpOjA7czoyOiImOSI7aToxO3M6NDoiYnl0ZSI7aToyO3M6NDoiMHgwMiI7aTozO3M6MDoiIjt9aToyO2E6Mzp7aTowO3M6ODoiPjEwIGJ5dGUiO2k6MTtzOjE6IngiO2k6MjtzOjEyOiIsIHZlcnNpb24gJWQiO31pOjM7YTo0OntpOjA7czozOiI+MTEiO2k6MTtzOjQ6ImJ5dGUiO2k6MjtzOjE6IngiO2k6MztzOjM6Ii4lZCI7fX1pOjE7YTo0OntpOjA7YTo0OntpOjA7czoxOiIwIjtpOjE7czo2OiJzdHJpbmciO2k6MjtzOjg6IlxceEZGV1BDIjtpOjM7czo3ODoiW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBhcHBsaWNhdGlvbiByZXNvdXJjZSBsaWJyYXJ5Ijt9aToxO2E6NDp7aTowO3M6MjoiJjkiO2k6MTtzOjQ6ImJ5dGUiO2k6MjtzOjI6IjUxIjtpOjM7czowOiIiO31pOjI7YTo0OntpOjA7czozOiI+MTAiO2k6MTtzOjQ6ImJ5dGUiO2k6MjtzOjE6IngiO2k6MztzOjEyOiIsIHZlcnNpb24gJWQiO31pOjM7YTo0OntpOjA7czozOiI+MTEiO2k6MTtzOjQ6ImJ5dGUiO2k6MjtzOjE6IngiO2k6MztzOjM6Ii4lZCI7fX19fQ==',
'magic.db' => 'IyBGSUxFX0lEIERCDQojIERhdGU6MjAwNS0wMy0yOQ0KIyBTb3VyY2U6aHR0cDovL3d3dy5tYWdpY2RiLm9yZw0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBoZWxwIGZpbGUNCiY5CWJ5dGUJMHgwMgkNCj4xMCBieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTEJYnl0ZQl4CS4lZA0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBhcHBsaWNhdGlvbiByZXNvdXJjZSBsaWJyYXJ5DQomOQlieXRlCTUxCQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwMDAxO2V4dD07bWltZT07XVdvcmRwZXJmZWN0IGJsb2NrIGZpbGUNCiY5CWJ5dGUJMTMJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDAwMDE7ZXh0PTttaW1lPTtdV29yZHBlcmZlY3QgY29sdW1uIGJsb2NrDQomOQlieXRlCTE1CQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwMDAxO2V4dD07bWltZT07XVdvcmRwZXJmZWN0IGRpY3Rpb25hcnkgZmlsZQ0KJjkJYnl0ZQkweDBCCQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwMDAxO2V4dD07bWltZT07XVdvcmRwZXJmZWN0IGRpY3Rpb25hcnkgcnVsZXMgZmlsZQ0KJjkJYnl0ZQkzNAkNCj4xMAlieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTEJYnl0ZQl4CS4lZA0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBleHRlcm5hbCBzcGVsbCBjb2RlIG1vZHVsZSBmaWxlDQomOQlieXRlCTQ2CQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwMDAxO2V4dD07bWltZT07XVdvcmRwZXJmZWN0IGV4dGVybmFsIHNwZWxsIGRpY3Rpb25hcnkgZmlsZQ0KJjkJYnl0ZQk0NwkNCj4xMAlieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTEJYnl0ZQl4CS4lZA0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBHcmFwaGljcyBzY3JlZW4gZHJpdmVyIGZpbGUNCiY5CWJ5dGUJMjYJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDAwMDE7ZXh0PTttaW1lPTtdV29yZHBlcmZlY3QgaHlwaGVuYXRpb24gY29kZSBtb2R1bGUgZmlsZQ0KJjkJYnl0ZQkyMwkNCj4xMAlieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTEJYnl0ZQl4CS4lZA0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBoeXBoZW5hdGlvbiBkYXRhIG1vZHVsZSBmaWxlDQomOQlieXRlCTI0CQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwMDAxO2V4dD07bWltZT07XVdvcmRwZXJmZWN0IGh5cGhlbmF0aW9uIGxleCBtb2R1bGUNCiY5CWJ5dGUJMjcJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDAwMDE7ZXh0PTttaW1lPTtdV29yZHBlcmZlY3QgaW5zdGFsbGF0aW9uIGluZm9ybWF0aW9uIGZpbGUNCiY5CWJ5dGUJNDEJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDAwMDE7ZXh0PTttaW1lPTtdV29yZHBlcmZlY3Qga2V5Ym9hcmQgZGVmaW5pdGlvbiBmaWxlDQomOQlieXRlCTB4MDMJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDAwMDE7ZXh0PTttaW1lPTtdV29yZHBlcmZlY3QgbWFjcm8gZGF0YSBmaWxlDQomOQlieXRlCTB4MDEJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDAwMDE7ZXh0PTttaW1lPTtdV29yZHBlcmZlY3QgbWFjcm8gcmVzb3VyY2UgZmlsZQ0KJjkJYnl0ZQkyNQkNCj4xMAlieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTEJYnl0ZQl4CS4lZA0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBwcmludGVyIFEgY29kZXMgKHVzZWQgYnkgVkFYL0RHKQ0KJjkJYnl0ZQkyOAkNCj4xMAlieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTEJYnl0ZQl4CS4lZA0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCByZWN0YW5ndWxhciBibG9jayBmaWxlDQomOQlieXRlCTE0CQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwMDAxO2V4dD07bWltZT07XVdvcmRwZXJmZWN0IHNwZWxsIGNvZGUgbW9kdWxlIHJ1bGVzIGZpbGUNCiY5CWJ5dGUJMzMJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDAwMDE7ZXh0PTttaW1lPTtdV29yZHBlcmZlY3Qgc3BlbGwgY29kZSBtb2R1bGUgd29yZCBsaXN0DQomOQlieXRlCTI5CQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwMDAxO2V4dD07bWltZT07XVdvcmRwZXJmZWN0IHRoZXNhcnVzIGZpbGUNCiY5CWJ5dGUJMTIJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDAwMDE7ZXh0PTttaW1lPTtdV29yZHBlcmZlY3QgVkFYIGtleWJvYXJkIGRlZmluaXRpb24gZmlsZQ0KJjkJYnl0ZQkweDA0CQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwQUxMO2V4dD1hbGw7bWltZT07XVdvcmRwZXJmZWN0IHByaW50ZXIgcmVzb3VyY2UgZmlsZQ0KJjkJYnl0ZQkxOQkNCj4xMAlieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTEJYnl0ZQl4CS4lZA0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCVJJRkYJW2ZpZD0wMDAwMDEwMDEtMDAtMDAwMENPTjtleHQ9Y29uO21pbWU9O11NaWNyb3NvZnQgQW5pbWF0ZWQgY3Vyc29yLCBsaXR0bGUtZW5kaWFuDQomOAlzdHJpbmcJQUNPTgkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlSSUZYCVtmaWQ9MDAwMDAxMDAxLTAwLTAwMDBDT047ZXh0PWNvbjttaW1lPTtdTWljcm9zb2Z0IEFuaW1hdGVkIGN1cnNvciwgYmlnLWVuZGlhbg0KJjgJc3RyaW5nCUFDT04JDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwRE9DO2V4dD1kb2M7bWltZT07XU1hY2ludG9zaCBXb3JkcGVyZmVjdCBkb2N1bWVudCBmaWxlDQomOQlieXRlCTQ0CQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwRE9DO2V4dD1kb2M7bWltZT07XVZBWCBXb3JkcGVyZmVjdCBkb2N1bWVudCBmaWxlDQomOQlieXRlCTQ1CQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwRFJTO2V4dD1kcnM7bWltZT07XVdvcmRwZXJmZWN0IGRpc3BsYXkgcmVzb3VyY2UgZmlsZQ0KJjkJYnl0ZQkyMAkNCj4xMAlieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTEJYnl0ZQl4CS4lZA0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMEZJTDtleHQ9ZmlsO21pbWU9O11Xb3JkcGVyZmVjdCBvdmVybGF5IGZpbGUNCiY5CWJ5dGUJMjEJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlQTUNDCVtmaWQ9MDAwMDAxMDAxLTAwLTAwMDBHUlA7ZXh0PWdycDttaW1lPTtdTWljcm9zb2Z0IHdpbmRvd3MgZ3JvdXAgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJYmVzaG9ydAkweEUzMTAJW2ZpZD0wMDAwMDEwMDctMDAtMDAwSU5GTztleHQ9aW5mbzttaW1lPTtdQW1pZ2Egc2hvcnRjdXQgLyBpY29uIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDBJTlM7ZXh0PWluczttaW1lPTtdV29yZHBlcmZlY3QgaW5zdGFsbGF0aW9uIGluZm9ybWF0aW9uIGZpbGUNCiY5CWJ5dGUJNDMJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCWxlbG9uZwkweDAwMDAwMDRDCVtmaWQ9MDAwMDAxMDAxLTAwLTAwMDBMTks7ZXh0PWxuazttaW1lPTtdTWljcm9zb2Z0IFdpbmRvd3Mgc2hvcnRjdXQgZmlsZQ0KJjQJc3RyaW5nCVxceDAxXFx4MTRcXHgwMgkNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTAwLTAwMDBQUlM7ZXh0PXByczttaW1lPTtdV29yZHBlcmZlY3QgcHJpbnRlciByZXNvdXJjZSBmaWxlDQomOQlieXRlCTE2CQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwUVJTO2V4dD1xcnM7bWltZT07XVdvcmRwZXJmZWN0IDUuMSBlcXVhdGlvbiByZXNvdXJjZSBmaWxlDQomOQlieXRlCTMwCQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwU0VUO2V4dD1zZXQ7bWltZT07XVdvcmRwZXJmZWN0IHNldHVwIGRhdGENCiY5CWJ5dGUJMTcJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlSSUZGCVtmaWQ9MDAwMDAxMDAxLTBFLTAwMDBQQUw7ZXh0PXBhbCxyaWZmO21pbWU9O11NaWNyb3NvZnQgUGFsZXR0ZSwgbGl0dGxlLWVuZGlhbg0KJjgJc3RyaW5nCVBBTAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlSSUZYCVtmaWQ9MDAwMDAxMDAxLTBFLTAwMDBQQUw7ZXh0PXBhbCxyaWZ4O21pbWU9O11NaWNyb3NvZnQgUGFsZXR0ZSwgYmlnLWVuZGlhbg0KJjgJc3RyaW5nCVBBTAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNCBieSBDYXJsDQowCXN0cmluZwlET1MJW2ZpZD0wMDAwMDEwMDctMEYtMDAwMEFERjtleHQ9YWRmO21pbWU9O11BbWlnYU9TIEZpbGUgc3lzdGVtDQomMwlieXRlJjB4ZjgJMAkNCj4zCWJ5dGUmMQkwCSwgT0ZTDQo+MwlieXRlJjEJMQksIEZGUw0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTExIGJ5IENhcmwNCjAJYmVsb25nCTB4MDNGMwlbZmlkPTAwMDAwMTAwNy0xMC1MSUJSQVJZO2V4dD0sbGlicmFyeTttaW1lPTtdQW1pZ2EgQ2xhc3NpYyBleGVjdXRhYmxlIGZpbGUgKDY4MHgwIGZhbWlseSkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlcXHg3ZkVMRglbZmlkPTAwMDAwMDAwMy0xMC0wMDAwMDBPO2V4dD0sbyxzbyxvdXQ7bWltZT07XUV4ZWN1dGFibGUgbGlua2FibGUgZmlsZSAoRUxGKQ0KJjQJYnl0ZQk9MQksIDMyLWJpdA0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCVxceDdmRUxGCVtmaWQ9MDAwMDAwMDAzLTEwLTAwMDAwME87ZXh0PSxvLHNvLG91dDttaW1lPTtdRXhlY3V0YWJsZSBsaW5rYWJsZSBmaWxlIChFTEYpDQomNAlieXRlCT0yCSwgNjQtYml0DQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTQgYnkgQ2FybA0KMAlzdHJpbmcJTVoJW2ZpZD0wMDAwMDEwMDEtMTAtMDAwMEVYRTtleHQ9ZXhlLGRsbDttaW1lPTtdTmV3IGV4ZWN1dGFibGUgZmlsZQ0KJjB4MTgJbGVzaG9ydAk+MHgzRgkNCiYoNjAubCkJc3RyaW5nCU5FCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTE0IGJ5IENhcmwNCjAJc3RyaW5nCVpNCVtmaWQ9MDAwMDAxMDAxLTEwLTAwMDBFWEU7ZXh0PWV4ZSxkbGw7bWltZT07XU5ldyBleGVjdXRhYmxlIGZpbGUNCiYweDE4CWxlc2hvcnQJPjB4M0YJDQomKDYwLmwpCXN0cmluZwlORQkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xNCBieSBDYXJsDQowCXN0cmluZwlNWglbZmlkPTAwMDAwMTAwMS0xMC0wMDAwRVhFO2V4dD1leGUsZGxsO21pbWU9O11NaWNyb3NvZnQgV2luZG93cyAzLnggTmV3IEV4ZWN1dGFibGUgZmlsZQ0KJjB4MTgJbGVzaG9ydAk+MHgzRgkNCiYoNjAubCkJc3RyaW5nCU5FCQ0KJig2MC5sKzU0KQlieXRlCTB4MDIJDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTQgYnkgQ2FybA0KMAlzdHJpbmcJWk0JW2ZpZD0wMDAwMDEwMDEtMTAtMDAwMEVYRTtleHQ9ZXhlLGRsbDttaW1lPTtdTWljcm9zb2Z0IFdpbmRvd3MgMy54IE5ldyBFeGVjdXRhYmxlIGZpbGUNCiYweDE4CWxlc2hvcnQJPjB4M0YJDQomKDYwLmwpCXN0cmluZwlORQkNCiYoNjAubCs1NCkJYnl0ZQkweDAyCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTE0IGJ5IENhcmwNCjAJc3RyaW5nCU1aCVtmaWQ9MDAwMDAxMDA5LTEwLTAwMDBFWEU7ZXh0PWV4ZSxkbGw7bWltZT07XUlCTSBPUy8yIE5ldyBFeGVjdXRhYmxlIGZpbGUNCiYweDE4CWxlc2hvcnQJPjB4M0YJDQomKDYwLmwpCXN0cmluZwlORQkNCiYoNjAubCs1NCkJYnl0ZQkweDAxCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTE0IGJ5IENhcmwNCjAJc3RyaW5nCVpNCVtmaWQ9MDAwMDAxMDA5LTEwLTAwMDBFWEU7ZXh0PWV4ZSxkbGw7bWltZT07XUlCTSBPUy8yIE5ldyBFeGVjdXRhYmxlIGZpbGUNCiYweDE4CWxlc2hvcnQJPjB4M0YJDQomKDYwLmwpCXN0cmluZwlORQkNCiYoNjAubCs1NCkJYnl0ZQkweDAxCQ0KDQojIE1hZ2ljIElEIGZvciBNaWNyb3NvZnQgV2luZG93cyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTMgYnkgQ2FybA0KMAlzdHJpbmcJTVoJW2ZpZD0wMDAwMDEwMDEtMTAtMDAwMEVYRTtleHQ9ZXhlLGRsbDttaW1lPTtdTWljcm9zb2Z0IFdpbmRvd3MgTlQgUG9ydGFibGUgRXhlY3V0YWJsZSBmaWxlDQomMHgxOAlsZXNob3J0CTB4NDAJDQomKDYwLmwpCXN0cmluZwlQRVxceDAwXFx4MDAJDQoNCiMgTWFnaWMgSUQgZm9yIE1pY3Jvc29mdCBXaW5kb3dzIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMyBieSBDYXJsDQowCXN0cmluZwlaTQlbZmlkPTAwMDAwMTAwMS0xMC0wMDAwRVhFO2V4dD1leGUsZGxsO21pbWU9O11NaWNyb3NvZnQgV2luZG93cyBOVCBQb3J0YWJsZSBFeGVjdXRhYmxlIGZpbGUNCiYweDE4CWxlc2hvcnQJMHg0MAkNCiYoNjAubCkJc3RyaW5nCVBFXFx4MDBcXHgwMAkNCg0KIyBNYWdpYyBJRCBmb3IgTWljcm9zb2Z0IFdpbmRvd3MsRE9TNEdXIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xNCBieSBDYXJsDQowCXN0cmluZwlNWglbZmlkPTAwMDAwMTAwMS0xMC0wMDAwRVhFO2V4dD1leGUsZGxsLGRydjttaW1lPTtdTWljcm9zb2Z0IFdpbmRvd3MgTGluZWFyIGV4ZWN1dGFibGUNCiYweDE4CWxlc2hvcnQJPjB4M0YJDQomKDYwLmwpCXN0cmluZwlMRQkNCg0KIyBNYWdpYyBJRCBmb3IgTWljcm9zb2Z0IFdpbmRvd3MsRE9TNEdXIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xNCBieSBDYXJsDQowCXN0cmluZwlaTQlbZmlkPTAwMDAwMTAwMS0xMC0wMDAwRVhFO2V4dD1leGUsZGxsLGRydjttaW1lPTtdTWljcm9zb2Z0IFdpbmRvd3MgTGluZWFyIGV4ZWN1dGFibGUNCiYweDE4CWxlc2hvcnQJPjB4M0YJDQomKDYwLmwpCXN0cmluZwlMRQkNCg0KIyBNYWdpYyBJRCBmb3IgT1MvMixET1M0R1cgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTE0IGJ5IENhcmwNCjAJc3RyaW5nCU1aCVtmaWQ9MDAwMDAxMDA5LTEwLTAwMDBFWEU7ZXh0PWV4ZSxkbGwsZHJ2O21pbWU9O11PUy8yIExpbmVhciBleGVjdXRhYmxlDQomMHgxOAlsZXNob3J0CT4weDNGCQ0KJig2MC5sKQlzdHJpbmcJTFgJDQoNCiMgTWFnaWMgSUQgZm9yIE9TLzIsRE9TNEdXIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xNCBieSBDYXJsDQowCXN0cmluZwlaTQlbZmlkPTAwMDAwMTAwOS0xMC0wMDAwRVhFO2V4dD1leGUsZGxsLGRydjttaW1lPTtdT1MvMiBMaW5lYXIgZXhlY3V0YWJsZQ0KJjB4MTgJbGVzaG9ydAk+MHgzRgkNCiYoNjAubCkJc3RyaW5nCUxYCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA3LTMwIGJ5IENhcmwNCjAJc3RyaW5nCU1TRlQJW2ZpZD0wMDAwMDEwMDEtMTAtMDAwMFRMQjtleHQ9dGxiO21pbWU9O11NaWNyb3NvZnQgY29tcG9uZW50IHR5cGUgbGlicmFyeQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTExIGJ5IENhcmwNCjAJYmVzaG9ydAkweDYwMUEJW2ZpZD0wMDAwMDEwMDYtMTAtMDAwMFRUUDtleHQ9dHRwLGdlbSxwcmc7bWltZT07XUF0YXJpIE1pTlQgZXhlY3V0YWJsZS9vYmplY3QgZmlsZQ0KJjB4MTIJc3RyaW5nCU1pTlQJDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMTEgYnkgQ2FybA0KMAliZXNob3J0CTB4NjAxQQlbZmlkPTAwMDAwMTAwNi0xMC0wMDAwVFRQO2V4dD10dHAsZ2VtLHByZzttaW1lPTtdQXRhcmkgVE9TIGV4ZWN1dGFibGUvb2JqZWN0IGZpbGUNCiYweDEyCWJlbG9uZwkweDAwMDAJDQoNCiMgTWFnaWMgSUQgZm9yIFZpcnR1YWwgUGFzY2FsIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNy0zMCBieSBDYXJsDQowCXN0cmluZwlWUEkJW2ZpZD0wMDAwMDAwMDAtMTAtMDAwMFZQSTtleHQ9dnBpO21pbWU9O11WaXJ0dWFsIHBhc2NhbCB1bml0IGZpbGUNCiYweDAzCWJ5dGUJPjQ3CQ0KJjB4MDMJYnl0ZQk8NTgJDQoNCiMgTWFnaWMgSUQgZm9yIEphdmEgY29tcGlsZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTExIGJ5IENhcmwNCjAJYmVsb25nCTB4Q0FGRUJBQkUJW2ZpZD0wMDAwMDEwMTEtMTEtMDBDTEFTUztleHQ9Y2xhc3M7bWltZT07XUphdmFsIHZpcnR1YWwgbWFjaGluZSBjbGFzcyBmaWxlDQo+NgliZXNob3J0CXgJLCB2ZXJzaW9uICVkDQo+NAliZXNob3J0CXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIEJvcmxhbmQgRGVscGhpIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNy0zMCBieSBDYXJsDQowCXN0cmluZwlQS0cJW2ZpZD0wMDAwMDEwMDUtMTEtMDAwMERDUDtleHQ9ZGNwO21pbWU9O11Cb3JsYW5kIERlbHBoaSBjb21waWxlZCBwYWNrYWdlIGNvZGUgZmlsZQ0KJjB4MDMJYnl0ZQk+NDcJDQomMHgwMwlieXRlCTw1OAkNCg0KIyBNYWdpYyBJRCBmb3IgQm9ybGFuZCBEZWxwaGkgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA3LTMwIGJ5IENhcmwNCjAJc3RyaW5nCVxceERGXFx4MDBcXHgwMFxceDBGCVtmaWQ9MDAwMDAxMDA1LTExLTAwMDBEQ1U7ZXh0PWRjdTttaW1lPTtdQm9ybGFuZCBEZWxwaGkgY29kZSB1bml0IGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgVHVyYm8gUGFzY2FsIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNy0yOSBieSBDYXJsDQowCXN0cmluZwlUUFU5CVtmaWQ9MDAwMDAxMDA1LTExLTAwMDBUUFU7ZXh0PXRwdTttaW1lPTtdVHVyYm8gUGFzY2FsIDYuMCBjb2RlIHVuaXQgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBUdXJibyBQYXNjYWwsIEJvcmxhbmQgUGFzY2FsIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNy0yOSBieSBDYXJsDQowCXN0cmluZwlUUFVRCVtmaWQ9MDAwMDAxMDA1LTExLTAwMDBUUFU7ZXh0PXRwdSx0cHAsdHB3O21pbWU9O11Cb3JsYW5kIFBhc2NhbCA3LjAgY29kZSB1bml0IGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQoyCXN0cmluZwlBRExJQi0JW2ZpZD0wMDAwMDEwMTYtMjAtMDAwMEJOSztleHQ9Ym5rO21pbWU9O11BZGxpYiBGTSBpbnN0cnVtZW50IGJhbmsgZmlsZQ0KPjAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjEJYnl0ZQl4CS4lZA0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE2IGJ5IENhcmwNCjAJc3RyaW5nCUlCS1xceDFBCVtmaWQ9MDAwMDAxMDEzLTIwLTAwMDBJQks7ZXh0PWliazttaW1lPTtdQ3JlYXRpdmUgTGFicyBGTSBpbnN0cnVtZW50IGJhbmsgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBNaWNyb3NvZnQgSW5zdHJ1bWVudCBEZWZpbml0aW9uIGZpbGUgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA0IGJ5IENhcmwNCjAJc3RyaW5nCVJJRkYJW2ZpZD0wMDAwMDEwMDEtMjAtMDAwMElERjtleHQ9aWRmO21pbWU9O11NaWNyb3NvZnQgaW5zdHJ1bWVudCBkZWZpbml0aW9uIGZpbGUsIGxpdHRsZS1lbmRpYW4NCiY4CXN0cmluZwlJREZcXCAJDQoNCiMgTWFnaWMgSUQgZm9yIE1pY3Jvc29mdCBJbnN0cnVtZW50IERlZmluaXRpb24gZmlsZSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJUklGWAlbZmlkPTAwMDAwMTAwMS0yMC0wMDAwSURGO2V4dD1pZGY7bWltZT07XU1pY3Jvc29mdCBpbnN0cnVtZW50IGRlZmluaXRpb24gZmlsZSwgYmlnLWVuZGlhbg0KJjgJc3RyaW5nCUlERlxcIAkNCg0KIyBNYWdpYyBJRCBmb3IgRGlnaXRyYWtrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA0IGJ5IENhcmwNCjAJc3RyaW5nCURJU1QJW2ZpZD0wMDAxMDAwODgtMjAtMDAwMElTVDtleHQ9aXN0O21pbWU9O11EaWdpdHJha2tlciBJbnN0cnVtZW50IGZpbGUNCiY0CWJ5dGUJPDIJDQoNCiMgTWFnaWMgSUQgZm9yIEltcHVsc2UgdHJhY2tlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJSU1QSQlbZmlkPTAwMDEwMDAzMi0yMC0wMDAwSVRJO2V4dD1pdGk7bWltZT07XUltcHVsc2UgdHJhY2tlciBpbnN0cnVtZW50IGZpbGUNCj4weDIwCXN0cmluZwl4CVt0aXRsZT0lLjI2c10NCg0KIyBNYWdpYyBJRCBmb3IgTWFkdHJhY2tlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDUgYnkgQ2FybA0KMAlzdHJpbmcJTUkyMQlbZmlkPTAwMDEwMDA5MS0yMC0wMDAwTVRJO2V4dD1tdGk7bWltZT07XU1hZHRyYWNrZXIgaW5zdHJ1bWVudCBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEdyYXZpcyBVbHRyYXNvdW5kIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlHRjFQQVRDSDEwMFxcMElEIzAwMDAwMlxcMAlbZmlkPTAwMDAwMTAxOC0yMC0wMDAwUEFUO2V4dD1wYXQ7bWltZT07XUdyYXZpcyBVbHRyYXNvdW5kIFBhdGNoIChvbGQgaW5zdHJ1bWVudCBkYXRhKQ0KDQojIE1hZ2ljIElEIGZvciBHcmF2aXMgVWx0cmFzb3VuZCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMAlzdHJpbmcJR0YxUEFUQ0gxMTBcXDBJRCMwMDAwMDJcXDAJW2ZpZD0wMDAwMDEwMTgtMjAtMDAwMFBBVDtleHQ9cGF0O21pbWU9O11HcmF2aXMgVWx0cmFzb3VuZCBQYXRjaCAoaW5zdHJ1bWVudCBkYXRhKQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjAJc3RyaW5nCVNCSVxceDFBCVtmaWQ9MDAwMDAxMDEzLTIwLTAwMDBTQkk7ZXh0PXNiaTttaW1lPTtdQ3JlYXRpdmUgTGFicyBGTSBpbnN0cnVtZW50IGRhdGEgZmlsZQ0KPjQJc3RyaW5nCT4wCVt0aXRsZT0lLjMyc10NCg0KIyBNYWdpYyBJRCBmb3IgU2lkcGxheSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDUgYnkgQ2FybA0KMAlzdHJpbmcJU0lEUExBWVxcIElORk9GSUxFCVtmaWQ9MDAwMDAwMDAwLTIwLTAwMDBTSUQ7ZXh0PXNpZDttaW1lPTtdU0lEUGxheWVyIG11c2ljIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgRmFzdHRyYWNrZXIgMi4wIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlFeHRlbmRlZFxcIEluc3RydW1lbnQ6XFwgCVtmaWQ9MDAwMTAwMDI2LTIwLTAwMDAwWEk7ZXh0PXhpO21pbWU9O11GYXN0VHJhY2tlciBJSSBpbnN0cnVtZW50IGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlSSUZGCVtmaWQ9MDAwMDAxMDAxLTIxLTAwMDAwMDA7ZXh0PTttaW1lPTtdTUlESSBtdXNpYyBmaWxlLCBsaXR0bGUtZW5kaWFuDQomOAlzdHJpbmcJUk1JRAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlSSUZYCVtmaWQ9MDAwMDAxMDAxLTIxLTAwMDAwMDA7ZXh0PTttaW1lPTtdTUlESSBtdXNpYyBmaWxlLCBiaWctZW5kaWFuDQomOAlzdHJpbmcJUk1JRAkNCg0KIyBNYWdpYyBJRCBmb3IgQWJ5c3NcJ3MgaGlnaGVzdCBleHBlcmllbmNlIChBSFgpIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlUSFgJW2ZpZD0wMDAxMDAwMjktMjEtMDAwMEFIWDtleHQ9YWh4O21pbWU9O11BSFggbW9kdWxlIG11c2ljIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQW11c2ljIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQoxMDYyCXN0cmluZwlcXHgzY1xceDZmXFx4ZWZcXHg1MVxceDU1XFx4RUVcXHg1MlxceDZGXFx4NTIJW2ZpZD0wMDAxMDAwMzQtMjEtMDAwMEFNRDtleHQ9YW1kO21pbWU9O11BbXVzaWMgQWRsaWIgdHJhY2tlciBtdXNpYyBmaWxlDQo+MAlzdHJpbmcJPlxceDAwCVt0aXRsZT0lLjIzc10NCj4yNAlzdHJpbmcJPlxcMAlbY3JlYXRvcj0lLjI0c10NCg0KIyBNYWdpYyBJRCBmb3IgVmVsdmV0IFN0dWRpbyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMAlzdHJpbmcJQU1TaGRyXFx4MWEJW2ZpZD0wMDAwMDEyNzYtMjEtMDAwMEFNUztleHQ9YW1zO21pbWU9O11WZWx2ZXQgU3R1ZGlvIG1vZHVsZSBtdXNpYyBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEF1ZGlvIHZpc3VhbCByZXNlYXJjaCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJMkJJVAlbZmlkPTAwMDAwMTMwMS0yMS0wMDAwQVZSO2V4dD1hdnI7bWltZT07XUF1ZGlvIHZpc3VhbCByZXNlYXJjaCBhdWRpbyBmaWxlDQo+NAlzdHJpbmcJeAlbdGl0bGU9JS44c10NCg0KIyBNYWdpYyBJRCBmb3IgU291bmRtb24gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjI2CXN0cmluZwlWLjIJW2ZpZD0wMDAxMDAwMjgtMjEtMDAwMDBCUDtleHQ9YnA7bWltZT07XVNvdW5kbW9uIG1vZHVsZSBtdXNpYyBmaWxlLCB2ZXJzaW9uIDIueA0KPjAJc3RyaW5nCT5cXDAJW3RpdGxlPSUuMjZzXQ0KDQojIE1hZ2ljIElEIGZvciBTb3VuZG1vbiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMjYJc3RyaW5nCVYuMwlbZmlkPTAwMDEwMDAyOC0yMS0wMDAwQlAzO2V4dD1icDM7bWltZT07XVNvdW5kbW9uIG1vZHVsZSBtdXNpYyBmaWxlLCB2ZXJzaW9uIDMueA0KPjAJc3RyaW5nCT5cXDAJW3RpdGxlPSUuMjZzXQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjAJc3RyaW5nCUNUTUYJW2ZpZD0wMDAwMDEwMTMtMjEtMDAwMENNRjtleHQ9Y21mO21pbWU9O11DcmVhdGl2ZSBMYWJzIG11c2ljIGZpbGUNCj40CWJ5dGUJeAksIHZlcnNpb24gJWQNCj41CWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgRGlnaWJvb3N0ZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA0IGJ5IENhcmwNCjAJc3RyaW5nCURJR0kgQm9vc3RlciBtb2R1bGVcXDAJW2ZpZD0wMDAwMDEzMDItMjEtMDAwRElHSTtleHQ9ZGlnaTttaW1lPTtdRGlnaWJvb3N0ZXIgbXVzaWMgZmlsZQ0KPjYxMAlzdHJpbmcJeAlbdGl0bGU9JS4zMnNdDQoNCiMgTWFnaWMgSUQgZm9yIERlbHVzaW9uIFh0cmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlERE1GCVtmaWQ9MDAwMDAwMDAwLTIxLTAwMDBETUY7ZXh0PWRtZjttaW1lPTtdRGVsdXNpb24gdHJhY2tlciBtb2R1bGUgbXVzaWMgZmlsZQ0KPjQJYnl0ZQl4CSwgdmVyc2lvbiAlZC4wDQo+MTMJc3RyaW5nCT5cXDAJW3RpdGxlPSUuMzBzXQ0KPjQzCXN0cmluZwk+XFwwCVtjcmVhdG9yPSUuMjBzXQ0KDQojIE1hZ2ljIElEIGZvciBET1MgU291bmQgaW50ZXJmYWNlIGtpdCAoRFNJSykgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjAJc3RyaW5nCVJJRkYJW2ZpZD0wMDAwMDAwMDAtMjEtMDAwMERTTTtleHQ9ZHNtO21pbWU9O11ET1MgU291bmQgaW50ZXJmYWNlIGtpdCBtb2R1bGUgbXVzaWMgZmlsZQ0KJjgJc3RyaW5nCURTTUYJDQoNCiMgTWFnaWMgSUQgZm9yIEVkbGliIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNyBieSBDYXJsDQowCXN0cmluZwlcXHgwMFxceDA2XFx4RkVcXHhGRAlbZmlkPTAwMDEwMDAyNy0yMS0wMDAwRURMO2V4dD1lZGw7bWltZT07XUVkbGliIEZNIHRyYWNrZXIgbXVzaWMgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBRdWFkcmEgQ29tcG9zZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA0IGJ5IENhcmwNCjAJc3RyaW5nCUZPUk0JW2ZpZD0wMDAxMDAwODUtMjEtMDAwMEVNRDtleHQ9ZW1kO21pbWU9O11FbmhhbmNlZCBtb2R1bGUgbXVzaWMgZmlsZSAoSUZGKQ0KJjgJc3RyaW5nCUVNT0QJDQoNCiMgTWFnaWMgSUQgZm9yIEZhcmFuZG9sZSBjb21wb3NlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMAlzdHJpbmcJRkFSXFx4RkUJW2ZpZD0wMDAxMDAwODctMjEtMDAwMEZBUjtleHQ9ZmFyO21pbWU9O11GYXJhbmRvbGUgY29tcG9zZXIgbW9kdWxlIG11c2ljIGZpbGUNCj40CXN0cmluZwk+XFwwCVt0aXRsZT0lLjQwc10NCg0KIyBNYWdpYyBJRCBmb3IgRnVua3RyYWNrZXIgR29sZCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJRnVuawlbZmlkPTAwMDEwMDA4Ni0yMS0wMDAwRk5LO2V4dD1mbms7bWltZT07XUZ1bmt0cmFja2VyIEdvbGQgbXVzaWMgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBCZWxscywgV2hpc3RsZXMsIGFuZCBTb3VuZCBCb2FyZHMgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE2IGJ5IENhcmwNCjAJc3RyaW5nCUdETVxceEZFCVtmaWQ9MDAwMDAxMjgwLTIxLTAwMDBHRE07ZXh0PWdkbTttaW1lPTtdR2VuZXJhbCBEaWdpTXVzaWMgbW9kdWxlIG11c2ljIGZpbGUNCj40CXN0cmluZwk+XFx4MDAJW3RpdGxlPSUuMzJzXQ0KDQojIE1hZ2ljIElEIGZvciBHcmFvdW1mIFRyYWNrZXIgMiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMAlzdHJpbmcJR1QyCVtmaWQ9MDAwMTAwMDMxLTIxLTAwMDBHVDI7ZXh0PWd0MjttaW1lPTtdR3Jhb3VtZiBUcmFja2VyIG1vZHVsZSBtdXNpYyBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEltYWdvIE1vcnBoZXVzIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNCBieSBDYXJsDQoweDNDCXN0cmluZwlJTTEwCVtmaWQ9MDAwMDAxMjc5LTIxLTAwMDBJTUY7ZXh0PWltZjttaW1lPTtdSW1hZ28gbW9ycGhldXMgbXVzaWMgZmlsZSwgMzIgY2hhbm5lbHMNCj4wCXN0cmluZwl4CVt0aXRsZT0lLjMxc10NCg0KIyBNYWdpYyBJRCBmb3IgSW1wdWxzZSB0cmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlJTVBNCVtmaWQ9MDAwMTAwMDMyLTIxLTAwMDAwSVQ7ZXh0PWl0O21pbWU9O11JbXB1bHNlIFRyYWNrZXIgbW9kdWxlIG11c2ljIGZpbGUNCj40CXN0cmluZwk+XFx4MDAJW3RpdGxlPSUuMjZzXQ0KDQojIE1hZ2ljIElEIGZvciBKYW1jcmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNCBieSBDYXJsDQowCXN0cmluZwlCZUVwCVtmaWQ9MDAwMDAwMDAwLTIxLTAwMDBKQU07ZXh0PWphbTttaW1lPTtdSmFtY3JhY2tlciB0cmFja2VyIG1vZHVsZSBtdXNpYyBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIExpcXVpZCB0cmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNCBieSBDYXJsDQowCXN0cmluZwlMaXF1aWQgTW9kdWxlOglbZmlkPTAwMDEwMDA5MC0yMS0wMDAwTElRO2V4dD1saXE7bWltZT07XUxpcXVpZCB0cmFja2VyIG1vZHVsZSBtdXNpYyBmaWxlDQomMHg0MAlieXRlCTB4MUEJDQo+MHgwRQlzdHJpbmcJPlxcMAlbdGl0bGU9JS4zMHNdDQo+MHgyYwlzdHJpbmcJPlxcMAlbY3JlYXRvcj0lLjIwc10NCg0KIyBNYWdpYyBJRCBmb3IgRGlnaXRyYWtrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA0IGJ5IENhcmwNCjAJc3RyaW5nCURNREwJW2ZpZD0wMDAxMDAwODgtMjEtMDAwME1ETDtleHQ9bWRsO21pbWU9O11EaWdpdHJha2tlciBtb2R1bGUgbXVzaWMgZmlsZQ0KJjQJYnl0ZQk8MHgxMgkNCg0KIyBNYWdpYyBJRCBmb3IgTUVEIFNvdW5kc3R1ZGlvIC8gT2N0YU1FRCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMAlzdHJpbmcJTU1EMAlbZmlkPTAwMDAwMTI3OC0yMS0wMDAwTUVEO2V4dD1tZWQ7bWltZT07XU9jdGFtZWQgdHJhY2tlciBtb2R1bGUgbXVzaWMgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBNRUQgU291bmRzdHVkaW8gLyBPY3RhTUVEIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlNTUQxCVtmaWQ9MDAwMDAxMjc4LTIxLTAwMDBNRUQ7ZXh0PW1lZDttaW1lPTtdT2N0YW1lZCBQcm8gVHJhY2tlciBtb2R1bGUgbXVzaWMgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBNRUQgU291bmRzdHVkaW8gLyBPY3RhTUVEIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlNTUQyCVtmaWQ9MDAwMDAxMjc4LTIxLTAwMDBNRUQ7ZXh0PW1lZDttaW1lPTtdT2N0YW1lZCBQcm8gVHJhY2tlciBtb2R1bGUgbXVzaWMgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBNRUQgU291bmRzdHVkaW8gLyBPY3RhTUVEIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlNTUQzCVtmaWQ9MDAwMDAxMjc4LTIxLTAwMDBNRUQ7ZXh0PW1lZDttaW1lPTtdT2N0YW1lZCBTb3VuZCBTdHVkaW8gbW9kdWxlIG11c2ljIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgTXVzaWNsaW5lIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNSBieSBDYXJsDQowCXN0cmluZwlNTEVETU9ETAlbZmlkPTAwMDAwMTMwNC0yMS0wMDAwME1MO2V4dD1tbDttaW1lPTtdTXVzaWNsaW5lIG1vZHVsZSBtdXNpYyBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFByb3RyYWNrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjEwODAJc3RyaW5nCU0hSyEJW2ZpZD0wMDAxMDAwMjItMjEtMDAwME1PRDtleHQ9bW9kO21pbWU9O11Qcm90cmFja2VyIDIuMyBtb2R1bGUgbXVzaWMgZmlsZQ0KPjAJc3RyaW5nCT5cXDAJW3RpdGxlPSUuMjBzXQ0KDQojIE1hZ2ljIElEIGZvciBQcm90cmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQoxMDgwCXN0cmluZwlNLksuCVtmaWQ9MDAwMTAwMDIyLTIxLTAwMDBNT0Q7ZXh0PW1vZDttaW1lPTtdUHJvdHJhY2tlciBtb2R1bGUgbXVzaWMgZmlsZQ0KPjAJc3RyaW5nCT5cXDAJW3RpdGxlPSUuMjBzXQ0KDQojIE1hZ2ljIElEIGZvciBQcm90cmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNSBieSBDYXJsDQowCXN0cmluZwlGT1JNCVtmaWQ9MDAwMTAwMDIyLTIxLTAwMDBNT0Q7ZXh0PW1vZDttaW1lPTtdUHJvdHJhY2tlciBtb2R1bGUgbXVzaWMgZmlsZSwgdmVyc2lvbiAzLngNCiY4CXN0cmluZwlNT0RMCQ0KDQojIE1hZ2ljIElEIGZvciBTdGFydHJla2tlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMTA4MAlzdHJpbmcJRkxUNAlbZmlkPTAwMDEwMDAyNC0yMS0wMDAwTU9EO2V4dD1tb2Q7bWltZT07XVN0YXJ0cmVra2VyIG1vZHVsZSBtdXNpYyBmaWxlLCA0IGNoYW5uZWxzDQo+MAlzdHJpbmcJPlxcMAlbdGl0bGU9JS4yMHNdDQoNCiMgTWFnaWMgSUQgZm9yIFN0YXJ0cmVra2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQoxMDgwCXN0cmluZwlGTFQ4CVtmaWQ9MDAwMTAwMDI0LTIxLTAwMDBNT0Q7ZXh0PW1vZDttaW1lPTtdU3RhcnRyZWtrZXIgbW9kdWxlIG11c2ljIGZpbGUsIDggY2hhbm5lbHMNCj4wCXN0cmluZwk+XFwwCVt0aXRsZT0lLjIwc10NCg0KIyBNYWdpYyBJRCBmb3IgRmFzdHRyYWNrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjEwODAJc3RyaW5nCTZDSE4JW2ZpZD0wMDAwMDEyNzUtMjEtMDAwME1PRDtleHQ9bW9kO21pbWU9O11GYXN0dHJhY2tlciBtb2R1bGUgbXVzaWMgZmlsZSwgNiBjaGFubmVscw0KPjAJc3RyaW5nCT5cXDAJW3RpdGxlPSUuMjBzXQ0KDQojIE1hZ2ljIElEIGZvciBGYXN0dHJhY2tlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMTA4MAlzdHJpbmcJOENITglbZmlkPTAwMDAwMTI3NS0yMS0wMDAwTU9EO2V4dD1tb2Q7bWltZT07XUZhc3R0cmFja2VyIG1vZHVsZSBtdXNpYyBmaWxlLCA2IGNoYW5uZWxzDQo+MAlzdHJpbmcJPlxcMAlbdGl0bGU9JS4yMHNdDQoNCiMgTWFnaWMgSUQgZm9yIE1hZHRyYWNrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA1IGJ5IENhcmwNCjAJc3RyaW5nCU1UMjAJW2ZpZD0wMDAxMDAwOTEtMjEtMDAwME1UMjtleHQ9bXQyO21pbWU9O11NYWR0cmFja2VyIG1vZHVsZSBtdXNpYyBmaWxlDQo+NDIJc3RyaW5nCXgJW3RpdGxlPSUuNjRzXQ0KPjExMglsZXNob3J0CXgJW2Nobj0lZF0NCg0KIyBNYWdpYyBJRCBmb3IgTXVsdGl0cmFja2VyIE1vZHVsZSBlZGl0b3IgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjAJc3RyaW5nCU1UTQlbZmlkPTAwMDEwMDA4OS0yMS0wMDAwTVRNO2V4dD1tdG07bWltZT07XU11bHRpVHJhY2tlciBtb2R1bGUgbXVzaWMgZmlsZQ0KPjQJc3RyaW5nCT5cXHgwMAlbdGl0bGU9JS4yMHNdDQoNCiMgTWFnaWMgSUQgZm9yIE1hZHRyYWNrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA1IGJ5IENhcmwNCjAJc3RyaW5nCU1UUDIJW2ZpZD0wMDAxMDAwOTEtMjEtMDAwME1UUDtleHQ9bXRwO21pbWU9O11NYWR0cmFja2VyIHBhdHRlcm4gZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBBL05FUyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDcgYnkgQ2FybA0KMAlzdHJpbmcJTkVTQQlbZmlkPTAwMDEwMDA5NC0yMS0wMDAwTlNBO2V4dD1uc2E7bWltZT07XUEvTkVTIHJpcHBlZCBhdWRpbyBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDcgYnkgQ2FybA0KMAlzdHJpbmcJTkVTTVxceDFBCVtmaWQ9MDAwMTAwMDkzLTIxLTAwMDBOU0Y7ZXh0PW5zZjttaW1lPTtdTkVTIHJpcHBlZCBhdWRpbyBmaWxlDQo+NQlieXRlCXgJLCB2ZXJzaW9uICVkLjANCj4weDBFCXN0cmluZwl4CVt0aXRsZT0lLjMyc10NCj4weDJFCXN0cmluZwl4CVtjcmVhdG9yPSUuMzJzXQ0KDQojIE1hZ2ljIElEIGZvciBOb2lzZXRyYWNrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjEwODAJc3RyaW5nCU0mSyEJW2ZpZD0wMDAxMDAwMjMtMjEtMDAwME5TVDtleHQ9bnN0O21pbWU9O11Ob2lzZXRyYWNrZXIgbW9kdWxlIG11c2ljIGZpbGUNCj4wCXN0cmluZwk+XFwwCVt0aXRsZT0lLjIwc10NCg0KIyBNYWdpYyBJRCBmb3IgT2t0YWx5emVyIHRyYWNrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjAJc3RyaW5nCU9LVEFTT05HCVtmaWQ9MDAwMTAwMDMwLTIxLTAwMDBPS1Q7ZXh0PW9rdDttaW1lPTtdT2t0YWx5emVyIG1vZHVsZSBtdXNpYyBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFNCU3R1ZGlvIHNvdW5kIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNSBieSBDYXJsDQowCXN0cmluZwlQQUNHCVtmaWQ9MDAwMTAwMDIwLTIxLTAwMDBQQUM7ZXh0PXBhYzttaW1lPTtdU0JTdHVkaW8gbW9kdWxlIG11c2ljIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgUG9seXRyYWNrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjQ0CXN0cmluZwlQVE1GCVtmaWQ9MDAwMDAwMDAwLTIxLTAwMDBQVE07ZXh0PXB0bTttaW1lPTtdUG9seSBUcmFja2VyIG1vZHVsZSBtdXNpYyBmaWxlDQo+MzgJbGVzaG9ydAk+MAlbY2huPSVkXQ0KPjAJc3RyaW5nCT5cXDAJW3RpdGxlPSUuMjhzXQ0KDQojIE1hZ2ljIElEIGZvciBSZWFsaXR5IEFkbGliIHRyYWNrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjAJc3RyaW5nCVJBRFxcIGJ5CVtmaWQ9MDAwMDAwMDAwLTIxLTAwMDBSQUQ7ZXh0PXJhZDttaW1lPTtdUmVhbGl0eSBBZGxpYiB0cmFja2VyIG11c2ljIGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlSSUZGCVtmaWQ9MDAwMDAwMDAwLTIxLTAwMDBSTUk7ZXh0PXJtaTttaW1lPWFwcGxpY2F0aW9uL3ZuZC5tdXNpYy1uaWZmO11Tb25nIG5vdGF0aW9uIGRhdGEgZmlsZSwgbGl0dGxlLWVuZGlhbg0KJjgJc3RyaW5nCU5JRkYJDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMAlzdHJpbmcJUklGWAlbZmlkPTAwMDAwMDAwMC0yMS0wMDAwUk1JO2V4dD1ybWk7bWltZT1hcHBsaWNhdGlvbi92bmQubXVzaWMtbmlmZjtdU29uZyBub3RhdGlvbiBkYXRhIGZpbGUsIGJpZy1lbmRpYW4NCiY4CXN0cmluZwlOSUZGCQ0KDQojIE1hZ2ljIElEIGZvciBBZGxpYiBWaXN1YWwgQ29tcG9zZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjAJbGVzaG9ydAkweDAwMDAJW2ZpZD0wMDAwMDEwMTYtMjEtMDAwMFJPTDtleHQ9cm9sO21pbWU9O11BZGxpYiBtdXNpYyBmaWxlDQomMglsZXNob3J0CTB4MDAwNAkNCg0KIyBNYWdpYyBJRCBmb3IgU2NyZWFtdHJhY2tlciAzIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQoweDJDCXN0cmluZwlTQ1JNCVtmaWQ9MDAwMTAwMDI1LTIxLTAwMDBTM007ZXh0PXMzbTttaW1lPTtdU2NyZWFtIHRyYWNrZXIgbW9kdWxlIG11c2ljIGZpbGUNCj4weDJBCWxlc2hvcnQJPjAJLCB2ZXJzaW9uICVkLjANCj4wCXN0cmluZwk+XFwwCVt0aXRsZT0lLjI4c10NCg0KIyBNYWdpYyBJRCBmb3IgU3VycHJpc2UhIEFkbGliIFRyYWNrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjAJc3RyaW5nCVNBZFQJW2ZpZD0wMDAxMDAwMjEtMjEtMDAwMFNBMjtleHQ9c2EyO21pbWU9O11TdXJwcmlzZSBQcm9kdWN0aW9ucyBBZGxpYiB0cmFja2VyIG11c2ljIGZpbGUNCj40CWJ5dGUJeAksIHZlcnNpb24gMC4lZA0KDQojIE1hZ2ljIElEIGZvciBTb3VuZEZYIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQo2MAlzdHJpbmcJU09ORwlbZmlkPTAwMDAwMTI3Ny0yMS0wMDAwU0ZYO2V4dD1zZng7bWltZT07XVNvdW5kRlggVHJhY2tlciBtb2R1bGUgbXVzaWMgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBQbGF5U0lELCBTaWRwbGF5IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNSBieSBDYXJsDQowCXN0cmluZwlQU0lECVtmaWQ9MDAwMDAwMDAwLTIxLTAwMDBTSUQ7ZXh0PXNpZDttaW1lPTtdUGxheVNJRCBtdXNpYyBmaWxlDQo+MTYJc3RyaW5nCXgJW3RpdGxlPSUuMjBzXQ0KPjM2CXN0cmluZwl4CVtjcmVhdG9yPSUuMjBzXQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE1IGJ5IENhcmwNCjAJc3RyaW5nCU1UaGQJW2ZpZD0wMDAwMDEwMTctMjEtMDAwMFNNRjtleHQ9c21mLG1pZGk7bWltZT07XVN0YW5kYXJkIE1JREkgbXVzaWMgZmlsZQ0KPjEwCWJlc2hvcnQJPjAJW2Nobj0lZF0NCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNSBieSBDYXJsDQowCXN0cmluZwlGT1JNCVtmaWQ9MDAwMDAxMDEwLTIxLTAwMFNNVVM7ZXh0PXNtdXMsbXVzO21pbWU9O11JRkYgU2ltcGxlIE11c2ljYWwgU2NvcmUgZmlsZQ0KJjgJc3RyaW5nCVNNVVMJDQoNCiMgTWFnaWMgSUQgZm9yIFNuZHRvb2wyLG5lenBsYXkgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA1IGJ5IENhcmwNCjAJc3RyaW5nCVNORFxceDFBCVtmaWQ9MDAwMDAwMDAwLTIxLTAwMDBTTkQ7ZXh0PXNuZDttaW1lPTtdTmludGVuZG8gRW50ZXJ0YWlubWVudCBTeXN0ZW0gYXVkaW8gZmlsZSAoTkVTKQ0KJjQJYnl0ZQkzCSwgdmVyc2lvbiAlMy4wDQo+NQlieXRlCXgJW2Nobj0lZF0NCg0KIyBNYWdpYyBJRCBmb3IgaU5FUyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDUgYnkgQ2FybA0KMAlzdHJpbmcJU05EXFx4MUEJW2ZpZD0wMDAxMDAwOTItMjEtMDAwMFNORDtleHQ9c25kO21pbWU9O11pTkVTIGVtdWxhdG9yIGF1ZGlvIGZpbGUNCiY0CWJ5dGUJMQksIHZlcnNpb24gJTEuMA0KPjUJYnl0ZQl4CVtjaG49JWRdDQoNCiMgTWFnaWMgSUQgZm9yIFNUTUlLIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQoweDE1CXN0cmluZwlTY3JlYW0hCVtmaWQ9MDAwMTAwMDI1LTIxLTAwMDBTVFg7ZXh0PXN0eDttaW1lPTtdU1RNSUsgbW9kdWxlIG11c2ljIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgVGhlIEZpbmFsIE11c2ljc3lzdGVtIGVYdGVuZGVkIChURk1YKSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDcgYnkgQ2FybA0KMAlzdHJpbmcJVEZNWC1TT05HXFwgCVtmaWQ9MDAwMTAwMDk2LTIxLTAwMDBURlg7ZXh0PXRmeCx0Zm14O21pbWU9O11URk1YIHRyYWNrZXIgbW9kdWxlIG11c2ljIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgVWx0cmEgVHJhY2tlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDcgYnkgQ2FybA0KMAlzdHJpbmcJTUFTX1VUcmFja19WMDAJW2ZpZD0wMDAxMDAwOTctMjEtMDAwMFVMVDtleHQ9dWx0O21pbWU9O11VbHRyYSBUcmFja2VyIG1vZHVsZSBtdXNpYyBmaWxlDQo+MTUJc3RyaW5nCXgJW3RpdGxlPSUuMzJzXQ0KDQojIE1hZ2ljIElEIGZvciBBUGxheWVyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlBUFVOXFx4MDEJW2ZpZD0wMDAwMDAwMDAtMjEtMDAwMFVOSTtleHQ9dW5pO21pbWU9O11BUGxheWVyIG1vZHVsZSBtdXNpYyBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIE1pa21vZCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTUgYnkgQ2FybA0KMAlzdHJpbmcJVU4wCVtmaWQ9MDAwMDAwMDAwLTIxLTAwMDBVTkk7ZXh0PXVuaTttaW1lPTtdTWlrbW9kIG1vZHVsZSBtdXNpYyBmaWxlDQo+NAlieXRlCXgJW2Nobj0lZF0NCg0KIyBNYWdpYyBJRCBmb3IgRmFzdHRyYWNrZXIgMi4wIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNSBieSBDYXJsDQowCXN0cmluZwlFeHRlbmRlZFxcIE1vZHVsZTpcXCAJW2ZpZD0wMDAxMDAwMjYtMjEtMDAwMDBYTTtleHQ9eG07bWltZT07XUZhc3RUcmFja2VyIElJIG1vZHVsZSBtdXNpYyBmaWxlDQo+NTkJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjU4CWJ5dGUJeAkuMCVkDQo+MTcJc3RyaW5nCXgJW3RpdGxlPSUuMjBzXQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCUZPUk0JW2ZpZD0wMDAwMDEwMTAtMjItMDAwOFNWWDtleHQ9OHN2eDttaW1lPTtdQW1pZ2EgU2FtcGxlZCBhdWRpbyBmaWxlDQomOAlzdHJpbmcJOFNWWAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlGT1JNCVtmaWQ9MDAwMDAxMDAyLTIyLTAwMEFJRkM7ZXh0PWFpZmMsYWlmO21pbWU9O11BdWRpbyBDb21wcmVzc2VkIEludGVyY2hhbmdlIEZpbGUgRm9ybWF0DQomOAlzdHJpbmcJQUlGQwkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlGT1JNCVtmaWQ9MDAwMDAxMDAyLTIyLTAwMEFJRkY7ZXh0PWFpZmYsYWlmO21pbWU9O11BdWRpbyBJbnRlcmNoYW5nZSBGaWxlIEZvcm1hdA0KJjgJc3RyaW5nCUFJRkYJDQoNCiMgTWFnaWMgSUQgZm9yIE1vbmtleUF1ZGlvIHNvZnR3YXJlIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNS0yMCBieSBDYXJsDQowCXN0cmluZwlNQUNcXCAJW2ZpZD0wMDAxMDAxMjAtMjItMDAwMEFQRTtleHQ9YXBlO21pbWU9O11Nb25rZXlBdWRpbyBjb21wcmVzc2VkIGF1ZGlvIGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwkuc25kCVtmaWQ9MDAwMDAxMDExLTIyLTAwMDAwQVU7ZXh0PWF1LHNuZDttaW1lPTtdU3VuIC8gTmVYdCBzYW1wbGVkIGF1ZGlvIGZpbGUNCj4xNgliZWxvbmcJPjAJW2ZyZXE9JWRdDQoNCiMgTWFnaWMgSUQgZm9yIFNwcGFjayBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMjUyCWJlc2hvcnQJMHg0MEMzCVtmaWQ9MDAwMDAxMDE5LTIyLTAwMDAwMEQ7ZXh0PWQ7bWltZT07XVNwcGFjayBhdWRpbyBzYW1wbGUgZmlsZQ0KJjI1NAliZXNob3J0CTB4RkMwRQkNCg0KIyBNYWdpYyBJRCBmb3IgRmxhYyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDggYnkgQ2FybA0KMAlzdHJpbmcJZkxhQwlbZmlkPTAwMDEwMDA5OC0yMi0wMDBGTEFDO2V4dD1mbGFjO21pbWU9O11GcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjIHJhdyBhdWRpbyBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEZhcmFuZG9sZSBDb21wb3NlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJRlNNXFx4RkUJW2ZpZD0wMDAxMDAwODctMjItMDAwMEZTTTtleHQ9ZnNtO21pbWU9O11GYXJhbmRvbGUgY29tcG9zZXIgYXVkaW8gc2FtcGxlIGZpbGUNCj40CXN0cmluZwl4CVt0aXRsZT0lLjMyc10NCg0KIyBNYWdpYyBJRCBmb3IgTUFVRCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJRk9STQlbZmlkPTAwMDAwMDAwMC0yMi0wMDBNQVVEO2V4dD1tYXVkO21pbWU9O11NQVVEIGF1ZGlvIHNhbXBsZSBmaWxlDQomNAlzdHJpbmcJTUFVRAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNS0wNCBieSBDYXJsDQowCWJlc2hvcnQmMHhGRkUwCTB4ZmZlMAlbZmlkPTAwMDAwMDAwMS0yMi0wMDExMTcyO2V4dD1tcDEsbXAyLG1wMzttaW1lPWF1ZGlvL21wZWc7XU1QMyBBdWRpbyBzdHJlYW0gZmlsZQ0KJloxMjgJc3RyaW5nCVRBRwkNCj5aMTI1CXN0cmluZwl4CVt0aXRsZT0lLjMwc10NCj5aOTUJc3RyaW5nCXgJW2NyZWF0b3I9JS4zMHNdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMDQgYnkgQ2FybA0KMAlzdHJpbmcJSUQzCVtmaWQ9MDAwMDAwMDAxLTIyLTAwMTExNzI7ZXh0PW1wMSxtcDIsbXAzO21pbWU9YXVkaW8vbXBlZztdTVAzIEF1ZGlvIHN0cmVhbSBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJXFwwXFwwMDFcXDI0M1xcMTQ0CVtmaWQ9MDAwMDAxMDE0LTIyLTAwMDAwU0Y7ZXh0PXNmO21pbWU9O11JUkNBTSBhdWRpbyBzYW1wbGUgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCVxcMFxcMDAyXFwyNDNcXDE0NAlbZmlkPTAwMDAwMTAxNC0yMi0wMDAwMFNGO2V4dD1zZjttaW1lPTtdSVJDQU0gYXVkaW8gc2FtcGxlIGZpbGUsIGxpdHRsZS1lbmRpYW4NCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlcXDBcXDAwM1xcMjQzXFwxNDQJW2ZpZD0wMDAwMDEwMTQtMjItMDAwMDBTRjtleHQ9c2Y7bWltZT07XUlSQ0FNIGF1ZGlvIHNhbXBsZSBmaWxlLCBiaWctZW5kaWFuDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJXFwxNDRcXDI0M1xcMDAxXFwwCVtmaWQ9MDAwMDAxMDE0LTIyLTAwMDAwU0Y7ZXh0PXNmO21pbWU9O11JUkNBTSBhdWRpbyBzYW1wbGUgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCVxcMTQ0XFwyNDNcXDAwMlxcMAlbZmlkPTAwMDAwMTAxNC0yMi0wMDAwMFNGO2V4dD1zZjttaW1lPTtdSVJDQU0gYXVkaW8gc2FtcGxlIGZpbGUsIGJpZy1lbmRpYW4NCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlcXDE0NFxcMjQzXFwwMDNcXDAJW2ZpZD0wMDAwMDEwMTQtMjItMDAwMDBTRjtleHQ9c2Y7bWltZT07XUlSQ0FNIGF1ZGlvIHNhbXBsZSBmaWxlLCBsaXR0bGUtZW5kaWFuDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJXFwxNDRcXDI0M1xcMDA0XFwwCVtmaWQ9MDAwMDAxMDE0LTIyLTAwMDAwU0Y7ZXh0PXNmO21pbWU9O11JUkNBTSBhdWRpbyBzYW1wbGUgZmlsZSwgYmlnLWVuZGlhbg0KDQojIE1hZ2ljIElEIGZvciBTY3JlYW10cmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNSBieSBDYXJsDQoweDRDCXN0cmluZwlTQ1JTCVtmaWQ9MDAwMTAwMDI1LTIyLTAwMDBTTVA7ZXh0PXNtcDttaW1lPTtdU2NyZWFtdHJhY2tlciBhdWRpbyBzYW1wbGUNCj4weDMwCXN0cmluZwl4CVt0aXRsZT0lLjMwc10NCg0KIyBNYWdpYyBJRCBmb3IgU291bmRUb29sIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNyBieSBDYXJsDQowCXN0cmluZwlTT1VORFxceDFBCVtmaWQ9MDAwMTAwMDk1LTIyLTAwMDBTTkQ7ZXh0PXNuZDttaW1lPTtdU291bmQgdG9vbCBhdWRpbyBkYXRhIGZpbGUNCj4xNAlsZXNob3J0CXgJW2ZyZXE9JWRdDQoNCiMgTWFnaWMgSUQgZm9yIFNCU3R1ZGlvIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlTTkRcXCAJW2ZpZD0wMDAxMDAwMjAtMjItMDAwMFNPVTtleHQ9c291O21pbWU9O11TQlN0dWRpbyBzYW1wbGVkIGF1ZGlvIGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNS0xOCBieSBDYXJsDQowCXN0cmluZwlTcGVleAlbZmlkPTAwMDAwMDAwMC0yMi0wMFNQRUVYO2V4dD1zcGVleDttaW1lPTtdU3BlZXggTG9zc3kgQXVkaW8gQ29kZWMgcmF3IGF1ZGlvIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgU291bmQgQmxhc3RlciBTREsgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCUNyZWF0aXZlXFwgVm9pY2VcXCBGaWxlXFx4MUEJW2ZpZD0wMDAwMDEwMTMtMjItMDAwMFZPQztleHQ9dm9jO21pbWU9O11DcmVhdGl2ZSBWb2ljZSBhdWRpbyBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMTggYnkgQ2FybA0KMAlzdHJpbmcJdm9yYmlzCVtmaWQ9MDAwMDAwMDAwLTIyLTBWT1JCSVM7ZXh0PXZvcmJpczttaW1lPTtdVm9yYmlzIExvc3N5IEF1ZGlvIENvZGVjIHJhdyBhdWRpbyBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJUklGRglbZmlkPTAwMDAwMTAwMS0yMi0wMDAwV0FWO2V4dD13YXY7bWltZT07XU1pY3Jvc29mdCBXYXZlZm9ybSBBdWRpbyBmaWxlLCBsaXR0bGUtZW5kaWFuDQomOAlzdHJpbmcJV0FWRQkNCj4yNAlsZWxvbmcJPjAJW2ZyZXE9JWRdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJUklGWAlbZmlkPTAwMDAwMTAwMS0yMi0wMDAwV0FWO2V4dD13YXY7bWltZT07XU1pY3Jvc29mdCBXYXZlZm9ybSBBdWRpbyBmaWxlLCBiaWctZW5kaWFuDQomOAlzdHJpbmcJV0FWRQkNCj4yNAliZWxvbmcJPjAJW2ZyZXE9JWRdDQoNCiMgTWFnaWMgSUQgZm9yIE1heWEgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCUZPUjQJW2ZpZD0wMDAwMDEzMTItMzEtMDAwMDAwMDtleHQ9O21pbWU9O11NYXlhIGltYWdlIGZpbGUNCiY4CXN0cmluZwlDSU1HCQ0KDQojIE1hZ2ljIElEIGZvciBNYXlhIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwlGT1I4CVtmaWQ9MDAwMDAxMzEyLTMxLTAwMDAwMDA7ZXh0PTttaW1lPTtdTWF5YSBpbWFnZSBmaWxlDQomOAlzdHJpbmcJQ0lNRwkNCg0KIyBNYWdpYyBJRCBmb3IgQU9MIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMiBieSBDYXJsDQowCXN0cmluZwlKR1xceDA0XFx4MEUJW2ZpZD0wMDAwMDEwMjMtMzEtMDAwMEFSVDtleHQ9YXJ0O21pbWU9O11BT0wvSm9obnNvbi1HcmFjZSBpbWFnZSBmaWxlLCB2ZXJzaW9uIDIuMA0KPjB4MEQJbGVzaG9ydAl4CVtyZXM9JWR4DQo+MHgwRglsZXNob3J0CXgJJWRdDQoNCiMgTWFnaWMgSUQgZm9yIEJNRiBpbWFnZSBjb21wcmVzc29yIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yNyBieSBDYXJsDQowCXN0cmluZwlcXHg4MVxceDhBMAlbZmlkPTAwMDEwMDA0OC0zMS0wMDAwQk1GO2V4dD1ibWY7bWltZT07XUJNRiBpbWFnZSBmaWxlDQo+MglzdHJpbmcJeAksIHZlcnNpb24gJS4xcw0KPjMJc3RyaW5nCXgJLiUuMXMNCg0KIyBNYWdpYyBJRCBmb3IgQk1GIGltYWdlIGNvbXByZXNzb3IgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTI3IGJ5IENhcmwNCjAJc3RyaW5nCVxceDgxXFx4OEEyCVtmaWQ9MDAwMTAwMDQ4LTMxLTAwMDBCTUY7ZXh0PWJtZjttaW1lPTtdQk1GIGltYWdlIGZpbGUNCj4yCXN0cmluZwl4CSwgdmVyc2lvbiAlLjFzDQo+MwlzdHJpbmcJeAkuJS4xcw0KDQojIE1hZ2ljIElEIGZvciBCTUYgaW1hZ2UgY29tcHJlc3NvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjcgYnkgQ2FybA0KMAlzdHJpbmcJXFx4ODFcXHg4QTEJW2ZpZD0wMDAxMDAwNDgtMzEtMDAwMEJNRjtleHQ9Ym1mO21pbWU9O11CTUYgaW1hZ2UgZmlsZQ0KPjIJc3RyaW5nCXgJLCB2ZXJzaW9uICUuMXMNCj4zCXN0cmluZwl4CS4lLjFzDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJQk0JW2ZpZD0wMDAwMDEwMDEtMzEtMDAwMEJNUDtleHQ9Ym1wO21pbWU9O11XaW5kb3dzIG9yIE9TLzIgQml0bWFwIGltYWdlIGZpbGUNCiY2CWxlbG9uZwkwCQ0KDQojIE1hZ2ljIElEIGZvciBBdXRvZGVzayBBbmltYXRvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDggYnkgQ2FybA0KMAlsZXNob3J0CTB4OTExOQlbZmlkPTAwMDAwMTI1NC0zMS0wMDAwQ0VMO2V4dD1jZWwscGljO21pbWU9O11BdXRvZGVzayBhbmltYXRvciBpbWFnZSBmaWxlDQomMTAJYnl0ZQk4CQ0KJjExCWJ5dGUJMAkNCj4yCWxlc2hvcnQJeAlbcmVzPSVkDQo+NAlsZXNob3J0CXgJeCVkeDhicHBdDQoNCiMgTWFnaWMgSUQgZm9yIEFuZHJldyBVc2VyIEludGVyZmFjZSBTeXN0ZW0gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAyIGJ5IENhcmwNCjEJc3RyaW5nCWJlZ2luZGF0YXtyYXN0ZXIJW2ZpZD0wMDAwMDEzMTUtMzEtMDAwMENNVTtleHQ9Y211O21pbWU9O11BbmRyZXcgdG9vbGtpdCByYXN0ZXIgaW1hZ2UgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBBbml2Z2EgdG9vbGtpdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDIgYnkgQ2FybA0KMzgJc3RyaW5nCUtSXFx4MDFcXHgwMAlbZmlkPTAwMDEwMDEwNC0zMS0wMDAwQ09EO2V4dD1jb2Q7bWltZT07XUFuaXZnYSBzcHJpdGUgaW1hZ2UgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBXaW5kb3dzIEN1cnNvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDBcXHgwMFxceDAyXFx4MDAJW2ZpZD0wMDAwMDEwMDEtMzEtMDAwMENVUjtleHQ9Y3VyO21pbWU9O11NaWNyb3NvZnQgd2luZG93cyBjdXJzb3IgaW1hZ2UgZmlsZQ0KJjB4MDgJYnl0ZQkwCQ0KPjQJbGVzaG9ydAl4CSwgJWQgY3Vyc29yKHMpDQo+NglieXRlCXgJW3Jlcz0lZHgNCj43CWJ5dGUJeAklZHg4YnBwXQ0KDQojIE1hZ2ljIElEIGZvciBXaW5kb3dzIEN1cnNvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDBcXHgwMFxceDAyXFx4MDAJW2ZpZD0wMDAwMDEwMDEtMzEtMDAwMENVUjtleHQ9Y3VyO21pbWU9O11NaWNyb3NvZnQgd2luZG93cyBjdXJzb3IgaW1hZ2UgZmlsZQ0KJjB4MDgJYnl0ZQkxNgkNCj40CWxlc2hvcnQJeAksICVkIGN1cnNvcihzKQ0KPjYJYnl0ZQl4CVtyZXM9JWR4DQo+NwlieXRlCXgJJWR4NGJwcF0NCg0KIyBNYWdpYyBJRCBmb3IgV2luZG93cyBDdXJzb3IgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAxIGJ5IENhcmwNCjAJc3RyaW5nCVxceDAwXFx4MDBcXHgwMlxceDAwCVtmaWQ9MDAwMDAxMDAxLTMxLTAwMDBDVVI7ZXh0PWN1cjttaW1lPTtdTWljcm9zb2Z0IHdpbmRvd3MgY3Vyc29yIGltYWdlIGZpbGUNCiYweDA4CWJ5dGUJMgkNCj40CWxlc2hvcnQJeAksICVkIGN1cnNvcihzKQ0KPjYJYnl0ZQl4CVtyZXM9JWR4DQo+NwlieXRlCXgJJWR4MWJwcF0NCg0KIyBNYWdpYyBJRCBmb3IgV2luZG93cyBDdXJzb3IgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAxIGJ5IENhcmwNCjAJc3RyaW5nCVxceDAwXFx4MDBcXHgwMlxceDAwCVtmaWQ9MDAwMDAxMDAxLTMxLTAwMDBDVVI7ZXh0PWN1cjttaW1lPTtdTWljcm9zb2Z0IHdpbmRvd3MgY3Vyc29yIGltYWdlIGZpbGUNCiYweDA4CWJ5dGUJMzIJDQo+NAlsZXNob3J0CXgJLCAlZCBjdXJzb3IocykNCj42CWJ5dGUJeAlbcmVzPSVkeA0KPjcJYnl0ZQl4CSVkeDVicHBdDQoNCiMgTWFnaWMgSUQgZm9yIFdpbmRvd3MgQ3Vyc29yIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMSBieSBDYXJsDQowCXN0cmluZwlcXHgwMFxceDAwXFx4MDJcXHgwMAlbZmlkPTAwMDAwMTAwMS0zMS0wMDAwQ1VSO2V4dD1jdXI7bWltZT07XU1pY3Jvc29mdCB3aW5kb3dzIGN1cnNvciBpbWFnZSBmaWxlDQomMHgwOAlieXRlCTY0CQ0KPjQJbGVzaG9ydAl4CSwgJWQgY3Vyc29yKHMpDQo+NglieXRlCXgJW3Jlcz0lZHgNCj43CWJ5dGUJeAklZHg2YnBwXQ0KDQojIE1hZ2ljIElEIGZvciBXaW5kb3dzIEN1cnNvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDBcXHgwMFxceDAyXFx4MDAJW2ZpZD0wMDAwMDEwMDEtMzEtMDAwMENVUjtleHQ9Y3VyO21pbWU9O11NaWNyb3NvZnQgd2luZG93cyBjdXJzb3IgaW1hZ2UgZmlsZQ0KJjB4MDgJYnl0ZQk4CQ0KPjQJbGVzaG9ydAl4CSwgJWQgY3Vyc29yKHMpDQo+NglieXRlCXgJW3Jlcz0lZHgNCj43CWJ5dGUJeAklZHgzYnBwXQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEzIGJ5IENhcmwNCjEyOAlzdHJpbmcJRElDTQlbZmlkPTAwMDAwMDAwNC0zMS0wMDBESUNNO2V4dD1kaWNtLGRjbTttaW1lPTtdRGlnaXRhbCBpbWFnaW5nIGFuZCBjb21tdW5pY2F0aW9uIGluIG1lZGVjaW5lIGltZy4NCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMSBieSBDYXJsDQowCXN0cmluZwlTRFBYCVtmaWQ9MDAwMDAxMzA5LTMxLTAwMDBEUFg7ZXh0PWRweDttaW1lPTtdRGlnaXRhbCBNb3ZpbmctUGljdHVyZSBFeGNoYW5nZSBpbWFnZSBmaWxlDQo+MTYwCXN0cmluZwk+XFx4MDAJW2NyZWF0b3I9JS4xMDBzXQ0KPjI2MAlzdHJpbmcJPlxceDAwCVt0aXRsZT0lLjIwMHNdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDEgYnkgQ2FybA0KMAlzdHJpbmcJWFBEUwlbZmlkPTAwMDAwMTMwOS0zMS0wMDAwRFBYO2V4dD1kcHg7bWltZT07XURpZ2l0YWwgTW92aW5nLVBpY3R1cmUgRXhjaGFuZ2UgaW1hZ2UgZmlsZQ0KPjE2MAlzdHJpbmcJPlxceDAwCVtjcmVhdG9yPSUuMTAwc10NCj4yNjAJc3RyaW5nCT5cXHgwMAlbdGl0bGU9JS4yMDBzXQ0KDQojIE1hZ2ljIElEIGZvciBMaWdodHdhdmUgM0QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCUZPUk0JW2ZpZD0wMDAwMDEyNTEtMzEtMDAwRlBCTTtleHQ9ZnBibTttaW1lPTtdRmxleGlibGUgUHJlY2lzaW9uIEJ1ZmZlciBNYXAgaW1hZ2UgZmlsZQ0KJjgJc3RyaW5nCUZQQk0JDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJR0lGOAlbZmlkPTAwMDAwMTI3NC0zMS0wMDAwR0lGO2V4dD1naWY7bWltZT1pbWFnZS9naWY7XUdJRiBpbWFnZSBmaWxlDQomMTAJYnl0ZSYweDcwCSEweDcwCQ0KPjQJc3RyaW5nCXgJLCB2ZXJzaW9uIDglLjJzDQo+NglsZXNob3J0CT4wCVtyZXM9JWR4DQo+OAlsZXNob3J0CT4wCSVkXQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCUdJRjgJW2ZpZD0wMDAwMDEyNzQtMzEtMDAwMEdJRjtleHQ9Z2lmO21pbWU9aW1hZ2UvZ2lmO11HSUYgaW1hZ2UgZmlsZQ0KJjEwCWJ5dGUmMHg3MAkweDcwCQ0KPjQJc3RyaW5nCXgJLCB2ZXJzaW9uIDglLjJzDQo+NglsZXNob3J0CT4wCVtyZXM9JWR4DQo+OAlsZXNob3J0CT4wCSVkeDhicHBdDQoNCiMgTWFnaWMgSUQgZm9yIFdpbmRvd3MgSWNvbiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDBcXHgwMFxceDAxXFx4MDAJW2ZpZD0wMDAwMDEwMDEtMzEtMDAwMElDTztleHQ9aWNvO21pbWU9aW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uO11NaWNyb3NvZnQgd2luZG93cyBJY29uIGltYWdlIGZpbGUNCiYweDA4CWJ5dGUJMAkNCj40CWxlc2hvcnQJeAksICVkIGljb24ocykNCj42CWJ5dGUJeAlbcmVzPSVkeA0KPjcJYnl0ZQl4CSVkeDhicHBdDQoNCiMgTWFnaWMgSUQgZm9yIFdpbmRvd3MgSWNvbiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDBcXHgwMFxceDAxXFx4MDAJW2ZpZD0wMDAwMDEwMDEtMzEtMDAwMElDTztleHQ9aWNvO21pbWU9aW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uO11NaWNyb3NvZnQgd2luZG93cyBJY29uIGltYWdlIGZpbGUNCiYweDA4CWJ5dGUJMTYJDQo+NAlsZXNob3J0CXgJLCAlZCBpY29uKHMpDQo+NglieXRlCXgJW3Jlcz0lZHgNCj43CWJ5dGUJeAklZHg0YnBwXQ0KDQojIE1hZ2ljIElEIGZvciBXaW5kb3dzIEljb24gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAxIGJ5IENhcmwNCjAJc3RyaW5nCVxceDAwXFx4MDBcXHgwMVxceDAwCVtmaWQ9MDAwMDAxMDAxLTMxLTAwMDBJQ087ZXh0PWljbzttaW1lPWltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbjtdTWljcm9zb2Z0IHdpbmRvd3MgSWNvbiBpbWFnZSBmaWxlDQomMHgwOAlieXRlCTIJDQo+NAlsZXNob3J0CXgJLCAlZCBpY29uKHMpDQo+NglieXRlCXgJW3Jlcz0lZHgNCj43CWJ5dGUJeAklZHgxYnBwXQ0KDQojIE1hZ2ljIElEIGZvciBXaW5kb3dzIEljb24gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAxIGJ5IENhcmwNCjAJc3RyaW5nCVxceDAwXFx4MDBcXHgwMVxceDAwCVtmaWQ9MDAwMDAxMDAxLTMxLTAwMDBJQ087ZXh0PWljbzttaW1lPWltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbjtdTWljcm9zb2Z0IHdpbmRvd3MgSWNvbiBpbWFnZSBmaWxlDQomMHgwOAlieXRlCTMyCQ0KPjQJbGVzaG9ydAl4CSwgJWQgaWNvbihzKQ0KPjYJYnl0ZQl4CVtyZXM9JWR4DQo+NwlieXRlCXgJJWR4NWJwcF0NCg0KIyBNYWdpYyBJRCBmb3IgV2luZG93cyBJY29uIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMSBieSBDYXJsDQowCXN0cmluZwlcXHgwMFxceDAwXFx4MDFcXHgwMAlbZmlkPTAwMDAwMTAwMS0zMS0wMDAwSUNPO2V4dD1pY287bWltZT1pbWFnZS92bmQubWljcm9zb2Z0Lmljb247XU1pY3Jvc29mdCB3aW5kb3dzIEljb24gaW1hZ2UgZmlsZQ0KJjB4MDgJYnl0ZQk2NAkNCj40CWxlc2hvcnQJeAksICVkIGljb24ocykNCj42CWJ5dGUJeAlbcmVzPSVkeA0KPjcJYnl0ZQl4CSVkeDZicHBdDQoNCiMgTWFnaWMgSUQgZm9yIFdpbmRvd3MgSWNvbiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDBcXHgwMFxceDAxXFx4MDAJW2ZpZD0wMDAwMDEwMDEtMzEtMDAwMElDTztleHQ9aWNvO21pbWU9aW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uO11NaWNyb3NvZnQgd2luZG93cyBJY29uIGltYWdlIGZpbGUNCiYweDA4CWJ5dGUJOAkNCj40CWxlc2hvcnQJeAksICVkIGljb24ocykNCj42CWJ5dGUJeAlbcmVzPSVkeA0KPjcJYnl0ZQl4CSVkeDNicHBdDQoNCiMgTWFnaWMgSUQgZm9yIFN1bk9TIEljb24gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAyIGJ5IENhcmwNCjAJc3RyaW5nCS8qXFwgRm9ybWF0X3ZlcnNpb249MSxcXCAJW2ZpZD0wMDAwMDEwMTEtMzEtMDAwSUNPTjtleHQ9aWNvbjttaW1lPTtdU3VuT1MgaWNvbiBpbWFnZSBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAliZXNob3J0CTB4MDEJW2ZpZD0wMDAwMDEyNzMtMzEtMDAwMElNRztleHQ9aW1nO21pbWU9O11HRU0gQml0IEltYWdlDQomMgliZXNob3J0CTB4MDgJDQo+MTIJYmVzaG9ydAk+MAlbcmVzPSVkeA0KPjE0CWJlc2hvcnQJPjAJJWQNCj40CWJlc2hvcnQJPjAJeCVkYnBwXQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAyIGJ5IENhcmwNCjAJc3RyaW5nCVxceDhiSk5HXFx4MGRcXHgwYVxceDFhXFx4MGEJW2ZpZD0wMDAwMDAwMDAtMzEtMDAwMEpORztleHQ9am5nO21pbWU9O11KUEVHIE5ldHdvcmsgZ3JhcGhpY3MgaW1hZ2UgZmlsZQ0KJjEyCXN0cmluZwlKSERSCQ0KPjE2CWJlbG9uZwl4CVtyZXM9JWQNCj4yMAliZWxvbmcJeAl4JWRdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTMgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDBcXHgwMFxceDAwXFx4MGNqUFxceDIwXFx4MjAJW2ZpZD0wMDAwMDAwMDEtMzEtMDAxNTQ0NDtleHQ9anAyO21pbWU9aW1hZ2UvanAyO11KUEVHIDIwMDAgaW1hZ2UgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEzIGJ5IENhcmwNCjAJc3RyaW5nCVxceGZmXFx4NGZcXHhmZlxceDUxCVtmaWQ9MDAwMDAwMDAxLTMxLTAwMTU0NDQ7ZXh0PWpwYzttaW1lPTtdSlBFRyAyMDAwIGNvZGUgc3RyZWFtIGltYWdlIGZpbGUNCiZaMgliZXNob3J0CTB4RkZEOQkNCj44CWJlbG9uZwl4CVtyZXM9JWR4DQo+MTIJYmVsb25nCXgJJWRdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAliZWxvbmcJMHhmZmQ4ZmZlMAlbZmlkPTAwMDAwMTMwNS0zMS0wMDBKUEVHO2V4dD1qcGVnLGpwZzttaW1lPWltYWdlL2pwZWc7XUpvaW50IFBob3RvZ3JhcGhpYyBFeHBlcnRzIEdyb3VwIEpGSUYgaW1hZ2UgZmlsZQ0KJjYJc3RyaW5nCUpGSUZcXHgwMAkNCj4xMQlieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTIJYnl0ZQl4CS4wJWQNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMyBieSBDYXJsDQowCXN0cmluZwlcXHhmZlxceGQ4XFx4ZmZcXHhlMQlbZmlkPTAwMDAwMDAwNS0zMS0wMDBKUEVHO2V4dD1qcGcsanBlZzttaW1lPWltYWdlL2pwZWc7XURpZ2l0YWwgc3RpbGwgY2FtZXJhIGltYWdlIGZpbGUNCiY2CXN0cmluZwlFeGlmCQ0KDQojIE1hZ2ljIElEIGZvciBEZWx1eGUgUGFpbnQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTMxIGJ5IENhcmwNCjAJc3RyaW5nCUZPUk0JW2ZpZD0wMDAwMDEwMTAtMzEtMDAwMExCTTtleHQ9bGJtO21pbWU9O11JbnRlcmxlYXZlZCBiaXRtYXAgaW1hZ2UgZmlsZQ0KJjgJc3RyaW5nCUlMQk0JDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTMgYnkgQ2FybA0KMAlzdHJpbmcJVGhpc1xcIGlzXFwgYVxcIEJpdE1hcFxcIGZpbGUJW2ZpZD0wMDAwMDAwMDAtMzEtMDAwTElTUDtleHQ9bGlzcDttaW1lPTtdTGlzcCBtYWNoaW5lIGZvcm1hdCBpbWFnZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIE1pY3JvZGVzaWduMiwgTWljcm9kZXNpZ24zIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMiBieSBDYXJsDQowCXN0cmluZwkuTURBCVtmaWQ9MDAwMDAxMzE2LTMxLTAwMDBNREE7ZXh0PW1kYTttaW1lPTtdTWljcm9kZXNpZ24gQXJlYSBpbWFnZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIE1pY3JvZGVzaWduMiwgTWljcm9kZXNpZ24zIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMiBieSBDYXJsDQowCXN0cmluZwkuTURQCVtmaWQ9MDAwMDAxMzE2LTMxLTAwMDBNRFA7ZXh0PW1kcDttaW1lPTtdTWljcm9kZXNpZ24gcGFnZSBpbWFnZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEltYWdlbWFnaWNrIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMSBieSBDYXJsDQowCXN0cmluZwlpZD1JbWFnZU1hZ2ljawlbZmlkPTAwMDEwMDEwMS0zMS0wMDBNSUZGO2V4dD1taWZmLG1pZjttaW1lPTtdSW1hZ2VtYWdpY2sgaW1hZ2UgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBOZXRwYm0gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAyIGJ5IENhcmwNCjAJc3RyaW5nCU1SRjEJW2ZpZD0wMDAxMDAxMDUtMzEtMDAwME1SRjtleHQ9bXJmO21pbWU9O11Nb25vY2hyb21lIHJlY3Vyc2l2ZSBmb3JtYXQgaW1hZ2UgZmlsZQ0KPjQJYmVsb25nCXgJW3Jlcz0lZHgNCj44CWJlbG9uZwl4CSVkeDFicHBdDQoNCiMgTWFnaWMgSUQgZm9yIE1pY3Jvc29mdCBQYWludCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDIgYnkgQ2FybA0KMAlsZXNob3J0CTB4NjE0NAlbZmlkPTAwMDAwMTAwMS0zMS0wMDAwTVNQO2V4dD1tc3A7bWltZT07XU1pY3Jvc29mdCBwYWludCBpbWFnZSBmaWxlLCB2ZXJzaW9uIDEuMA0KJjIJbGVzaG9ydAkweDRkNmUJDQo+NAlsZXNob3J0CXgJW3Jlcz0lZHgNCj42CWxlc2hvcnQJeAklZHgxYnBwXQ0KDQojIE1hZ2ljIElEIGZvciBNaWNyb3NvZnQgUGFpbnQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAyIGJ5IENhcmwNCjAJbGVzaG9ydAkweDY5NGMJW2ZpZD0wMDAwMDEwMDEtMzEtMDAwME1TUDtleHQ9bXNwO21pbWU9O11NaWNyb3NvZnQgcGFpbnQgaW1hZ2UgZmlsZSwgdmVyc2lvbiAyLjANCiYyCWxlc2hvcnQJMHg1MzZlCQ0KPjQJbGVzaG9ydAl4CVtyZXM9JWR4DQo+NglsZXNob3J0CXgJJWR4MWJwcF0NCg0KIyBNYWdpYyBJRCBmb3IgTmV0cGJtIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0zMSBieSBDYXJsDQowCXN0cmluZwlQN1xceDBBCVtmaWQ9MDAwMTAwMTAwLTMxLTAwMDBQQU07ZXh0PXBhbTttaW1lPTtdUG9ydGFibGUgYXJiaXRyYXJ5IG1hcCBpbWFnZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIE5ldHBibSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAlzdHJpbmcJUDEJW2ZpZD0wMDAxMDAxMDAtMzEtMDAwMFBCTTtleHQ9cGJtO21pbWU9O11Qb3J0YWJsZSBiaXRtYXAgaW1hZ2UgZmlsZSwgYXNjaWkNCg0KIyBNYWdpYyBJRCBmb3IgTmV0cGJtIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0zMSBieSBDYXJsDQowCXN0cmluZwlQNAlbZmlkPTAwMDEwMDEwMC0zMS0wMDAwUEJNO2V4dD1wYm07bWltZT07XVBvcnRhYmxlIGJpdG1hcCBpbWFnZSBmaWxlLCBiaW5hcnkNCg0KIyBNYWdpYyBJRCBmb3IgUEMtUGFpbnRicnVzaCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAliZXNob3J0CTB4MEEwMAlbZmlkPTAwMDAwMTI1Ny0zMS0wMDAwUENYO2V4dD1wY3g7bWltZT07XVBDLVBhaW50YnJ1c2ggaW1hZ2UgZmlsZSwgdmVyc2lvbiAyLjUNCiYyCWJ5dGUJMQkNCg0KIyBNYWdpYyBJRCBmb3IgUEMtUGFpbnRicnVzaCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAliZXNob3J0CTB4MEEwMglbZmlkPTAwMDAwMTI1Ny0zMS0wMDAwUENYO2V4dD1wY3g7bWltZT07XVBDLVBhaW50YnJ1c2ggaW1hZ2UgZmlsZSwgdmVyc2lvbiAyLjgNCiYyCWJ5dGUJMQkNCg0KIyBNYWdpYyBJRCBmb3IgUEMtUGFpbnRicnVzaCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAliZXNob3J0CTB4MEEwMwlbZmlkPTAwMDAwMTI1Ny0zMS0wMDAwUENYO2V4dD1wY3g7bWltZT07XVBDLVBhaW50YnJ1c2ggaW1hZ2UgZmlsZSwgdmVyc2lvbiAyLjgNCiYyCWJ5dGUJMQkNCg0KIyBNYWdpYyBJRCBmb3IgUEMtUGFpbnRicnVzaCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAliZXNob3J0CTB4MEEwNAlbZmlkPTAwMDAwMTI1Ny0zMS0wMDAwUENYO2V4dD1wY3g7bWltZT07XVBDLVBhaW50YnJ1c2ggZm9yIHdpbmRvd3MgaW1hZ2UgZmlsZQ0KJjIJYnl0ZQkxCQ0KDQojIE1hZ2ljIElEIGZvciBQQy1QYWludGJydXNoIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0zMSBieSBDYXJsDQowCWJlc2hvcnQJMHgwQTA1CVtmaWQ9MDAwMDAxMjU3LTMxLTAwMDBQQ1g7ZXh0PXBjeDttaW1lPTtdUEMtUGFpbnRicnVzaCBpbWFnZSBmaWxlLCB2ZXJzaW9uIDMuMA0KJjIJYnl0ZQkxCQ0KDQojIE1hZ2ljIElEIGZvciBOZXRwYm0gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTMxIGJ5IENhcmwNCjAJc3RyaW5nCVAyCVtmaWQ9MDAwMTAwMTAwLTMxLTAwMDBQR007ZXh0PXBnbTttaW1lPTtdUG9ydGFibGUgZ3JheSBtYXAgaW1hZ2UgZmlsZSwgYXNjaWkNCg0KIyBNYWdpYyBJRCBmb3IgTmV0cGJtIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0zMSBieSBDYXJsDQowCXN0cmluZwlQNQlbZmlkPTAwMDEwMDEwMC0zMS0wMDAwUEdNO2V4dD1wZ207bWltZT07XVBvcnRhYmxlIGdyYXkgbWFwIGltYWdlIGZpbGUsIGJpbmFyeQ0KDQojIE1hZ2ljIElEIGZvciBQQyBQYWludCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDggYnkgQ2FybA0KMAlsZXNob3J0CTB4MTIzNAlbZmlkPTAwMDAwMTMxOC0zMS0wMDAwUElDO2V4dD1waWM7bWltZT07XVBpY3RvciBQQyBQYWludCBpbWFnZSBmaWxlDQomMTEJYnl0ZQkweEZGCQ0KJjEwCWJ5dGUJMHgwMgkNCj4yCWxlc2hvcnQJeAlbcmVzPSVkDQo+NAlsZXNob3J0CXgJeCVkXQ0KDQojIE1hZ2ljIElEIGZvciBQQyBQYWludCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDggYnkgQ2FybA0KMAlsZXNob3J0CTB4MTIzNAlbZmlkPTAwMDAwMTMxOC0zMS0wMDAwUElDO2V4dD1waWM7bWltZT07XVBpY3RvciBQQyBQYWludCBpbWFnZSBmaWxlDQomMTEJYnl0ZQkweEZGCQ0KJjEwCWJ5dGUJMHgwOAkNCj4yCWxlc2hvcnQJeAlbcmVzPSVkDQo+NAlsZXNob3J0CXgJeCVkXQ0KDQojIE1hZ2ljIElEIGZvciBQQyBQYWludCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDggYnkgQ2FybA0KMAlsZXNob3J0CTB4MTIzNAlbZmlkPTAwMDAwMTMxOC0zMS0wMDAwUElDO2V4dD1waWM7bWltZT07XVBpY3RvciBQQyBQYWludCBpbWFnZSBmaWxlDQomMTEJYnl0ZQkweEZGCQ0KJjEwCWJ5dGUJMHgzMQkNCj4yCWxlc2hvcnQJeAlbcmVzPSVkDQo+NAlsZXNob3J0CXgJeCVkXQ0KDQojIE1hZ2ljIElEIGZvciBTb2Z0aW1hZ2UgM0QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTA4IGJ5IENhcmwNCjAJYmVsb25nCTB4NTM4MGY2MzQJW2ZpZD0wMDAwMDEzMjEtMzEtMDAwMFBJQztleHQ9cGljO21pbWU9O11Tb2Z0aW1hZ2UgM0QgaW1hZ2UgZmlsZQ0KJjg4CXN0cmluZwlQSUNUCQ0KPjgJc3RyaW5nCT5cXHgwMAlbdGl0bGU9JS44MHNdDQo+OTIJYmVzaG9ydAl4CVtyZXM9JWQNCj45NAliZXNob3J0CXgJeCVkXQ0KDQojIE1hZ2ljIElEIGZvciBCaW8tcmFkIG1pY3Jvc2NvcGUgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTA4IGJ5IENhcmwNCjU0CWxlc2hvcnQJMTIzNDUJW2ZpZD0wMDAwMDEzMjItMzEtMDAwMFBJQztleHQ9cGljO21pbWU9O11CaW8tcmFkIGNvbmZvY2FsIG1pY3Jvc2NvcGUgaW1hZ2UgZmlsZQ0KJjE2CWxlc2hvcnQJMAkNCj4wCWxlc2hvcnQJPjAJW3Jlcz0lZA0KPjIJbGVzaG9ydAk+MAl4JWRdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDYgYnkgQ2FybA0KMAlzdHJpbmcJXFx4ODlQTkdcXHgwZFxceDBhXFx4MWFcXHgwYQlbZmlkPTAwMDAwMDAwMS0zMS0wMDE1OTQ4O2V4dD1wbmc7bWltZT1pbWFnZS9wbmc7XVBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpYyBmaWxlDQomMTIJc3RyaW5nCUlIRFIJDQo+MTYJYmVsb25nCT4wCVtyZXM9JWQNCj4yMAliZWxvbmcJPjAJeCVkDQo+MjQJYnl0ZQl4CXglZGJwcF0NCg0KIyBNYWdpYyBJRCBmb3IgTmV0cGJtIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0zMSBieSBDYXJsDQowCXN0cmluZwlQMwlbZmlkPTAwMDEwMDEwMC0zMS0wMDAwUFBNO2V4dD1wcG07bWltZT07XVBvcnRhYmxlIHBpeGVsIG1hcCBpbWFnZSBmaWxlLCBhc2NpaQ0KDQojIE1hZ2ljIElEIGZvciBOZXRwYm0gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTMxIGJ5IENhcmwNCjAJc3RyaW5nCVA2CVtmaWQ9MDAwMTAwMTAwLTMxLTAwMDBQUE07ZXh0PXBwbTttaW1lPTtdUG9ydGFibGUgcGl4ZWwgbWFwIGltYWdlIGZpbGUsIGJpbmFyeQ0KDQojIE1hZ2ljIElEIGZvciBQaG90b3Nob3AgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAxIGJ5IENhcmwNCjAJc3RyaW5nCThCUFNcXHgwMFxceDAxCVtmaWQ9MDAwMDAxMDAzLTMxLTAwMDBQU0Q7ZXh0PXBzZDttaW1lPTtdQWRvYmUgUGhvdG9zaG9wIGltYWdlIGZpbGUNCj4xOAliZWxvbmcJPjAJW3Jlcz0lZHgNCj4xNAliZWxvbmcJPjAJJWRdDQoNCiMgTWFnaWMgSUQgZm9yIFBhaW50IHNob3AgcHJvIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMSBieSBDYXJsDQowCXN0cmluZwlQYWludCBTaG9wIFBybyBJbWFnZSBGaWxlXFx4MGFcXHgxYQlbZmlkPTAwMDAwMTMxMC0zMS0wMDAwUFNQO2V4dD1wc3A7bWltZT07XVBhaW50c2hvcCBwcm8gaW1hZ2UgZmlsZQ0KPjUwCWxlbG9uZwk+MAlbcmVzPSVkeA0KPjU0CWxlbG9uZwk+MAklZA0KPjY5CWxlc2hvcnQJPjAJeCVkYnBwXQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJYmVsb25nCTB4NTlhNjZhOTUJW2ZpZD0wMDAwMDEwMTEtMzEtMDAwMFJBUztleHQ9cmFzO21pbWU9O11TdW4gcmFzdGVyIGltYWdlDQo+NAliZWxvbmcJPjAJW3Jlcz0lZHgNCj44CWJlbG9uZwk+MAklZA0KPjEyCWJlbG9uZwk+MAl4JWRicHBdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAlzdHJpbmcJXFwweDAxXFx4REEJW2ZpZD0wMDAwMDEwMDQtMzEtMDAwMFJHQjtleHQ9cmdiO21pbWU9O11TR0kgSW1hZ2UgZmlsZQ0KPjI0CXN0cmluZwk+XFx4MDAJW3RpdGxlPSUuODBzXQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTMxIGJ5IENhcmwNCjAJc3RyaW5nCVxceDAxXFx4REFcXHgwMFxceDAxCVtmaWQ9MDAwMDAxMDA0LTMxLTAwMDBSR0I7ZXh0PXJnYjttaW1lPTtdU0dJIEltYWdlIGZpbGUNCiYxMAliZXNob3J0CTEJDQo+NgliZXNob3J0CXgJW3Jlcz0lZHgNCj44CWJlc2hvcnQJeAklZHg4YnBwXQ0KPjI0CXN0cmluZwk+XFx4MAlbdGl0bGU9JS44MHNdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDFcXHhEQVxceDAwXFx4MDEJW2ZpZD0wMDAwMDEwMDQtMzEtMDAwMFJHQjtleHQ9cmdiO21pbWU9O11TR0kgSW1hZ2UgZmlsZQ0KJjEwCWJlc2hvcnQJMwkNCj42CWJlc2hvcnQJeAlbcmVzPSVkeA0KPjgJYmVzaG9ydAl4CSVkeDI0YnBwXQ0KPjI0CXN0cmluZwk+XFx4MAlbdGl0bGU9JS44MHNdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDFcXHhEQVxceDAwXFx4MDEJW2ZpZD0wMDAwMDEwMDQtMzEtMDAwMFJHQjtleHQ9cmdiO21pbWU9O11TR0kgSW1hZ2UgZmlsZQ0KJjEwCWJlc2hvcnQJNAkNCj42CWJlc2hvcnQJeAlbcmVzPSVkeA0KPjgJYmVzaG9ydAl4CSVkeDI0YnBwXQ0KPjI0CXN0cmluZwk+XFx4MAlbdGl0bGU9JS44MHNdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMzEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDFcXHhEQVxceDAxXFx4MDEJW2ZpZD0wMDAwMDEwMDQtMzEtMDAwMFJHQjtleHQ9cmdiO21pbWU9O11TR0kgSW1hZ2UgZmlsZSwgY29tcHJlc3NlZA0KJjEwCWJlc2hvcnQJMQkNCj42CWJlc2hvcnQJeAlbcmVzPSVkeA0KPjgJYmVzaG9ydAl4CSVkeDhicHBdDQo+MjQJc3RyaW5nCT5cXHgwCVt0aXRsZT0lLjgwc10NCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0zMSBieSBDYXJsDQowCXN0cmluZwlcXHgwMVxceERBXFx4MDFcXHgwMQlbZmlkPTAwMDAwMTAwNC0zMS0wMDAwUkdCO2V4dD1yZ2I7bWltZT07XVNHSSBJbWFnZSBmaWxlLCBjb21wcmVzc2VkDQomMTAJYmVzaG9ydAkzCQ0KPjYJYmVzaG9ydAl4CVtyZXM9JWR4DQo+OAliZXNob3J0CXgJJWR4MjRicHBdDQo+MjQJc3RyaW5nCT5cXHgwCVt0aXRsZT0lLjgwc10NCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0zMSBieSBDYXJsDQowCXN0cmluZwlcXHgwMVxceERBXFx4MDFcXHgwMQlbZmlkPTAwMDAwMTAwNC0zMS0wMDAwUkdCO2V4dD1yZ2I7bWltZT07XVNHSSBJbWFnZSBmaWxlLCBjb21wcmVzc2VkDQomMTAJYmVzaG9ydAk0CQ0KPjYJYmVzaG9ydAl4CVtyZXM9JWR4DQo+OAliZXNob3J0CXgJJWR4MjRicHBdDQo+MjQJc3RyaW5nCT5cXHgwCVt0aXRsZT0lLjgwc10NCg0KIyBNYWdpYyBJRCBmb3IgVHVyYm8gU2lsdmVyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMyBieSBDYXJsDQowCXN0cmluZwlGT1JNCVtmaWQ9MDAwMDAxMjUyLTMxLTAwMFJHQjg7ZXh0PXJnYjgscmdiO21pbWU9O11UdXJibyBTaWx2ZXIgMjQtYml0IFJHQiBpbWFnZSBmaWxlDQomOAlzdHJpbmcJUkdCOAkNCg0KIyBNYWdpYyBJRCBmb3IgVHVyYm8gU2lsdmVyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMyBieSBDYXJsDQowCXN0cmluZwlGT1JNCVtmaWQ9MDAwMDAxMjUyLTMxLTAwMFJHQk47ZXh0PXJnYm4scmdiO21pbWU9O11UdXJibyBTaWx2ZXIgMTItYml0IFJHQiBpbWFnZSBmaWxlDQomOAlzdHJpbmcJUkdCTgkNCg0KIyBNYWdpYyBJRCBmb3IgQ29sb1JJWCBWR0EgUGFpbnQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTA4IGJ5IENhcmwNCjAJc3RyaW5nCVJJWDMJW2ZpZD0wMDAwMDEzMjAtMzEtMDAwMFNDWjtleHQ9c2N6O21pbWU9O11Db2xvclJJWCBWR0EgUGFpbnQgaW1hZ2UgZmlsZQ0KPjQJbGVzaG9ydAl4CVtyZXM9JWQNCj42CWxlc2hvcnQJeAl4JWRdDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTMgYnkgQnJ5YW4gSGVuZGVyc29uDQowCXN0cmluZwlcXDExN1xcMDcyCVtmaWQ9MDAwMDAwMDAwLTMxLTAwMDBTSVI7ZXh0PXNpcjttaW1lPTtdU29saXRhaXJlIGltYWdlIHJlY29yZGVyIGltYWdlIGZpbGUsIE1HSSB0eXBlIDExDQomNAlzdHJpbmcJXFwwMTMJDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTMgYnkgQnJ5YW4gSGVuZGVyc29uDQowCXN0cmluZwlcXDExN1xcMDcyCVtmaWQ9MDAwMDAwMDAwLTMxLTAwMDBTSVI7ZXh0PXNpcjttaW1lPTtdU29saXRhaXJlIGltYWdlIHJlY29yZGVyIGltYWdlIGZpbGUsIE1HSSB0eXBlIDE3DQomNAlzdHJpbmcJXFwwMjEJDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDEgYnkgQ2FybA0KWjE4CXN0cmluZwlUUlVFVklTSU9OLVhGSUxFCVtmaWQ9MDAwMDAxMzA2LTMxLTAwMDBUR0E7ZXh0PXRnYTttaW1lPTtdVHJ1ZXZpc2lvbiBUYXJnYSBpbWFnZSBmaWxlDQo+MTIJbGVzaG9ydAl4CVtyZXM9JWR4DQo+MTQJbGVzaG9ydAl4CSVkDQo+MTYJYnl0ZQl4CXglZGJwcF0NCg0KIyBNYWdpYyBJRCBmb3IgR3JhcGhpY3MgV29ya3Nob3AgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAxIGJ5IENhcmwNCjAJc3RyaW5nCVRITkwJW2ZpZD0wMDAwMDEyNTgtMzEtMDAwMFRITjtleHQ9dGhuO21pbWU9O11HcmFwaGljcyB3b3Jrc2hvcCB0aHVtYm5haWwgaW1hZ2UgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTMxIGJ5IENhcmwNCjAJc3RyaW5nCUlJCVtmaWQ9MDAwMDAxMDAzLTMxLTAwMDBUSUY7ZXh0PXRpZix0aWZmLGRuZzttaW1lPWltYWdlL3RpZmY7XVRhZ2dlZCBpbWFnZSBmaWxlIGZvcm1hdCBpbWFnZSBmaWxlLCBsaXR0bGUtZW5kaWFuDQomMglsZXNob3J0CTQyCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTMxIGJ5IENhcmwNCjAJc3RyaW5nCU1NCVtmaWQ9MDAwMDAxMDAzLTMxLTAwMDBUSUY7ZXh0PXRpZix0aWZmLGRuZzttaW1lPWltYWdlL3RpZmY7XVRhZ2dlZCBpbWFnZSBmaWxlIGZvcm1hdCBpbWFnZSBmaWxlLCBiaWctZW5kaWFuDQomMglsZXNob3J0CQkNCg0KIyBNYWdpYyBJRCBmb3IgVklDQVIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAxIGJ5IENhcmwNCjAJc3RyaW5nCUxCTFNJWkU9CVtmaWQ9MDAwMDAxMDIyLTMxLTAwMDBWSUM7ZXh0PXZpYyx2aWNhcjttaW1lPTtdVmljYXIgaW1hZ2UgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBLaG9yb3MgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAxIGJ5IENhcmwNCjAJc3RyaW5nCVxceEFCXFx4MDFcXHgwMVxceDAzCVtmaWQ9MDAwMDAxMzA4LTMxLTAwMDBWSUY7ZXh0PXZpZix2aWZmO21pbWU9O11LaG9yb3MgVmlzdWFsaXphdGlvbi9JbWFnZSBGaWxlIEZvcm1hdCwgdmVyc2lvbiAxLjMNCiY0CWJ5dGUJMgkNCj41MjAJYmVsb25nCT4wCVtyZXM9JWR4DQo+NTI0CWJlbG9uZwk+MAklZF0NCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMiBieSBDYXJsDQowCXN0cmluZwlGSUFTQ08JW2ZpZD0wMDAxMDAxMDctMzEtMDAwMFdGQTtleHQ9d2ZhO21pbWU9O11GcmFjdGFsIEltYWdlIEFuZCBTZXF1ZW5jZSBDb2RlYyBpbWFnZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFgtV2luZG93cyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDEgYnkgQ2FybA0KMAlzdHJpbmcJLyogWFBNICovCVtmaWQ9MDAwMDAxMDIwLTMxLTAwMDBYUE07ZXh0PXhwbTttaW1lPTtdWC1XaW5kb3dzIHBpeGVsIG1hcCBpbWFnZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFhWIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wMSBieSBDYXJsDQowCXN0cmluZwlQN1xcIDMzMglbZmlkPTAwMDEwMDEwMy0zMS0wMDAwMFhWO2V4dD14djttaW1lPTtdWFYgVGh1bWJuYWlsIGltYWdlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgWFdpbmRvd3MgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAyIGJ5IENhcmwNCjAJYmVsb25nCTB4NDAJW2ZpZD0wMDAwMDEwMjAtMzEtMDAwMFhXRDtleHQ9eHdkO21pbWU9O11YMTAgWFdpbmRvd3MgZHVtcCBpbWFnZSBmaWxlDQomNAliZWxvbmcJMHgwNgkNCj4yNAliZWxvbmcJeAlbcmVzPSVkDQo+MjgJYmVsb25nCXgJeCVkXQ0KDQojIE1hZ2ljIElEIGZvciBYV2luZG93cyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDIgYnkgQ2FybA0KMAlsZWxvbmcJMHg0MAlbZmlkPTAwMDAwMTAyMC0zMS0wMDAwWFdEO2V4dD14d2Q7bWltZT07XVgxMCBYV2luZG93cyBkdW1wIGltYWdlIGZpbGUNCiY0CWxlbG9uZwkweDA2CQ0KPjI0CWxlbG9uZwl4CVtyZXM9JWQNCj4yOAlsZWxvbmcJeAl4JWRdDQoNCiMgTWFnaWMgSUQgZm9yIFByb3ZlY3RvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDggYnkgQ2FybA0KMAlzdHJpbmcJRk9STQlbZmlkPTAwMDAwMTMxOS0zMi0wMDBEUjJEO2V4dD1kcjJkO21pbWU9O11Qcm92ZWN0b3IgMkQgaW1hZ2UgZmlsZQ0KJjgJc3RyaW5nCURSMkQJDQoNCiMgTWFnaWMgSUQgZm9yIFhGaWcsIFdpbkZpZywgakZpZyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJI0ZJRwlbZmlkPTAwMDEwMDAxMS0zMi0wMDAwRklHO2V4dD1maWc7bWltZT07XUZhY2lsaXR5IGZvciBJbnRlcmFjdGl2ZSBHZW5lcmF0aW9uIGZpbGUNCj41CXN0cmluZwl4CSwgdmVyc2lvbiAlLjFzLg0KPjcJc3RyaW5nCXgJJS4xcw0KDQojIE1hZ2ljIElEIGZvciBMb3R1cyAxLTItMyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMDIgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDFcXHgwMFxceDAwXFx4MDBcXHgwMVxceDAwXFx4MDhcXHgwMFxceDQ0CVtmaWQ9MDAwMDAxMDA5LTMyLTAwMDBQSUM7ZXh0PXBpYzttaW1lPTtdTG90dXMgMS0yLTMgaW1hZ2UgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBBdXRvY2FkIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwlBdXRvQ0FEIFNsaWRlCVtmaWQ9MDAwMDAxMjU0LTMyLTAwMDBTTEQ7ZXh0PXNsZDttaW1lPTtdQXV0b2NhZCBzbGlkZSBpbWFnZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlcXHhmZldQQwlbZmlkPTAwMDAwMTAwOC0zMi0wMDAwV1BHO2V4dD13cGc7bWltZT07XVdvcmRwZXJmZWN0IEdyYXBoaWNzIHZlY3RvcnMNCiY4CWJ5dGUJMQkNCiY5CWJ5dGUJMHgxNgkNCj4xMAlieXRlCXgJLCB2ZXJzaW9uICVkLg0KPjExCWJ5dGUJeAklZA0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCUZPUk0JW2ZpZD0wMDAxMDAwMTktMzMtMDAwQU1GRjtleHQ9YW1mZjttaW1lPTtdQW1pZ2EgbWV0YWZpbGUNCiY4CXN0cmluZwlBTUZGCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJbGVsb25nCTB4OUFDNkNERDcJW2ZpZD0wMDAwMDEwMDMtMzMtMDAwMEFQTTtleHQ9YXBtO21pbWU9O11BbGR1cyBwbGFjZWFibGUgV2luZG93cyBtZXRhZmlsZQ0KJjQJbGVzaG9ydAkwCQ0KDQojIE1hZ2ljIElEIGZvciBDb3JlbERSQVcgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCVJJRkYJW2ZpZD0wMDAwMDEwMDgtMzMtMDAwMENEUjtleHQ9Y2RyO21pbWU9O11Db3JlbGRyYXcgIGxpdHRsZS1lbmRpYW4gbWV0YWZpbGUNCiY4CXN0cmluZwlDRFIJDQoNCiMgTWFnaWMgSUQgZm9yIENvcmVsRFJBVyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJUklGWAlbZmlkPTAwMDAwMTAwOC0zMy0wMDAwQ0RSO2V4dD1jZHI7bWltZT07XUNvcmVsZHJhdyAgYmlnLWVuZGlhbiBtZXRhZmlsZQ0KJjgJc3RyaW5nCUNEUgkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wOCBieSBDYXJsDQowCWJlc2hvcnQmMHhGRjIwCTB4MDAyMAlbZmlkPTAwMDAwMDAwMS0zMy0wMDA4NjMyO2V4dD1jZ207bWltZT1pbWFnZS9jZ207XUNvbXB1dGVyIGdyYXBoaWNzIG1ldGFmaWxlLCBiaW5hcnkgZW5jb2RlZA0KJloweDAyCWJlc2hvcnQmMHhGRjQwCTB4MDA0MAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0wOCBieSBDYXJsDQowCXN0cmluZwlCRUdNRglbZmlkPTAwMDAwMDAwMS0zMy0wMDA4NjMyO2V4dD1jZ207bWltZT1pbWFnZS9jZ207XUNvbXB1dGVyIGdyYXBoaWNzIG1ldGFmaWxlLCBhc2NpaSBlbmNvZGVkDQoNCiMgTWFnaWMgSUQgZm9yIENvcmVsRFJBVyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJUklGRglbZmlkPTAwMDAwMTAwOC0zMy0wMDAwQ01YO2V4dD1jbXg7bWltZT07XUNvcmVsIGxpdHRsZS1lbmRpYW4gbWV0YWZpbGUNCiY4CXN0cmluZwlDTVgxCQ0KDQojIE1hZ2ljIElEIGZvciBDb3JlbERSQVcgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCVJJRlgJW2ZpZD0wMDAwMDEwMDgtMzMtMDAwMENNWDtleHQ9Y214O21pbWU9O11Db3JlbCBiaWctZW5kaWFuIG1ldGFmaWxlDQomOAlzdHJpbmcJQ01YMQkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCWxlbG9uZwkweDAwMDAwMDAxCVtmaWQ9MDAwMDAxMDAxLTMzLTAwMDBFTUY7ZXh0PWVtZjttaW1lPTtdTWljcm9zb2Z0IFdpbmRvd3MgRW5oYW5jZWQgbWV0YWZpbGUNCiY0MAlsZWxvbmcJMHg0NjRENDUyMAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwklIVBTLUFkb2JlLTIuMFxcIEVQU0YtMS4yCVtmaWQ9MDAwMDAxMDAzLTMzLTAwMEVQU0Y7ZXh0PWVwc2Y7bWltZT1hcHBsaWNhdGlvbi9wb3N0c2NyaXB0O11BZG9iZSBFbmNhcHN1bGF0ZWQgUG9zdHNjcmlwdCBMZXZlbCAyLCB2ZXJzaW9uIDEuMg0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCSUhUFMtQWRvYmUtMi4wXFwgRVBTRi0yLjAJW2ZpZD0wMDAwMDEwMDMtMzMtMDAwRVBTRjtleHQ9ZXBzZjttaW1lPWFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQ7XUFkb2JlIEVuY2Fwc3VsYXRlZCBQb3N0c2NyaXB0IExldmVsIDIsIHZlcnNpb24gMi4wDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJJSFQUy1BZG9iZS0zLjBcXCBFUFNGLTMuMAlbZmlkPTAwMDAwMTAwMy0zMy0wMDBFUFNGO2V4dD1lcHNmO21pbWU9YXBwbGljYXRpb24vcG9zdHNjcmlwdDtdQWRvYmUgRW5jYXBzdWxhdGVkIFBvc3RzY3JpcHQgTGV2ZWwgMywgdmVyc2lvbiAzLjANCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlcXHhDNVxceEQwXFx4RDNcXHhDNglbZmlkPTAwMDAwMTAwMy0zMy0wMDBFUFNGO2V4dD1lcHNmLGFpO21pbWU9YXBwbGljYXRpb24vcG9zdHNjcmlwdDtdQWRvYmUgRW5jYXBzdWxhdGVkIFBvc3RzY3JpcHQsIHZlcnNpb24gMy4wLCBiaW5hcnkNCg0KIyBNYWdpYyBJRCBmb3IgR0VNIFBhaW50IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0zMSBieSBDYXJsDQowCWJlc2hvcnQJMHhGRkZGCVtmaWQ9MDAwMDAxMjczLTMzLTAwMDBHRU07ZXh0PWdlbTttaW1lPTtdR2VtRE9TIE1vdG9yb2xhIE1ldGFmaWxlLCB2ZXJzaW9uIDEuMDENCiY0CWJlc2hvcnQJMTAxCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IGh0dHA6Ly93d3cuc2Vhc2lwLmluZm8vR2VtL2ZmX2dlbS5odG1sDQowCWxlc2hvcnQJMHhGRkZGCVtmaWQ9MDAwMDAxMjczLTMzLTAwMDBHRU07ZXh0PWdlbTttaW1lPTtdR2VtRE9TIE1ldGFmaWxlDQomNAlsZXNob3J0CTAJDQoNCiMgTWFnaWMgSUQgZm9yIEFydGxpbmUgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IGh0dHA6Ly93d3cuc2Vhc2lwLmluZm8vR2VtL2ZmX2dlbS5odG1sDQowCWxlc2hvcnQJMHhGRkZGCVtmaWQ9MDAwMDAxMjczLTMzLTAwMDBHRU07ZXh0PWdlbTttaW1lPTtdR2VtRE9TIEludGVsIE1ldGFmaWxlLCB2ZXJzaW9uIDQuMDANCiY0CWxlc2hvcnQJNDAwCQ0KDQojIE1hZ2ljIElEIGZvciBEZXNrcHJlc3MgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IGh0dHA6Ly93d3cuc2Vhc2lwLmluZm8vR2VtL2ZmX2dlbS5odG1sDQowCWxlc2hvcnQJMHhGRkZGCVtmaWQ9MDAwMDAxMjczLTMzLTAwMDBHRU07ZXh0PWdlbTttaW1lPTtdR2VtRE9TIEludGVsIE1ldGFmaWxlLCB2ZXJzaW9uIDMuMTANCiY0CWxlc2hvcnQJMzEwCQ0KDQojIE1hZ2ljIElEIGZvciBHRU0gUGFpbnQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IGh0dHA6Ly93d3cuc2Vhc2lwLmluZm8vR2VtL2ZmX2dlbS5odG1sDQowCWxlc2hvcnQJMHhGRkZGCVtmaWQ9MDAwMDAxMjczLTMzLTAwMDBHRU07ZXh0PWdlbTttaW1lPTtdR2VtRE9TIEludGVsIE1ldGFmaWxlLCB2ZXJzaW9uIDEuMDENCiY0CWxlc2hvcnQJMTAxCQ0KDQojIE1hZ2ljIElEIGZvciBRdWlja2RyYXcgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTAxIGJ5IENhcmwNCjB4MjBBCWJlbG9uZwkweDAwMTEwMkZGCVtmaWQ9MDAwMDAxMDAyLTMzLTAwMDBQQ1Q7ZXh0PXBjdDttaW1lPTtdTWFjaW50b3NoIFF1aWNrZHJhdyBtZXRhZmlsZSBcJ1BJQ1RcJywgdmVyc2lvbiAyLjANCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCWxlc2hvcnQJMHgwMDAxCVtmaWQ9MDAwMDAxMDAxLTMzLTAwMDBXTUY7ZXh0PXdtZjttaW1lPTtdTWljcm9zb2Z0IFdpbmRvd3MgbWV0YWZpbGUNCiYyCWxlc2hvcnQJOQkNCg0KIyBNYWdpYyBJRCBmb3IgQ2luZW1hIDREIFZlcnNpb24gNS54IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wNiBieSBDYXJsDQowCXN0cmluZwlNQzUwCVtmaWQ9MDAwMDAxMjU1LTQwLTAwMDAwMDA7ZXh0PTttaW1lPTtdTWF4b24gQ2luZW1hIDREIHZlcnNpb24gNSAzRCBkYXRhDQoNCiMgTWFnaWMgSUQgZm9yIFF1aWNrZHJhdyAzRCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDYgYnkgQ2FybA0KMAlzdHJpbmcJM0RNRglbZmlkPTAwMDAwMTAwMi00MC0wMDAzRE1GO2V4dD0zZG1mO21pbWU9O11BcHBsZSBRdWlja2RyYXcgM0QgbWV0YWZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgUmhpbm8gM2QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCTNEIEdlb21ldHJ5IEZpbGUgRm9ybWF0CVtmaWQ9MDAwMDAxMzMwLTQwLTAwMDNETUY7ZXh0PTNkbWY7bWltZT07XVJoaW5vM2QgLyBPcGVuTnVyYnMgM2QgbW9kZWwNCg0KIyBNYWdpYyBJRCBmb3IgUXVpY2tkcmF3IDNEIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMSBieSBDYXJsDQowCXN0cmluZwkzRE1ldGFmaWxlCVtmaWQ9MDAwMDAxMDAyLTQwLTAwMDNETUY7ZXh0PTNkbWYsYTNkO21pbWU9O11BcHBsZSBRdWlja2RyYXcgM0QgbWV0YWZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQUMzZCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTIgYnkgQ2FybA0KMAlzdHJpbmcJQUMzRAlbZmlkPTAwMDAwMDAwMC00MC0wMDAwMEFDO2V4dD1hYzttaW1lPTtdQWMzZCAzZCBtb2RlbA0KDQojIE1hZ2ljIElEIGZvciAzZFN0dWRpbyBNYXggZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCSozRFNNQVhfQVNDSUlFWFBPUlQJW2ZpZD0wMDAwMDEzMjYtNDAtMDAwMEFTRTtleHQ9YXNlO21pbWU9O10zZCBzdHVkaW8gbWF4IGFzY2lpIGV4cG9ydCAzRCBtb2RlbA0KDQojIE1hZ2ljIElEIGZvciBDYWxpZ2FyaSBUcnVlc3BhY2UgTW9kZWxlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDYgYnkgQ2FybA0KMAlzdHJpbmcJQ2FsaWdhcmlcXCBWCVtmaWQ9MDAwMDAxMjU2LTQwLTAwMDBDT0I7ZXh0PWNvYixzY247bWltZT07XUNhbGlnYXJpIFRydWVzcGFjZTIgM0QgbW9kZWwNCg0KIyBNYWdpYyBJRCBmb3IgVGFjaHlvbiBwYXJhbGxlbCByYXl0cmFjZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCUJFR0lOX1NDRU5FCVtmaWQ9MDAwMTAwMTE2LTQwLTAwMDBEQVQ7ZXh0PWRhdDttaW1lPTtdVGFjaHlvbiByYXktdHJhY2VyIDNkIG1vZGVsDQoNCiMgTWFnaWMgSUQgZm9yIEF1dG9jYWQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCUFDMTAJW2ZpZD0wMDAwMDEyNTQtNDAtMDAwMERXRztleHQ9ZHdnO21pbWU9aW1hZ2Uvdm5kLmR3ZztdQXV0b2NhZCBkcmF3aW5nIGZvcm1hdCAzZCBtb2RlbA0KDQojIE1hZ2ljIElEIGZvciBBdXRvY2FkIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwlBdXRvQ0FEIEJpbmFyeSBEWEYJW2ZpZD0wMDAwMDEyNTQtNDAtMDAwMERYRjtleHQ9ZHhmO21pbWU9aW1hZ2Uvdm5kLmR4ZjtdQXV0b2NhZCBkcmF3aW5nIGludGVyY2hhbmdlIDNkIG1vZGVsLCBiaW5hcnkNCg0KIyBNYWdpYyBJRCBmb3IgTXVsdGlnZW4gY3JlYXRvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTIgYnkgQ2FybA0KMAliZXNob3J0CTEJW2ZpZD0wMDAwMDEzMzItNDAtMDAwMEZMVDtleHQ9Zmx0O21pbWU9O11PcGVuZmxpZ2h0IHNjZW5lIGRlc2NyaXB0aW9uIDNkIG1vZGVsDQomNAlzdHJpbmcJZGIJDQoNCiMgTWFnaWMgSUQgZm9yIFZpZGVvc2NhcGUgM0QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCUdPVVIJW2ZpZD0wMDAwMDEzMjgtNDAtMDAwMEdFTztleHQ9Z2VvO21pbWU9O11WaWRlb3NjYXBlIDNkIG1vZGVsIHdpdGggY29sb3JlZCB2ZXJ0aWNlcw0KDQojIE1hZ2ljIElEIGZvciBWaWRlb3NjYXBlIDNELCBCbGVuZGVyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwkzREcxCVtmaWQ9MDAwMDAxMzI4LTQwLTAwMDBHRU87ZXh0PWdlbzttaW1lPTtdVmlkZW9zY2FwZSAzZCBtb2RlbCB3aXRoIGNvbG9yZWQgZmFjZXMNCg0KIyBNYWdpYyBJRCBmb3IgVmlkZW9zY2FwZSAzRCwgQmxlbmRlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTIgYnkgQ2FybA0KMAlzdHJpbmcJM0RHMglbZmlkPTAwMDAwMTMyOC00MC0wMDAwR0VPO2V4dD1nZW87bWltZT07XVZpZGVvc2NhcGUgM2QgbW9kZWwgbGlnaHQgc291cmNlDQoNCiMgTWFnaWMgSUQgZm9yIFZpZGVvc2NhcGUgM0QsIEJsZW5kZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCTNERzMJW2ZpZD0wMDAwMDEzMjgtNDAtMDAwMEdFTztleHQ9Z2VvO21pbWU9O11WaWRlb3NjYXBlIDNkIG1vZGVsIHdpdGggZ291cmF1ZCBjdXJ2ZXMNCg0KIyBNYWdpYyBJRCBmb3IgU29mdGltYWdlIDREIENyZWF0aXZlIGVudmlyb25tZW50IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwlIUkNIOglbZmlkPTAwMDAwMTMyMS00MC0wMDAwSFJDO2V4dD1ocmM7bWltZT07XVNvZnRpbWFnZSA0ZCBtb2RlbCwgYXNjaWkgZW5jb2RlZA0KDQojIE1hZ2ljIElEIGZvciBPcGVuIEludmVudG9yIFRvb2xraXQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA2IGJ5IENhcmwNCjAJc3RyaW5nCSNJbnZlbnRvcglbZmlkPTAwMDAwMTAwNC00MC0wMDAwMElWO2V4dD1pdjttaW1lPTtdT3BlbiBJbnZlbnRvciAzZCBtb2RlbA0KPjExCXN0cmluZwl4CSwgdmVyc2lvbiAlLjFzLg0KPjEzCXN0cmluZwl4CSUuMXMNCj4xNQlzdHJpbmcJYmluYXJ5CSwgYmluYXJ5IGVuY29kZWQNCj4xNQlzdHJpbmcJYXNjaWkJLCBhc2NpaSBlbmNvZGVkDQoNCiMgTWFnaWMgSUQgZm9yIEdlb212aWV3IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwlMSVNUCVtmaWQ9MDAwMTAwMTE4LTQwLTAwMExJU1Q7ZXh0PWxpc3Q7bWltZT07XUdlb212aWV3IGxpc3Qgb2YgM0QgbW9kZWxzIGFuZCBvYmplY3RzDQoNCiMgTWFnaWMgSUQgZm9yIExpZ2h0d2F2ZSAzRCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTIgYnkgQ2FybA0KMAlzdHJpbmcJRk9STQlbZmlkPTAwMDAwMTI1MS00MC0wMDAwTFdPO2V4dD1sd28sbHdvYjttaW1lPTtdTGlnaHR3YXZlIDNEIG9iamVjdA0KJjgJc3RyaW5nCUxXTzIJDQoNCiMgTWFnaWMgSUQgZm9yIExpZ2h0d2F2ZSAzRCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDYgYnkgQ2FybA0KMAlzdHJpbmcJRk9STQlbZmlkPTAwMDAwMTI1MS00MC0wMDAwTFdPO2V4dD1sd29iLGx3bzttaW1lPTtdTGlnaHR3YXZlIDNEIG9iamVjdA0KJjgJc3RyaW5nCUxXT0IJDQoNCiMgTWFnaWMgSUQgZm9yIExpZ2h0d2F2ZSAzRCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDYgYnkgQ2FybA0KMAlzdHJpbmcJTFdTQwlbZmlkPTAwMDAwMTI1MS00MC0wMDAwTFdTO2V4dD1sd3NjLGx3czttaW1lPTtdTGlnaHR3YXZlIDNEIHNjZW5lDQoNCiMgTWFnaWMgSUQgZm9yIE1heWEgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCS8vTWF5YQlbZmlkPTAwMDAwMTMxMi00MC0wMDAwME1BO2V4dD1tYTttaW1lPTtdTWF5YSAzZCBtb2RlbCwgYXNjaWkgZW5jb2RlZA0KDQojIE1hZ2ljIElEIGZvciBDaW5lbWEgNEQgVmVyc2lvbiA0LnggYW5kIGVhcmxpZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA2IGJ5IENhcmwNCjAJc3RyaW5nCUZPUk0JW2ZpZD0wMDAwMDEyNTUtNDAtMDAwTUM0RDtleHQ9bWM0ZDttaW1lPTtdTWF4b24gQ2luZW1hIDREIHY0LnggM0QgZGF0YQ0KJjgJc3RyaW5nCU1DNEQJDQoNCiMgTWFnaWMgSUQgZm9yIEdlb212aWV3IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwlDTUVTSAlbZmlkPTAwMDEwMDExOC00MC0wMDBNRVNIO2V4dD1tZXNoO21pbWU9O11HZW9tdmlldyBwb2x5Z29uDQoNCiMgTWFnaWMgSUQgZm9yIEdlb212aWV3IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwlNRVNICVtmaWQ9MDAwMTAwMTE4LTQwLTAwME1FU0g7ZXh0PW1lc2g7bWltZT07XUdlb212aWV3IHBvbHlnb24NCg0KIyBNYWdpYyBJRCBmb3IgTWlsc2hhcGUgM2QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCU1TM0QwMDAwMDAJW2ZpZD0wMDAxMDAxMTctNDAtMDAwTVMzRDtleHQ9bXMzZDttaW1lPTtdTWlsa3NoYXBlIDNkIG1vZGVsLCBiaW5hcnkgZW5jb2RlZA0KDQojIE1hZ2ljIElEIGZvciBXb3JsZHRvb2xraXQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA2IGJ5IENhcmwNCjAJc3RyaW5nCW5mZglbZmlkPTAwMDAwMTI1My00MC0wMDAwTkZGO2V4dD1uZmY7bWltZT07XVNlbnNlOCBXb3JsZHRvb2xraXQgM0Qgb2JqZWN0DQoNCiMgTWFnaWMgSUQgZm9yIEF1dG9kZXNrIEFuaW1hdG9yIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQoyCWxlbG9uZwkweDAwMDAJW2ZpZD0wMDAwMDEyNTQtNDAtMDAwMFBMWTtleHQ9cGx5O21pbWU9O11BdXRvZGVzayBhbmltYXRvciBwb2x5Z29uIGZpbGUNCiY2CWJ5dGUJMAkNCiY3CWJ5dGUJMHg5OQkNCg0KIyBNYWdpYyBJRCBmb3IgQXV0b2Rlc2sgQW5pbWF0b3IgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjIJbGVsb25nCTB4MDAwMAlbZmlkPTAwMDAwMTI1NC00MC0wMDAwUExZO2V4dD1wbHk7bWltZT07XUF1dG9kZXNrIGFuaW1hdG9yIHBvbHlnb24gZmlsZQ0KJjYJYnl0ZQkxCQ0KJjcJYnl0ZQkweDk5CQ0KDQojIE1hZ2ljIElEIGZvciBRdWljazNkIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwlxdWljazNEbwlbZmlkPTAwMDAwMTMzNC00MC0wMDAwUTNPO2V4dD1xM287bWltZT07XVF1aWNrM2QgM0Qgb2JqZWN0DQoNCiMgTWFnaWMgSUQgZm9yIFF1aWNrM2QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCXF1aWNrM0RzCVtmaWQ9MDAwMDAxMzM0LTQwLTAwMDBRM1M7ZXh0PXEzczttaW1lPTtdUXVpY2szZCAzRCBzY2VuZQ0KDQojIE1hZ2ljIElEIGZvciBSZW5kZXJtYW4gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCSMjUmVuZGVyTWFuXFwgUklCLVN0cnVjdHVyZQlbZmlkPTAwMDAwMTMyMy00MC0wMDAwUklCO2V4dD1yaWI7bWltZT07XVJlbmRlcm1hbiBieXRlc3RyZWFtIDNEIG1vZGVsDQoNCiMgTWFnaWMgSUQgZm9yIFNjdWxwdCAzZCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMTIgYnkgQ2FybA0KMAlzdHJpbmcJRk9STQlbZmlkPTAwMDAwMDAwMC00MC0wMFNDRU5FO2V4dD1zY2VuZTttaW1lPTtdU2N1bHB0IDNkIHNjZW5lIG1vZGVsDQomOAlzdHJpbmcJU0MzRAkNCg0KIyBNYWdpYyBJRCBmb3IgSW1hZ2luZSAzRCBTdHVkaW8sIFR1cmJvIFNpbHZlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDYgYnkgQ2FybA0KMAlzdHJpbmcJRk9STQlbZmlkPTAwMDAwMTI1Mi00MC0wMDBUREREO2V4dD10ZGRkLG9iajttaW1lPTtdSW1hZ2luZSAzRCBvYmplY3QNCiY4CXN0cmluZwlURERECQ0KDQojIE1hZ2ljIElEIGZvciBNYWNyb21lZGlhIERpcmVjdG9yIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwlJRlgJW2ZpZD0wMDAwMDEyNTktNDAtMDAwMFczRDtleHQ9dzNkO21pbWU9O11TaG9ja3dhdmUgM0QgbW9kZWwNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wNiBieSBDYXJsDQowCXN0cmluZwkjVlJNTAlbZmlkPTAwMDAwMDAwMS00MC0wMDE0NzcyO2V4dD13cmw7bWltZT1tb2RlbC92cm1sO11WaXJ0dWFsIFJlYWxpdHkgbW9kZWxpbmcgbGFuZ3VhZ2UNCj43CXN0cmluZwl4CSwgdmVyc2lvbiAlLjFzLg0KPjkJc3RyaW5nCXgJJS4xcw0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTEyIGJ5IENhcmwNCjAJc3RyaW5nCTxXT1JMRD4JW2ZpZD0wMDAwMDAwMDAtNDAtMDAwMFhHTDtleHQ9eGdsO21pbWU9O11YR0wgM2QgbW9kZWwNCg0KIyBNYWdpYyBJRCBmb3IgRGlyZWN0M0QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA0LTExIGJ5IENhcmwNCjAJc3RyaW5nCXhvZlxcIAlbZmlkPTAwMDAwMTAwMS00MC0wMDAwWElFO2V4dD14aWU7bWltZT07XU1pY3Jvc29mdCBkaXJlY3QzZCAzRCBtb2RlbA0KDQojIE1hZ2ljIElEIGZvciBTb2Z0aW1hZ2UgWFNJIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMiBieSBDYXJsDQowCXN0cmluZwl4c2lcXCAJW2ZpZD0wMDAwMDEzMjEtNDAtMDAwMFhTSTtleHQ9eHNpO21pbWU9O11Tb2Z0aW1hZ2UgM2QgbW9kZWwNCg0KIyBNYWdpYyBJRCBmb3IgS2Fib29tIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlcXHhBOE1QXFx4QTgJW2ZpZD0wMDAwMDAwMDAtNTAtMDAwMDAwMDtleHQ9O21pbWU9O11LYm9vbSBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQ1RXIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNCBieSBDYXJsDQowCWxlc2hvcnQJMTIJW2ZpZD0wMDAxMDAwNzctNTAtMDAwMDAwMDtleHQ9O21pbWU9O11Db250ZXh0IHRyZWUgd2VpZ2hpbmcgKENUVykgYXJjaGl2ZSBmaWxlDQomMglsZXNob3J0CTAJDQoNCiMgTWFnaWMgSUQgZm9yIE1pY3Jvc29mdCBDb21wcmVzcyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJU1pERFxceDg4XFx4RjBcXHgyN1xceDMzCVtmaWQ9MDAwMDAxMDAxLTUwLTAwMDAwMDA7ZXh0PTttaW1lPTtdTWljcm9zb2Z0IExaU1MgY29tcHJlc3NlZCBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEFBWCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTggYnkgQ2FybA0KMAlzdHJpbmcJXFx4NDBcXHhGRVxceDAwXFx4MDAJW2ZpZD0wMDAwMDEyODEtNTAtMDAwMEFBWDtleHQ9YWF4O21pbWU9O11BQVggYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEFCQ29tcCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTggYnkgQ2FybA0KMAlzdHJpbmcJXFx4MDNBQjIJW2ZpZD0wMDAwMDEyODItNTAtMDAwMEFCUDtleHQ9YWJwO21pbWU9O11BQkNvbXAgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEFjZSAvIFdpbkFjZSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KNwlzdHJpbmcJKipBQ0UqKglbZmlkPTAwMDAwMTI2NS01MC0wMDAwQUNFO2V4dD1hY2U7bWltZT07XUFjZSAvIFdpbkFDRSBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQWkgQXJjaGl2ZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE4IGJ5IENhcmwNCjAJc3RyaW5nCUFpCVtmaWQ9MDAwMDAwMDAwLTUwLTAwMDAwQUk7ZXh0PWFpO21pbWU9O11BaSBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQWt0IGFyY2hpdmVyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xOCBieSBDYXJsDQowCXN0cmluZwlBS1RcXHgwQQlbZmlkPTAwMDAwMDAwMC01MC0wMDAwQUtUO2V4dD1ha3Q7bWltZT07XUFLVCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQU1HIEFyY2hpdmVyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xOCBieSBDYXJsDQowCXN0cmluZwlcXHhBRFxceDM2CVtmaWQ9MDAwMDAxMjg0LTUwLTAwMDBBTUc7ZXh0PWFtZzttaW1lPTtdQU1HIGFyY2hpdmUgZmlsZQ0KPjIJYnl0ZQl4CSwgdmVyc2lvbiAlYmguDQo+MglieXRlCXgJJWJsDQomMwlieXRlCTAJDQoNCiMgTWFnaWMgSUQgZm9yIGFyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNCBieSBDYXJsDQowCXN0cmluZwlcXHgyMTxhcmNoPlxceDBBCVtmaWQ9MDAwMDAwMDAzLTUwLTAwMDAwQVI7ZXh0PWFyO21pbWU9O11VTklYIGFyY2hpdmUgZmlsZSAoYXIpDQoNCiMgTWFnaWMgSUQgZm9yIEFSNyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTggYnkgQ2FybA0KMAlzdHJpbmcJLEFSNyBlLW1haWxhYmxlIGFyY2hpdmU6CVtmaWQ9MDAwMTAwMDM2LTUwLTAwMDBBUjc7ZXh0PWFyNzttaW1lPTtdQVI3IGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBTcXVhc2ggZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE4IGJ5IENhcmwNCjMJc3RyaW5nCU9jdFNxdQlbZmlkPTAwMDEwMDAzOC01MC0wMDAwQVJIO2V4dD1hcmg7bWltZT07XVNxdWFzaCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQXJqIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xOCBieSBDYXJsDQowCXN0cmluZwlcXHg2MFxceEVBCVtmaWQ9MDAwMDAxMjg1LTUwLTAwMDBBUko7ZXh0PWFyajttaW1lPTtdQVJKIGFyY2hpdmUgZmlsZQ0KJjEwCWJ5dGUJMgkNCg0KIyBNYWdpYyBJRCBmb3IgQVNEIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xOCBieSBDYXJsDQowCXN0cmluZwlBU0QwMVxceDFBCVtmaWQ9MDAwMDAxMjg3LTUwLTAwMDBBU0Q7ZXh0PWFzZDttaW1lPTtdQVNEIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBCb2EgY29uc3RyaWN0b3IgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE4IGJ5IENhcmwNCjAJc3RyaW5nCUJPQVxceDAwCVtmaWQ9MDAwMTAwMDQwLTUwLTAwMDBCNTg7ZXh0PWI1ODttaW1lPTtdQk9BIGNvbnN0cmljdG9yIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBCV0MgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE4IGJ5IENhcmwNCjAJc3RyaW5nCUJXQwlbZmlkPTAwMDEwMDA0Mi01MC0wMDAwMEJDO2V4dD1iYzttaW1lPTtdQldDIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBCaXggZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE4IGJ5IENhcmwNCjAJc3RyaW5nCUJJWDAJW2ZpZD0wMDAxMDAwMzctNTAtMDAwMEJJWDtleHQ9Yml4O21pbWU9O11CSVggYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEJ0b2EgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE4IGJ5IENhcmwNCjAJc3RyaW5nCXhidG9hNQlbZmlkPTAwMDEwMDA0My01MC0wMDAwQk9PO2V4dD1ib287bWltZT07XUJ0b2EgZW5jb2RlZCBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEJzYSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTggYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZCU0dcXHgwMFxceDAwXFx4RkZCU0EJW2ZpZD0wMDAwMDEyODktNTAtMDAwMEJTTjtleHQ9YnNuO21pbWU9O11Cc2EgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEJUUEMgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTAzIGJ5IENhcmwNCjAJc3RyaW5nCWJ0cGNcXCAJW2ZpZD0wMDAxMDAwNzQtNTAtMDAwQlRQQztleHQ9YnRwYzttaW1lPTtdQlRQQyBjb21wcmVzc2VkIGltYWdlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQlRTIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xOCBieSBDYXJsDQowCXN0cmluZwlcXHgxQVxceDAzRGVzY3JpcHQJW2ZpZD0wMDAxMDAwNDQtNTAtMDAwMEJUUztleHQ9YnRzO21pbWU9O11CVFNwayBhcmNoaXZlIGZpbGUNCiYweDUyMQlzdHJpbmcJQlRTUEshCQ0KDQojIE1hZ2ljIElEIGZvciBCemlwIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xOCBieSBDYXJsDQowCXN0cmluZwlCWjAJW2ZpZD0wMDAxMDAwMDgtNTAtMDAwMDBCWjtleHQ9Yno7bWltZT07XUJ6aXAgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEJ6aXAyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlCWmgJW2ZpZD0wMDAxMDAwMDgtNTAtMDAwMEJaMjtleHQ9YnoyO21pbWU9O11CemlwMiBhcmNoaXZlIGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlNU0NGCVtmaWQ9MDAwMDAxMDAxLTUwLTAwMDBDQUI7ZXh0PWNhYjttaW1lPTtdTWljcm9zb2Z0IENhYmluZXQgZmlsZQ0KPjI1CWJ5dGUJeAksIHZlcnNpb24gJWQuDQo+MjQJYnl0ZQl4CSVkDQoNCiMgTWFnaWMgSUQgZm9yIENydXNoIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yMyBieSBDYXJsDQowCXN0cmluZwlDUlVTSFxcIHYxLjgJW2ZpZD0wMDAwMDEyOTAtNTAtMDAwMENSVTtleHQ9Y3J1O21pbWU9O11DcnVzaCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQ3R4ZiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjMgYnkgQ2FybA0KMAlzdHJpbmcJQ1hGXFx4MUEJW2ZpZD0wMDAxMDAwNDUtNTAtMDAwMENYRjtleHQ9Y3hmO21pbWU9O11DdHggYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIERBWFdhdiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJRk9STQlbZmlkPTAwMDAwMDAwMC01MC0wMDAwREFYO2V4dD1kYXg7bWltZT07XURBWCBhdWRpbyBhcmNoaXZlIGZpbGUNCiY4CXN0cmluZwlkYXhBCQ0KDQojIE1hZ2ljIElEIGZvciBEaXNrbWFzaGVyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yMyBieSBDYXJsDQowCXN0cmluZwlETVMhCVtmaWQ9MDAwMDAwMDAwLTUwLTAwMDBETVM7ZXh0PWRtczttaW1lPTtdRGlza21hc2hlciBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgRHBhZSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjMgYnkgQ2FybA0KMAlzdHJpbmcJRGlya1xcIFBhZWhsKGMpCVtmaWQ9MDAwMTAwMDQ2LTUwLTAwMDBEUEE7ZXh0PWRwYTttaW1lPTtdRHBhZSBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgRGlzaW50ZWdyYXRvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjMgYnkgQ2FybA0KMAlzdHJpbmcJRFNUYglbZmlkPTAwMDEwMDA0Ny01MC0wMDAwRFNUO2V4dD1kc3Q7bWltZT07XURpc2ludGVncmF0b3IgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEVuaGFuY2VkIGNvbXByZXNzb3IgKEVOQykgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTIzIGJ5IENhcmwNCjAJc3RyaW5nCUVuY2gJW2ZpZD0wMDAxMDAwNTEtNTAtMDAwMEVOQztleHQ9ZW5jO21pbWU9O11FbmhhbmNlZCBjb21wcmVzc29yIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBFU1AgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCUVTUD4JW2ZpZD0wMDAxMDAwMDItNTAtMDAwMEVTUDtleHQ9ZXNwO21pbWU9O11FU1AgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEVTUCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMHg1M2YJc3RyaW5nCUVTUAlbZmlkPTAwMDEwMDAwMi01MC0wMDAwRVhFO2V4dD1leGU7bWltZT07XUVTUCBTZWxmLWV4dHJhY3RpbmcgYXJjaGl2ZXcgKE1TLURPUykNCg0KIyBNYWdpYyBJRCBmb3IgRnJlZXplIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlcXHgxRlxceDlFCVtmaWQ9MDAwMDAwMDAwLTUwLTAwMDAwMEY7ZXh0PWY7bWltZT07XUZyZWV6ZSBhcmNoaXZlIGZpbGUsIHZlcnNpb24gMS4wDQoNCiMgTWFnaWMgSUQgZm9yIEZyZWV6ZSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MUZcXHg5RglbZmlkPTAwMDAwMDAwMC01MC0wMDAwMDBGO2V4dD1mO21pbWU9O11GcmVlemUgYXJjaGl2ZSBmaWxlLCB2ZXJzaW9uIDIuMA0KDQojIE1hZ2ljIElEIGZvciBRbGZjIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yMyBieSBDYXJsDQowCXN0cmluZwlcXHg0N1xceDY4XFx4NjlcXHg2NFxceDZmCVtmaWQ9MDAwMTAwMDU1LTUwLTAwMDAwR1E7ZXh0PWdxO21pbWU9O11RbGZjIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBHemlwIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlcXHgxRlxceDhCCVtmaWQ9MDAwMDAwMDAyLTUwLTAwMDE5NTI7ZXh0PWd6O21pbWU9O11HemlwIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBIYSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTAgYnkgQ2FybA0KMAlzdHJpbmcJSEEJW2ZpZD0wMDAxMDAwMTMtNTAtMDAwMDBIQTtleHQ9aGE7bWltZT07XUhBIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBIQVAgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTIzIGJ5IENhcmwNCjAJc3RyaW5nCVxceDkxM0hGCVtmaWQ9MDAwMDAxMjkxLTUwLTAwMDBIQVA7ZXh0PWhhcDttaW1lPTtdSEFQIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBIcGFjayBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJSFBBSwlbZmlkPTAwMDEwMDAxNi01MC0wMDAwSFBLO2V4dD1ocGs7bWltZT07XUhwYWNrIGFyY2hpdmUgZmlsZQ0KJlo0CXN0cmluZwlIUEFLCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTEwIGJ5IENhcmwNCjExCXN0cmluZwltdXN0XFwgYmVcXCBjb252ZXJ0ZWRcXCB3aXRoXFwgQmluSGV4CVtmaWQ9MDAwMDAxMDAyLTUwLTAwMDBIUVg7ZXh0PWhxeDttaW1lPTtdQmluSGV4IGFyY2hpdmUNCg0KIyBNYWdpYyBJRCBmb3IgSFlQIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yMyBieSBDYXJsDQowCXN0cmluZwlcXHgxQUhQXFx4MjUJW2ZpZD0wMDAxMDAwNTYtNTAtMDAwMEhZUDtleHQ9aHlwO21pbWU9O11IWVAgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEhZUCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjMgYnkgQ2FybA0KMAlzdHJpbmcJXFx4MUFTVFxceDI1CVtmaWQ9MDAwMTAwMDU2LTUwLTAwMDBIWVA7ZXh0PWh5cDttaW1lPTtdSFlQIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBXaW5pbXAgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJbGVsb25nCTB4QTUwNEQ0OQlbZmlkPTAwMDAwMTI3MC01MC0wMDAwSU1QO2V4dD1pbXA7bWltZT07XVdpbmltcCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgSlJjaGl2ZSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJSlJjaGl2ZQlbZmlkPTAwMDAwMTI2My01MC0wMDAwSlJDO2V4dD1qcmM7bWltZT07XUpSY2hpdmUgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIEFyY2hpdmUgSGFuZGxlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJTEcJW2ZpZD0wMDAxMDAwMDEtNTAtMDAwMDBMRztleHQ9bGc7bWltZT07XUFyaGFuZ2VsIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBMaW1pdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJTE1cXHgxQQlbZmlkPTAwMDEwMDAwMy01MC0wMDAwTElNO2V4dD1saW07bWltZT07XUxpbWl0IGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBMYXJjIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQoyCXN0cmluZwktbHo0LQlbZmlkPTAwMDEwMDAxNy01MC0wMDAwTFpIO2V4dD1semg7bWltZT07XUxhcmMgYXJjaGl2ZQ0KDQojIE1hZ2ljIElEIGZvciBMYXJjIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQoyCXN0cmluZwktbHo1LQlbZmlkPTAwMDEwMDAxNy01MC0wMDAwTFpIO2V4dD1semg7bWltZT07XUxhcmMgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIExhcmMgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjIJc3RyaW5nCS1senMtCVtmaWQ9MDAwMTAwMDE3LTUwLTAwMDBMWkg7ZXh0PWx6aDttaW1lPTtdTGFyYyBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgbGhhIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQoyCXN0cmluZwktbGhcXCAtCVtmaWQ9MDAwMTAwMDE3LTUwLTAwMDBMWkg7ZXh0PWx6aCxsaGE7bWltZT07XUxIYXJjIGFyY2hpdmUgZmlsZSwgdmVyc2lvbiAyLngNCg0KIyBNYWdpYyBJRCBmb3IgbGhhIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQoyCXN0cmluZwktbGgwLQlbZmlkPTAwMDEwMDAxNy01MC0wMDAwTFpIO2V4dD1semgsbGhhO21pbWU9O11MSGFyYyBhcmNoaXZlIGZpbGUsIHZlcnNpb24gMS54DQoNCiMgTWFnaWMgSUQgZm9yIGxoYSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMglzdHJpbmcJLWxoMS0JW2ZpZD0wMDAxMDAwMTctNTAtMDAwMExaSDtleHQ9bHpoLGxoYTttaW1lPTtdTEhhcmMgYXJjaGl2ZSBmaWxlLCB2ZXJzaW9uIDEueA0KDQojIE1hZ2ljIElEIGZvciBsaGEgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjIJc3RyaW5nCS1saDItCVtmaWQ9MDAwMTAwMDE3LTUwLTAwMDBMWkg7ZXh0PWx6aCxsaGE7bWltZT07XUxIYXJjIGFyY2hpdmUgZmlsZSwgdmVyc2lvbiAyLngNCg0KIyBNYWdpYyBJRCBmb3IgbGhhIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQoyCXN0cmluZwktbGgzLQlbZmlkPTAwMDEwMDAxNy01MC0wMDAwTFpIO2V4dD1semgsbGhhO21pbWU9O11MSGFyYyBhcmNoaXZlIGZpbGUsIHZlcnNpb24gMi54DQoNCiMgTWFnaWMgSUQgZm9yIGxoYSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMglzdHJpbmcJLWxoNC0JW2ZpZD0wMDAxMDAwMTctNTAtMDAwMExaSDtleHQ9bHpoLGxoYTttaW1lPTtdTEhhcmMgYXJjaGl2ZSBmaWxlLCB2ZXJzaW9uIDIueA0KDQojIE1hZ2ljIElEIGZvciBsaGEgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjIJc3RyaW5nCS1saDUtCVtmaWQ9MDAwMTAwMDE3LTUwLTAwMDBMWkg7ZXh0PWx6aCxsaGE7bWltZT07XUxIYXJjIGFyY2hpdmUgZmlsZSwgdmVyc2lvbiAyLngNCg0KIyBNYWdpYyBJRCBmb3IgbGhhIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQoyCXN0cmluZwktbGg2LQlbZmlkPTAwMDEwMDAxNy01MC0wMDAwTFpIO2V4dD1semgsbGhhO21pbWU9O11MSGFyYyBhcmNoaXZlIGZpbGUsIHZlcnNpb24gMi54DQoNCiMgTWFnaWMgSUQgZm9yIGxoYSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMglzdHJpbmcJLWxoNy0JW2ZpZD0wMDAxMDAwMTctNTAtMDAwMExaSDtleHQ9bHpoLGxoYTttaW1lPTtdTEhhcmMgYXJjaGl2ZSBmaWxlLCB2ZXJzaW9uIDIueA0KDQojIE1hZ2ljIElEIGZvciBsaGEgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjIJc3RyaW5nCS1saGQtCVtmaWQ9MDAwMTAwMDE3LTUwLTAwMDBMWkg7ZXh0PWx6aCxsaGE7bWltZT07XUxIYXJjIGFyY2hpdmUgZmlsZSwgdmVyc2lvbiAyLngNCg0KIyBNYWdpYyBJRCBmb3IgbHpvIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlcXHg4OVxceDRjXFx4NWFcXHg0ZlxceDAwXFx4MGRcXHgwYVxceDFhXFx4MGEJW2ZpZD0wMDAxMDAwMTgtNTAtMDAwMExaTztleHQ9bHpvO21pbWU9O11MWk9QIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBMenggZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTIzIGJ5IENhcmwNCjAJc3RyaW5nCUxaWAlbZmlkPTAwMDEwMDA1OC01MC0wMDAwTFpYO2V4dD1seng7bWltZT07XUxaWCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgTWRjZCAoTWlrZSBEYXZlbnBvcnQgY29tcHJlc3NvcikgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCU1EbWQJW2ZpZD0wMDAxMDAwMDQtNTAtMDAwMDBNRDtleHQ9bWQ7bWltZT07XU1pa2UgRGF2ZW5wb3J0IGFyY2hpdmUgZmlsZQ0KPjQJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KJjUJYnl0ZQkxCQ0KDQojIE1hZ2ljIElEIGZvciBOYXNocmluayBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjMgYnkgQ2FybA0KMAlzdHJpbmcJTlNLCVtmaWQ9MDAwMDAxMjkyLTUwLTAwMDBOU0s7ZXh0PW5zazttaW1lPTtdTmFTaHJpbmsgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFNlbW9uZSBhcmNoaXZlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjcgYnkgQ2FybA0KMAlzdHJpbmcJU0VNaAlbZmlkPTAwMDEwMDA2OC01MC0wMDAwT05FO2V4dD1vbmU7bWltZT07XVNlbW9uZSBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgTHBhYyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJTFBBQwlbZmlkPTAwMDEwMDA4NC01MC0wMDAwUEFDO2V4dD1wYWM7bWltZT07XUxQQUMgYXVkaW8gYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIENyb3NzZVBBQyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJRFNJR0RDQwlbZmlkPTAwMDAwMTI2Mi01MC0wMDAwUEFDO2V4dD1wYWM7bWltZT07XUNyb3NzZVBBQyBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgSGlnaCBDb21wcmVzc2lvbiBNYXJrb3YgUHJlZGljdGl2ZSBDb2RlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjMgYnkgQ2FybA0KMAlzdHJpbmcJUFBaMglbZmlkPTAwMDEwMDA2MS01MC0wMDAwUE1aO2V4dD1wbXo7bWltZT07XVBQTVoyIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBQb3dlcnBhY2tlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjcgYnkgQ2FybA0KMAlzdHJpbmcJUFAyMAlbZmlkPTAwMDEwMDA2Mi01MC0wMDAwMFBQO2V4dD1wcDttaW1lPTtdUG93ZXJwYWNrZXIgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFBBUTEgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTI3IGJ5IENhcmwNCjAJc3RyaW5nCVBBUTFcXHgwRFxceDBBCVtmaWQ9MDAwMTAwMDY0LTUwLTAwMDBQUTE7ZXh0PXBxMTttaW1lPTtdUEFRMSBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgUEFRMyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjcgYnkgQ2FybA0KMAlzdHJpbmcJUEFRM1xceDBEXFx4MEEJW2ZpZD0wMDAxMDAwNjQtNTAtMDAwMFBRMztleHQ9cHEzO21pbWU9O11QQVEzIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBQQVE2IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yNyBieSBDYXJsDQowCXN0cmluZwlQQVE2CVtmaWQ9MDAwMTAwMDY0LTUwLTAwMDBQUTY7ZXh0PXBxNjttaW1lPTtdUEFRNiBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgUHJldHR5IHNpbXBsZSBhcmNoaXZlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjcgYnkgQ2FybA0KMAlzdHJpbmcJUFNBXFx4MDFcXHgwMwlbZmlkPTAwMDEwMDA2NS01MC0wMDAwUFNBO2V4dD1wc2E7bWltZT07XVByZXR0eSBzaW1wbGUgYXJjaGl2ZXIgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFF1YW50dW0gY29tcHJlc3NvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjcgYnkgQ2FybA0KMAlzdHJpbmcJRFMJW2ZpZD0wMDAwMDEyOTQtNTAtMDAwMDAwUTtleHQ9cTttaW1lPTtdUXVhbnR1bSBhcmNoaXZlIGZpbGUNCiYyCWJ5dGUJPDIJDQo+MglieXRlCXgJLCB2ZXJzaW9uICVkDQo+MwlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFJhciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJXFx4NTJcXHg2MVxceDcyXFx4MjFcXHgxYVxceDA3XFx4MDAJW2ZpZD0wMDAwMDEyNjctNTAtMDAwMFJBUjtleHQ9cmFyO21pbWU9O11SQVIgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFJvbWFuaWFuIGFyY2hpdmVyIGVYcGVydCAoUkFYKSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjcgYnkgQ2FybA0KMAlzdHJpbmcJVUxFQglbZmlkPTAwMDAwMTI5NS01MC0wMDAwUkFYO2V4dD1yYXg7bWltZT07XVJBWCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgUmVkdXEgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTI3IGJ5IENhcmwNCjAJc3RyaW5nCXJkcXgJW2ZpZD0wMDAxMDAwNjYtNTAtMDAwMFJEUTtleHQ9cmRxO21pbWU9O11SZWR1cSBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgUlBNIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNCBieSBDYXJsDQowCXN0cmluZwlcXHhlZFxceGFiXFx4ZWVcXHhkYglbZmlkPTAwMDAwMDAwMC01MC0wMDAwUlBNO2V4dD1ycG07bWltZT07XVJQTSBhcmNoaXZlDQo+NAlieXRlCXgJLCB2ZXJzaW9uICVkDQo+NQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIHJ6aXAgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA0IGJ5IENhcmwNCjAJc3RyaW5nCVJaSVAJW2ZpZD0wMDAxMDAwNzYtNTAtMDAwMDBSWjtleHQ9cno7bWltZT07XVJ6aXAgYXJjaGl2ZSBmaWxlDQo+NAlieXRlCXgJLCB2ZXJzaW9uICVkDQo+NQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFN0cmVhbWxpbmUgQXJjaGl2YWwgVXRpbGl0eSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMwlzdHJpbmcJTEgwCVtmaWQ9MDAwMDAxMjY0LTUwLTAwMDBTQVI7ZXh0PXNhcjttaW1lPTtdU3RyZWFtaW5nIEFyY2hpdmVyIFV0aWxpdHkgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFN0cmVhbWxpbmUgQXJjaGl2YWwgVXRpbGl0eSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMwlzdHJpbmcJTEg0CVtmaWQ9MDAwMDAxMjY0LTUwLTAwMDBTQVI7ZXh0PXNhcjttaW1lPTtdU3RyZWFtaW5nIEFyY2hpdmVyIFV0aWxpdHkgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFN0cmVhbWxpbmUgQXJjaGl2YWwgVXRpbGl0eSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMwlzdHJpbmcJTEg1CVtmaWQ9MDAwMDAxMjY0LTUwLTAwMDBTQVI7ZXh0PXNhcjttaW1lPTtdU3RyZWFtaW5nIEFyY2hpdmVyIFV0aWxpdHkgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFNCWCBBcmNoaXZlciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMjcgYnkgQ2FybA0KMAlzdHJpbmcJU0IxXFx4MDAJW2ZpZD0wMDAwMDEyOTctNTAtMDAwMDBTQjtleHQ9c2I7bWltZT07XVNCWCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgU0JDIEFyY2hpdmVyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yNyBieSBDYXJsDQowCXN0cmluZwlTQkNcXHgxRQlbZmlkPTAwMDEwMDA2Ny01MC0wMDAwU0JDO2V4dD1zYmM7bWltZT07XVNCQyBhcmNoaXZlIGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMCBieSBDYXJsDQoxMAlzdHJpbmcJI1xcIFRoaXNcXCBpc1xcIGFcXCBzaGVsbFxcIGFyY2hpdmUJW2ZpZD0wMDAwMDAwMDAtNTAtMDAwU0hBUjtleHQ9c2hhcjttaW1lPTtdVU5JWCBzaGVsbCBhcmNoaXZlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTAgYnkgQ2FybA0KMTEJc3RyaW5nCSNcXCBUaGlzXFwgaXNcXCBhXFwgc2hlbGxcXCBhcmNoaXZlCVtmaWQ9MDAwMDAwMDAwLTUwLTAwMFNIQVI7ZXh0PXNoYXI7bWltZT07XVVOSVggc2hlbGwgYXJjaGl2ZQ0KDQojIE1hZ2ljIElEIGZvciBOdWxpYiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJXFx4NGVcXHhmNVxceDQ2XFx4ZDgJW2ZpZD0wMDAxMDAwMDUtNTAtMDAwMFNISztleHQ9c2hrO21pbWU9O11TaHJpbmtpdC9OdWxpYiBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgTnVsaWIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCVxceDRlXFx4ZjVcXHg0NlxceGU5XFx4NmNcXHhlNQlbZmlkPTAwMDEwMDAwNS01MC0wMDAwU0hLO2V4dD1zaGs7bWltZT07XVNocmlua2l0L051bGliIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBTdHVmZml0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNCBieSBDYXJsDQowCXN0cmluZwlTdHVmZkl0XFwgCVtmaWQ9MDAwMDAxMjcyLTUwLTAwMDBTSVQ7ZXh0PXNpdDttaW1lPTtdU3R1ZmZpdCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgU3R1ZmZpdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTEgYnkgQ2FybA0KMAlzdHJpbmcJU0lUIQlbZmlkPTAwMDAwMTI3Mi01MC0wMDAwU0lUO2V4dD1zaXQ7bWltZT07XVN0dWZmaXQgYXJjaGl2ZSBmaWxlDQomMTAJc3RyaW5nCXJMYXUJDQo+MTQJYnl0ZQl4CSwgdmVyc2lvbiAlZC4wDQoNCiMgTWFnaWMgSUQgZm9yIFN0dWZmaXQgRXh0ZW5kZWQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAzLTA0IGJ5IENhcmwNCjAJc3RyaW5nCVN0dWZmSXQhCVtmaWQ9MDAwMDAxMjcyLTUwLTAwMFNJVFg7ZXh0PXNpdHg7bWltZT07XVN0dWZmaXQgZXh0ZW5kZWQgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFNvZiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDMtMDQgYnkgQ2FybA0KMAlzdHJpbmcJUEtcXHgwM1xceDA2CVtmaWQ9MDAwMDAwMDAwLTUwLTAwMDBTT0Y7ZXh0PXNvZjttaW1lPTtdU09GIGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBTcGxpbnQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCVxceDkzXFx4QjlcXHgwNglbZmlkPTAwMDEwMDAwNi01MC0wMDAwU1BMO2V4dD1zcGw7bWltZT07XVNwbGludCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgU3F3ZWV6IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMCBieSBDYXJsDQowCXN0cmluZwlTUVdFWlxcIAlbZmlkPTAwMDEwMDAxNC01MC0wMDAwU1FaO2V4dD1zcXo7bWltZT07XVNxd2V6IGFyY2hpdmUgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBTcXogZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTEwIGJ5IENhcmwNCjAJc3RyaW5nCUhMU1FaCVtmaWQ9MDAwMTAwMDE1LTUwLTAwMDBTUVo7ZXh0PXNxejttaW1lPTtdU3F1ZWV6ZSBhcmNoaXZlIGZpbGUNCj41CXN0cmluZwl4CSwgdmVyc2lvbiAlLjFzLjANCg0KIyBNYWdpYyBJRCBmb3IgU3RvbmVjcmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yNyBieSBDYXJsDQowCXN0cmluZwlTNDAxCVtmaWQ9MDAwMTAwMDYzLTUwLTAwMDBTVEM7ZXh0PXN0YzttaW1lPTtdU3RvbmVjcmFja2VyIGFyY2hpdmUgZmlsZQ0KPjAJc3RyaW5nCVM0MDEJLCB2ZXJzaW9uIDQuMDENCg0KIyBNYWdpYyBJRCBmb3IgU3RvbmVjcmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yNyBieSBDYXJsDQowCXN0cmluZwlTNDAzCVtmaWQ9MDAwMTAwMDYzLTUwLTAwMDBTVEM7ZXh0PXN0YzttaW1lPTtdU3RvbmVjcmFja2VyIGFyY2hpdmUgZmlsZQ0KPjAJc3RyaW5nCVM0MDMJLCB2ZXJzaW9uIDQuMDMNCg0KIyBNYWdpYyBJRCBmb3IgU3RvbmVjcmFja2VyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yNyBieSBDYXJsDQowCXN0cmluZwlTNDA0CVtmaWQ9MDAwMTAwMDYzLTUwLTAwMDBTVEM7ZXh0PXN0YzttaW1lPTtdU3RvbmVjcmFja2VyIGFyY2hpdmUgZmlsZQ0KPjAJc3RyaW5nCVM0MDQJLCB2ZXJzaW9uIDQuMDQNCg0KIyBNYWdpYyBJRCBmb3IgU3ppcCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJU1pcXHgwQVxceDA0CVtmaWQ9MDAwMTAwMDA5LTUwLTAwMDAwU1o7ZXh0PXN6O21pbWU9O11TWklQIGFyY2hpdmUgZmlsZQ0KPjQJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjUJYnl0ZQl4CS4lZA0KDQojIE1hZ2ljIElEIGZvciBUYXIscGF4IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMCBieSBDYXJsDQoyNTcJc3RyaW5nCXVzdGFyXFwwNDBcXDA0MFxcMAlbZmlkPTAwMDAwMDAwMC01MC0wMDAwVEFSO2V4dD10YXI7bWltZT07XUdOVSB0YXIgYXJjaGl2ZQ0KDQojIE1hZ2ljIElEIGZvciBUYXIscGF4IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMCBieSBDYXJsDQoyNTcJc3RyaW5nCXVzdGFyXFwwXFx4MDYJW2ZpZD0wMDAwMDAwMDMtNTAtMDAwMTAwMztleHQ9dGFyO21pbWU9O11PcGVuZ3JvdXAvUE9TSVggdGFyIGFyY2hpdmUNCg0KIyBNYWdpYyBJRCBmb3IgdWMyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMCBieSBDYXJsDQowCXN0cmluZwlVQzJcXHgxYQlbZmlkPTAwMDAwMTI3MS01MC0wMDAwVUMyO2V4dD11YzI7bWltZT07XVVsdHJhIENvbXByZXNzb3IgYXJjaGl2ZSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFVoYXJjIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wNCBieSBDYXJsDQowCXN0cmluZwlVSEEJW2ZpZD0wMDAxMDAwODMtNTAtMDAwMFVIQTtleHQ9dWhhO21pbWU9O11VSEFyYyBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgWUJTIGFyY2hpdmVyIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0yNyBieSBDYXJsDQowCXN0cmluZwlZQlMzCVtmaWQ9MDAwMTAwMDcxLTUwLTAwMDBZQlM7ZXh0PXliczttaW1lPTtdWUJTIGFyY2hpdmUgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCVxcMDM3XFwyMzUJW2ZpZD0wMDAwMDAwMDAtNTAtMDAwMDAwWjtleHQ9ejttaW1lPTtdVU5JWCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgUGt1bnppcCwgSW5mby16aXAgVW56aXAgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJbGVsb25nCTB4MDQwMzRiNTAJW2ZpZD0wMDAwMDEyNjYtNTAtMDAwMFpJUDtleHQ9emlwO21pbWU9YXBwbGljYXRpb24vemlwO11Qa3ppcCBhcmNoaXZlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3Igem9vIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMCBieSBDYXJsDQowCXN0cmluZwlaT08JW2ZpZD0wMDAxMDAwMTItNTAtMDAwMFpPTztleHQ9em9vO21pbWU9O11ab28gYXJjaGl2ZSBmaWxlDQomMHgxNAlsZWxvbmcJMHgwRkRDNEE3REMJDQo+MzIJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjMzCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgWnppcCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJWloJW2ZpZD0wMDAxMDAwMDctNTAtMDAwMDBaWjtleHQ9eno7bWltZT07XVpaaXAgYXJjaGl2ZSBmaWxlDQo+MglieXRlCXgJLCB2ZXJzaW9uICVkLjANCg0KIyBNYWdpYyBJRCBmb3IgNjI0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wMyBieSBDYXJsDQowCXN0cmluZwlbRVNQXVxceEI1XFx4NzgJW2ZpZD0wMDAxMDAwMDItNTEtMDAwMENPTTtleHQ9Y29tO21pbWU9O102MjQgZXhlY3V0YWJsZSBjb21wcmVzc2VkIGZpbGUgKE1TLURPUykNCg0KIyBNYWdpYyBJRCBmb3IgNjI0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMy0wMyBieSBDYXJsDQowCXN0cmluZwlQVUxQXFx4ODMJW2ZpZD0wMDAxMDAwMDItNTEtMDAwMENPTTtleHQ9Y29tO21pbWU9O102MjQgZXhlY3V0YWJsZSBjb21wcmVzc2VkIGZpbGUgKE1TLURPUykNCg0KIyBNYWdpYyBJRCBmb3IgTHpleGUgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTIzIGJ5IENhcmwNCjB4MUMJc3RyaW5nCUxaOTEJW2ZpZD0wMDAxMDAwNTMtNTEtMDAwMEVYRTtleHQ9ZXhlO21pbWU9O11MemV4ZSBjb21wcmVzc2VkIGV4ZWN1dGFibGUgZmlsZSAoTVMtRE9TKQ0KDQojIE1hZ2ljIElEIGZvciBIVE1MIEhlbHAgV29ya3Nob3AgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCUlUU0YJW2ZpZD0wMDAwMDEwMDEtNjAtMDAwMENITTtleHQ9Y2htO21pbWU9O11NaWNyb3NvZnQgY29tcGlsZWQgaHlwZXJ0ZXh0IGRvY3VtZW50DQoNCiMgTWFnaWMgSUQgZm9yIEJvcmxhbmQgRGVscGhpIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNy0zMCBieSBDYXJsDQoyCXN0cmluZwlERUxQSEkuRElBR1JBTS5QT1JURk9MSU8JW2ZpZD0wMDAwMDEwMDUtNjAtMDAwMEREUDtleHQ9ZGRwO21pbWU9O11EZWxwaGkgRGlhZ3JhbSBQb3J0Zm9saW8gZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBQYWdlc3RyZWFtIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlGT1JNCVtmaWQ9MDAwMDAxMjY4LTYwLTAwMDBET0M7ZXh0PWRvYzttaW1lPTtdUGFnZXN0cmVhbSBkb2N1bWVudA0KJjgJc3RyaW5nCURPQ1xcIAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlDQVRcXCAJW2ZpZD0wMDAwMDEwMTAtNjAtMDAwRlRYVDtleHQ9ZnR4dDttaW1lPTtdRm9ybWF0dGVkIHRleHQgaW50ZXJjaGFuZ2UgZmlsZQ0KJjgJc3RyaW5nCUZUWFQJDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJRk9STQlbZmlkPTAwMDAwMTAxMC02MC0wMDBGVFhUO2V4dD1mdHh0O21pbWU9O11Gb3JtYXR0ZWQgdGV4dCBpbnRlcmNoYW5nZSBmaWxlDQomOAlzdHJpbmcJRlRYVAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlMSVNUCVtmaWQ9MDAwMDAxMDEwLTYwLTAwMEZUWFQ7ZXh0PWZ0eHQ7bWltZT07XUZvcm1hdHRlZCB0ZXh0IGludGVyY2hhbmdlIGZpbGUNCiY4CXN0cmluZwlGVFhUCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCUBkYXRhYmFzZQlbZmlkPTAwMDAwMTAwNy02MC0wMEdVSURFO2V4dD1ndWlkZTttaW1lPTtdQW1pZ2FHdWlkZSBoeXBlcnRleHQgZG9jdW1lbnQNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCWxlbG9uZwkweDAwMDM1RjNGCVtmaWQ9MDAwMDAxMDAxLTYwLTAwMDBITFA7ZXh0PWhscDttaW1lPTtdTWljcm9zb2Z0IFdpbmRvd3MgSGVscCBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMTAtMDggYnkgQ2FybA0KMAlzdHJpbmcJPCFET0NUWVBFXFwgCVtmaWQ9MDAwMDAwMDAxLTYwLTAwMTU0NDU7ZXh0PWh0bWwsaHRtO21pbWU9dGV4dC9odG1sO11IeXBlclRleHQgTWFya3VwIExhbmd1YWdlIGRvY3VtZW50IChIVE1MKQ0KJjEwCXN0cmluZy9jCWh0bWwJDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJSERPQwlbZmlkPTAwMDAwMTAwNi02MC0wMDAwSFlQO2V4dD1oeXA7bWltZT07XUF0YXJpIFNULUd1aWRlIGh5cGVydGV4dCBkb2N1bWVudA0KDQojIE1hZ2ljIElEIGZvciBPUy8yIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCXN0cmluZwlIU1AJW2ZpZD0wMDAwMDEwMDktNjAtMDAwMElORjtleHQ9aW5mO21pbWU9O11PUy8yIEd1aWRlIGh5cGVydGV4dCBkb2N1bWVudA0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCVRoaXNcXCBpc1xcIEluZm9cXCBmaWxlCVtmaWQ9MDAwMTAwMDEwLTYwLTAwMElORk87ZXh0PWluZm87bWltZT07XUdOVSBJbmZvIGh5cGVydGV4dCBkb2N1bWVudA0KDQojIE1hZ2ljIElEIGZvciBBZG9iZSBBY3JvYmF0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0xMC0wOCBieSBDYXJsDQowCXN0cmluZwklUERGLQlbZmlkPTAwMDAwMDAwMS02MC0wMDE1OTMwO2V4dD1wZGY7bWltZT1hcHBsaWNhdGlvbi9wZGY7XVBvcnRhYmxlIGRvY3VtZW50IGZvcm1hdCBkb2N1bWVudCBmaWxlIChQREYpDQo+NQlzdHJpbmcJeAksIHZlcnNpb24gJS4xcw0KPjcJc3RyaW5nCXgJLiUuMXMNCg0KIyBNYWdpYyBJRCBmb3IgTWljcm9zb2Z0IFdvcmRwYWQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCXtcXFxccnRmCVtmaWQ9MDAwMDAxMDAxLTYwLTAwMDBSVEY7ZXh0PXJ0ZjttaW1lPXRleHQvcnRmO11SaWNoIFRleHQgRm9ybWF0IGRvY3VtZW50DQo+NQlzdHJpbmcJeAksIHZlcnNpb24gJS4xcy54DQoNCiMgTWFnaWMgSUQgZm9yIERvY0Jvb2sgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTEwLTA4IGJ5IENhcmwNCjAJc3RyaW5nCTwhRE9DVFlQRVxcIAlbZmlkPTAwMDAwMDAwMS02MC0wMDA4ODc5O2V4dD1zZ21sLHNnbTttaW1lPXRleHQvc2dtbDtdU3RhbmRhcmQgZ2VuZXJhbCBtYXJrdXAgbGFuZ3VhZ2UgZG9jdW1lbnQgKFNHTUwpDQoNCiMgTWFnaWMgSUQgZm9yIFR1cmJvIEMgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVRVUkJPXFwgQ1xcIEhFTFBcXCBGSUxFXFx4MDAJW2ZpZD0wMDAwMDEwMDUtNjAtMDAwMFRDSDtleHQ9dGNoO21pbWU9O11UdXJibyBDIGhlbHAgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBUdXJibyBQYXNjYWwgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCVRVUkJPXFwgUEFTQ0FMXFwgSEVMUFxcIEZJTEVcXHgwMAlbZmlkPTAwMDAwMTAwNS02MC0wMDAwVFBIO2V4dD10cGg7bWltZT07XUJvcmxhbmQgUGFzY2FsIGhlbHAgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBUdXJibyBWaXNpb24gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJbGVsb25nCTB4NDY0ODQyNDYJW2ZpZD0wMDAwMDEwMDUtNjAtMDAwMFRWSDtleHQ9dHZoO21pbWU9O11Cb3JsYW5kIFR1cmJvIFZpc2lvbiBoZWxwIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgV29yZHBlcmZlY3QgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCVxceEZGV1BDCVtmaWQ9MDAwMDAxMDA4LTYwLTAwMDBXUEQ7ZXh0PXdwZCxkb2M7bWltZT1hcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3Q7XVdvcmRwZXJmZWN0IGRvY3VtZW50DQomOQlieXRlCTB4MEEJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQNCg0KIyBNYWdpYyBJRCBmb3IgTWljcm9zb2Z0IFdyaXRlIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCWxlc2hvcnQJMDEzNzA2MQlbZmlkPTAwMDAwMTAwMS02MC0wMDAwV1JJO2V4dD13cmk7bWltZT07XU1pY3Jvc29mdCBXcml0ZSBkb2N1bWVudA0KJjIJbGVzaG9ydAkweDAwMDAJDQoNCiMgTWFnaWMgSUQgZm9yIE1pY3Jvc29mdCBXcml0ZSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlsZXNob3J0CTAxMzcwNjIJW2ZpZD0wMDAwMDEwMDEtNjAtMDAwMFdSSTtleHQ9d3JpO21pbWU9O11NaWNyb3NvZnQgV3JpdGUgZG9jdW1lbnQNCiYyCWxlc2hvcnQJMHgwMDAwCQ0KDQojIE1hZ2ljIElEIGZvciBYLVdpbmRvd3MgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA5LTAxIGJ5IENhcmwNCjAJc3RyaW5nCVNUQVJURk9OVFxcIAlbZmlkPTAwMDAwMTAwMy03MC0wMDAwQkRGO2V4dD1iZGY7bWltZT07XUFkb2JlIGdseXBoIGJpdG1hcCBkaXN0cmlidXRpb24gZm9ybWF0IGZvbnQgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBEZWx1eGUgUGFpbnQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA5LTAxIGJ5IENhcmwNCjAJc3RyaW5nCUNGXFx4MDFcXHgwMAlbZmlkPTAwMDAwMTAxMC03MC0wMDAwMDBDO2V4dD1jO21pbWU9O11EZWx1eGUgcGFpbnQgbXVsdGktY29sb3VyIGZvbnQgZmlsZQ0KDQojIE1hZ2ljIElEIGZvciBGaWdsZXQgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA5LTAxIGJ5IENhcmwNCjAJc3RyaW5nCWZsZjIJW2ZpZD0wMDAxMDAxMjItNzAtMDAwMEZMRjtleHQ9ZmxmO21pbWU9O11GaWdsZXQgZm9udCBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFBDTCA1IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wOS0wMSBieSBDYXJsDQowCXN0cmluZwlcXHgwMFxceDQ0XFx4MDBcXHgwMVxceDAwXFx4MDBcXHgwMFxceDFBCVtmaWQ9MDAwMDAxMzM2LTcwLTAwMDBMSUI7ZXh0PWxpYix0eXBlO21pbWU9O11JbnRlbGxpZm9udCBTY2FsYWJsZSBUeXBlZmFjZSBGb3JtYXQgIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgRGVsdXhlIFBhaW50IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wOS0wMSBieSBDYXJsDQowCXN0cmluZwlcXHgxQlxceDI5XFx4NzNcXHgzNlxceDM0XFx4NTdcXHgwMFxceDQwCVtmaWQ9MDAwMDAxMDEwLTcwLTAwMDAwME07ZXh0PW07bWltZT07XURlbHV4ZSBwYWludCBtb25vIGNvbG91ciBmb250IGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNS0yMCBieSBDYXJsDQowCWJlbG9uZwkweDAwMDEwMDAwCVtmaWQ9MDAwMDAxMDAxLTcwLTAwMDBUVEY7ZXh0PW90Zix0dGY7bWltZT07XU9wZW50eXBlIGZvbnQgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTIwIGJ5IENhcmwNCjAJc3RyaW5nCU9UVE8JW2ZpZD0wMDAwMDEwMDEtNzAtMDAwMFRURjtleHQ9b3RmLHR0ZjttaW1lPTtdT3BlbnR5cGUgZm9udCBmaWxlLCBDRkYgdHlwZQ0KDQojIE1hZ2ljIElEIGZvciBYLVdpbmRvd3MgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA5LTAxIGJ5IENhcmwNCjAJYmVsb25nCTB4MDE2NjYzNzAJW2ZpZD0wMDAwMDAwMDAtNzAtMDAwMFBDRjtleHQ9cGNmO21pbWU9O11Qb3J0YWJsZSBjb21waWxlZCBmb3JtYXQgKFBDRikgZm9udCBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMjAgYnkgQ2FybA0KMAlzdHJpbmcJJSFGb250VHlwZTEJW2ZpZD0wMDAwMDAwMDEtNzAtMDAwOTU0MTtleHQ9cGZhO21pbWU9O11UeXBlIDEgZm9udCBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMjAgYnkgQ2FybA0KMAlzdHJpbmcJJSFQUy1BZG9iZUZvbnQtMS4wCVtmaWQ9MDAwMDAwMDAxLTcwLTAwMDk1NDE7ZXh0PXBmYTttaW1lPTtdVHlwZSAxIGZvbnQgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTIwIGJ5IENhcmwNCjYJc3RyaW5nCSUhRm9udFR5cGUxCVtmaWQ9MDAwMDAxMDAzLTcwLTAwMDBQRkI7ZXh0PXBmYjttaW1lPTtdVHlwZSAxIHByaW50ZXIgZm9udCBiaW5hcnkgZmlsZQ0KJjAJYnl0ZQkweDgwCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTIwIGJ5IENhcmwNCjYJc3RyaW5nCSUhUFMtQWRvYmVGb250LTEuMAlbZmlkPTAwMDAwMTAwMy03MC0wMDAwUEZCO2V4dD1wZmI7bWltZT07XVR5cGUgMSBwcmludGVyIGZvbnQgYmluYXJ5IGZpbGUNCiYwCWJ5dGUJMHg4MAkNCg0KIyBNYWdpYyBJRCBmb3IgWC1XaW5kb3dzLCBHZW1ET1MgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA5LTAxIGJ5IENhcmwNCjIJc3RyaW5nCVxceDJFXFx4MzBcXHgwRFxceDBBXFx4MDBcXHgwMAlbZmlkPTAwMDAwMTMzNy03MC0wMDAwU1BEO2V4dD1zcGQ7bWltZT07XUJpdHN0cmVhbSBTcGVlZG8gZm9udCBmaWxlDQomMAlzdHJpbmcJRAkNCj4yNAlzdHJpbmcJeAlbdGl0bGU9JS43MHNdDQo+MQlzdHJpbmcJeAksdmVyc2lvbiAlLjFzLjANCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNS0yMCBieSBDYXJsDQowCXN0cmluZwl0cnVlCVtmaWQ9MDAwMDAxMDAyLTcwLTAwMDBUVEY7ZXh0PXR0ZjttaW1lPTtdVHJ1ZXR5cGUgZm9udCBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMjAgYnkgQ2FybA0KMAlzdHJpbmcJdHlwMQlbZmlkPTAwMDAwMTAwMi03MC0wMDAwVFRGO2V4dD10dGY7bWltZT07XVRydWV0eXBlIGZvbnQgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTIwIGJ5IENhcmwNCjAJc3RyaW5nCVN0YXJ0Q29tcEZvbnRNZXRyaWNzCVtmaWQ9MDAwMDAxMDAzLTcwLTAwMDBBRk07ZXh0PWFmbTttaW1lPTtdQWRvYmUgY29tcG9zaXRlIGZvbnQgbWV0cmljcyBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMjAgYnkgQ2FybA0KMAlzdHJpbmcJU3RhcnRGb250TWV0cmljcwlbZmlkPTAwMDAwMTAwMy03MC0wMDAwQUZNO2V4dD1hZm07bWltZT07XUFkb2JlIGZvbnQgbWV0cmljcyBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMjAgYnkgQ2FybA0KMAlzdHJpbmcJU3RhcnRNYXN0ZXJGb250TWV0cmljcwlbZmlkPTAwMDAwMTAwMy03MC0wMDAwQUZNO2V4dD1hZm07bWltZT07XUFkb2JlIG1hc3RlciBmb250IG1ldHJpY3MgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTIwIGJ5IENhcmwNCjAJbGVzaG9ydAkweDAxMDAJW2ZpZD0wMDAwMDEwMDEtNzAtMDAwMFBGTTtleHQ9cGZtO21pbWU9O11QcmludGVyIEZvbnQgTWV0cmljcyBmaWxlIGZvciBUeXBlIDEgZm9udHMNCiY2NglsZXNob3J0CTB4MDA4MQkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCWxlbG9uZwkweDc1QjIyNjMwCVtmaWQ9MDAwMDAxMDAxLTgxLTAwMDBBU0Y7ZXh0PWFzZix3bWEsd212O21pbWU9O11NaWNyb3NvZnQgQWR2YW5jZWQgU3RyZWFtaW5nIGZvcm1hdCBtdWx0aW1lZGlhIGZpbGUNCiY2CWxlc2hvcnQJMHgxMUNGCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCVJJRkYJW2ZpZD0wMDAwMDEwMDEtODEtMDAwMEFWSTtleHQ9YXZpO21pbWU9O11BdWRpby12aWRlbyBpbnRlcmxlYXZlZCBtb3ZpZSwgbGl0dGxlLWVuZGlhbg0KJjgJc3RyaW5nCUFWSVxcIAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMyBieSBDYXJsDQowCXN0cmluZwlSSUZYCVtmaWQ9MDAwMDAxMDAxLTgxLTAwMDBBVkk7ZXh0PWF2aTttaW1lPTtdQXVkaW8tdmlkZW8gaW50ZXJsZWF2ZWQgbW92aWUsIGJpZy1lbmRpYW4NCiY4CXN0cmluZwlBVklcXCAJDQoNCiMgTWFnaWMgSUQgZm9yIFF1aWNrdGltZSBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KNAlzdHJpbmcJbWRhdAlbZmlkPTAwMDAwMTAwMi04MS0wMDAwTU9WO2V4dD1tb3YscXQ7bWltZT12aWRlby9xdWlja3RpbWU7XUFwcGxlIFF1aWNrVGltZSBtb3ZpZSBkYXRhIChtZGF0KQ0KDQojIE1hZ2ljIElEIGZvciBRdWlja3RpbWUgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjQJc3RyaW5nCW1vb3YJW2ZpZD0wMDAwMDEwMDItODEtMDAwME1PVjtleHQ9bW92LHF0O21pbWU9dmlkZW8vcXVpY2t0aW1lO11BcHBsZSBRdWlja1RpbWUgbW92aWUgcmVzb3VyY2UgKG1vb3YpDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMjAgYnkgQ2FybA0KMAliZWxvbmcJMHgxQjMJW2ZpZD0wMDAwMDAwMDEtODEtMDAwTVBFRztleHQ9bXBlLG1wZWcsbXBnO21pbWU9dmlkZW8vbXBlZztdTVBFRyBtdWx0aW1lZGlhIChhdWRpby92aWRlbykgc3RyZWFtIGZpbGUNCiZaNAliZWxvbmcJMHgwMUI5CQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTIwIGJ5IENhcmwNCjAJYmVsb25nCTB4MUJBCVtmaWQ9MDAwMDAwMDAxLTgxLTAwME1QRUc7ZXh0PW1wZSxtcGVnLG1wZzttaW1lPXZpZGVvL21wZWc7XU1QRUcgbXVsdGltZWRpYSAoYXVkaW8vdmlkZW8pIHN0cmVhbSBmaWxlDQomWjQJYmVsb25nCTB4MDFCOQkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNS0yMCBieSBDYXJsDQowCWJlbG9uZwkweDFFMAlbZmlkPTAwMDAwMDAwMS04MS0wMDBNUEVHO2V4dD1tcGUsbXBlZyxtcGc7bWltZT12aWRlby9tcGVnO11NUEVHIG11bHRpbWVkaWEgKGF1ZGlvL3ZpZGVvKSBzdHJlYW0gZmlsZQ0KJlo0CWJlbG9uZwkweDAxQjkJDQoNCiMgTWFnaWMgSUQgZm9yIEFsaWFzL1dhdmVmcm9udCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJTU9WSQlbZmlkPTAwMDAwMTAwNC04MS0wMDAwME1WO2V4dD1tdjttaW1lPTtdQWxpYXMvV2F2ZWZyb250IG1vdmllIGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNS0xOCBieSBDYXJsDQowCXN0cmluZwlPZ2dTCVtmaWQ9MDAwMDAwMDAwLTgxLTAwMDBPR0c7ZXh0PW9nZzttaW1lPWFwcGxpY2F0aW9uL29nZztdT0dHIE11bHRpbWVkaWEgY29udGFpbmVyIHN0cmVhbSBmaWxlDQoNCiMgTWFnaWMgSUQgZm9yIFJlYWxwbGF5ZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTE5IGJ5IENhcmwNCjAJc3RyaW5nCS5STUYJW2ZpZD0wMDAwMDEwMjctODEtMDAwMDBSTTtleHQ9cm0scmEscnQscnAscnBhO21pbWU9O11SZWFsTWVkaWEgbXVsdGltZWRpYSBjb250YWluZXIgc3RyZWFtIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgTWFjcm9tZWRpYSBGbGFzaCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KMAlzdHJpbmcJRldTCVtmaWQ9MDAwMDAxMjU5LTgxLTAwMDBTV0Y7ZXh0PXN3ZjttaW1lPTtdU2hvY2t3YXZlIE1hY3JvbWVkaWEgYW5pbWF0aW9uDQo+MwlieXRlCXgJLCB2ZXJzaW9uICVkLjANCg0KIyBNYWdpYyBJRCBmb3IgVml2byBwbGF5ZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTIwIGJ5IENhcmwNCjUJc3RyaW5nCVZlcnNpb246Vml2bwlbZmlkPTAwMDAwMDAwMC04MS0wMDBWSVZPO2V4dD12aXYsdml2bzttaW1lPXZpZGVvL3ZuZC52aXZvO11WaXZvIG11bHRpbWVkaWEgc3RyZWFtIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgQWVnaXMgQW5pbWF0b3IgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCUZPUk0JW2ZpZD0wMDAwMDEyNjEtODItMDAwQU5JTTtleHQ9YW5pbTttaW1lPTtdQW1pZ2EgLyBTcGFydGEgc29mdHdhcmUgYW5pbWF0aW9uDQomOAlzdHJpbmcJQU5JTQkNCg0KIyBNYWdpYyBJRCBmb3IgRmFudGF2aXNpb24gbW92aWUgbWFrZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjAJc3RyaW5nCUZPUk0JW2ZpZD0wMDAwMDEyNjAtODItMDAwRkFOVDtleHQ9ZmFudDttaW1lPTtdRmFudGF2aXNpb24gbW92aWUNCiY4CXN0cmluZwlGQU5UCQ0KDQojIE1hZ2ljIElEIGZvciBBdXRvZGVzayBBbmltYXRvciBQcm8gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTA4IGJ5IENhcmwNCjQJbGVzaG9ydAkweEFGMTIJW2ZpZD0wMDAwMDEyNTQtODItMDAwMEZMQztleHQ9ZmxjO21pbWU9O11BdXRvZGVzayBBbmltYXRvciBQcm8gYW5pbWF0aW9uDQomMTIJbGVzaG9ydAkweDA4CQ0KPjgJbGVzaG9ydAl4CVtyZXM9JWR4DQo+MTAJbGVzaG9ydAl4CSVkDQo+MTIJbGVzaG9ydAl4CXg4YnBwXQ0KDQojIE1hZ2ljIElEIGZvciBBdXRvZGVzayBBbmltYXRvciBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMDggYnkgQ2FybA0KNAlsZXNob3J0CTB4QUYxMQlbZmlkPTAwMDAwMTI1NC04Mi0wMDAwRkxJO2V4dD1mbGk7bWltZT07XUF1dG9kZXNrIEFuaW1hdG9yIGFuaW1hdGlvbg0KJjEyCWxlc2hvcnQJMHgwOAkNCj44CWxlc2hvcnQJeAlbcmVzPSVkeA0KPjEwCWxlc2hvcnQJeAklZA0KPjEyCWxlc2hvcnQJeAl4OGJwcF0NCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0xMyBieSBDYXJsDQowCXN0cmluZwlcXHg4QU1OR1xceDBkXFx4MEFcXHgxQVxceDBBCVtmaWQ9MDAwMDAwMDAwLTgyLTAwMDBNTkc7ZXh0PW1uZzttaW1lPTtdTXVsdGktaW1hZ2UgbmV0d29yayBncmFwaGljcyBhbmltYXRpb24gZmlsZQ0KPjB4MTAJYmVsb25nCXgJW3Jlcz0lZHgNCj4weDE0CWJlbG9uZwl4CSVkXQ0KDQojIE1hZ2ljIElEIGZvciBDeWJlcnBhaW50IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0wOCBieSBDYXJsDQowCWJlc2hvcnQJMHhGRURCCVtmaWQ9MDAwMDAwMDAwLTgyLTAwMDBTRVE7ZXh0PXNlcTttaW1lPTtdQ3liZXJwYWludCBBbmltYXRpb24gU2VxdWVuY2UNCiYyCWJlc2hvcnQJMHgwMDAwCQ0KDQojIE1hZ2ljIElEIGZvciBRdWlja2VuLE1vbmV5IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wOC0wMSBieSBDYXJsDQowCXN0cmluZwlPRlhIRUFERVI6CVtmaWQ9MDAwMDAwMDA4LTkxLTAwMDBRRlg7ZXh0PXFmeDttaW1lPTtdT3BlbiBmaW5hbmNpYWwgZXhjaGFuZ2UgZmlsZSAoU0dNTCkNCg0KIyBNYWdpYyBJRCBmb3IgUXVpY2tlbiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDgtMDEgYnkgQ2FybA0KMQlzdHJpbmcJQWNjb3VudAlbZmlkPTAwMDAwMTMzNS05MS0wMDAwUUlGO2V4dD1xaWY7bWltZT07XVF1aWNrZW4gaW50ZXJjaGFuZ2UgZmlsZQ0KJjAJYnl0ZQkzMwkNCg0KIyBNYWdpYyBJRCBmb3IgUXVpY2tlbiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDgtMDEgYnkgQ2FybA0KMQlzdHJpbmcJVHlwZTpCYW5rCVtmaWQ9MDAwMDAxMzM1LTkxLTAwMDBRSUY7ZXh0PXFpZjttaW1lPTtdUXVpY2tlbiBpbnRlcmNoYW5nZSBmaWxlDQomMAlieXRlCTMzCQ0KDQojIE1hZ2ljIElEIGZvciBRdWlja2VuIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wOC0wMSBieSBDYXJsDQoxCXN0cmluZwlUeXBlOkNhc2gJW2ZpZD0wMDAwMDEzMzUtOTEtMDAwMFFJRjtleHQ9cWlmO21pbWU9O11RdWlja2VuIGludGVyY2hhbmdlIGZpbGUNCiYwCWJ5dGUJMzMJDQoNCiMgTWFnaWMgSUQgZm9yIFF1aWNrZW4gZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA4LTAxIGJ5IENhcmwNCjEJc3RyaW5nCVR5cGU6Q2F0CVtmaWQ9MDAwMDAxMzM1LTkxLTAwMDBRSUY7ZXh0PXFpZjttaW1lPTtdUXVpY2tlbiBpbnRlcmNoYW5nZSBmaWxlDQomMAlieXRlCTMzCQ0KDQojIE1hZ2ljIElEIGZvciBRdWlja2VuIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wOC0wMSBieSBDYXJsDQoxCXN0cmluZwlUeXBlOkNDYXJkCVtmaWQ9MDAwMDAxMzM1LTkxLTAwMDBRSUY7ZXh0PXFpZjttaW1lPTtdUXVpY2tlbiBpbnRlcmNoYW5nZSBmaWxlDQomMAlieXRlCTMzCQ0KDQojIE1hZ2ljIElEIGZvciBRdWlja2VuIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wOC0wMSBieSBDYXJsDQoxCXN0cmluZwlUeXBlOkNsYXNzCVtmaWQ9MDAwMDAxMzM1LTkxLTAwMDBRSUY7ZXh0PXFpZjttaW1lPTtdUXVpY2tlbiBpbnRlcmNoYW5nZSBmaWxlDQomMAlieXRlCTMzCQ0KDQojIE1hZ2ljIElEIGZvciBRdWlja2VuIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wOC0wMSBieSBDYXJsDQoxCXN0cmluZwlUeXBlOkludnN0CVtmaWQ9MDAwMDAxMzM1LTkxLTAwMDBRSUY7ZXh0PXFpZjttaW1lPTtdUXVpY2tlbiBpbnRlcmNoYW5nZSBmaWxlDQomMAlieXRlCTMzCQ0KDQojIE1hZ2ljIElEIGZvciBRdWlja2VuIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wOC0wMSBieSBDYXJsDQoxCXN0cmluZwlUeXBlOk1lbW9yaXplZAlbZmlkPTAwMDAwMTMzNS05MS0wMDAwUUlGO2V4dD1xaWY7bWltZT07XVF1aWNrZW4gaW50ZXJjaGFuZ2UgZmlsZQ0KJjAJYnl0ZQkzMwkNCg0KIyBNYWdpYyBJRCBmb3IgUXVpY2tlbiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDgtMDEgYnkgQ2FybA0KMQlzdHJpbmcJVHlwZTpPdGggQQlbZmlkPTAwMDAwMTMzNS05MS0wMDAwUUlGO2V4dD1xaWY7bWltZT07XVF1aWNrZW4gaW50ZXJjaGFuZ2UgZmlsZQ0KJjAJYnl0ZQkzMwkNCg0KIyBNYWdpYyBJRCBmb3IgUXVpY2tlbiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDgtMDEgYnkgQ2FybA0KMQlzdHJpbmcJVHlwZTpPdGggTAlbZmlkPTAwMDAwMTMzNS05MS0wMDAwUUlGO2V4dD1xaWY7bWltZT07XVF1aWNrZW4gaW50ZXJjaGFuZ2UgZmlsZQ0KJjAJYnl0ZQkzMwkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xMSBieSBDYXJsDQowCXN0cmluZwlSUkcJW2ZpZD0wMDAwMDEwMDEtQjAtMDAwMENSRDtleHQ9Y3JkO21pbWU9O11XaW5kb3dzIDMueCBjYXJkZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTExIGJ5IENhcmwNCjAJc3RyaW5nCU1HQwlbZmlkPTAwMDAwMTAwMS1CMC0wMDAwQ1JEO2V4dD1jcmQ7bWltZT07XVdpbmRvd3MgTlQgMy41MSBjYXJkIGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlCRUdJTjpWQ0FSRAlbZmlkPTAwMDAwMTAxNS1CMC0wMDAwVkNGO2V4dD12Y2Y7bWltZT07XXZDYXJkIEJ1c2luZXNzIENhcmQgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTAyLTE0IGJ5IENhcmwNCjAJc3RyaW5nCVxceGI1XFx4YTJcXHhiMFxceGIzXFx4YjNcXHhiMFxceGEyXFx4YjUJW2ZpZD0wMDAwMDEwMDEtQjEtMDAwMENBTDtleHQ9Y2FsO21pbWU9O11NaWNyb3NvZnQgd2luZG93cyBjYWxlbmRhciBmaWxlDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJQkVHSU46VkNBTEVOREFSCVtmaWQ9MDAwMDAxMDE2LUIxLTAwMDBWQ1M7ZXh0PXZjczttaW1lPTtddkNhbGVuZGFyL2lDYWxlbmRhciBBZ2VuZGEgZmlsZQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTE3IGJ5IENhcmwNCjAJc3RyaW5nCVxceDAwXFx4MDBcXHgwMFxceDNDXFx4MDBcXHgwMFxceDAwXFx4M0YJW2ZpZD0wMDAwMDAwMDctRjMtMDAwMFhNTDtleHQ9eG1sO21pbWU9dGV4dC94bWw7XUV4dGVuc2libGUgTWFya3VwIGxhbmd1YWdlIChYTUwpIGZpbGUsIFVURi0zMkJFIGVuY29kZWQNCiY4CWJlbG9uZwkweDAwMDAwMDc4CQ0KJjEyCWJlbG9uZwkweDAwMDAwMDZkCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTE3IGJ5IENhcmwNCjAJc3RyaW5nCVxceDAwXFx4MDBcXHhmZVxceGZmXFx4MDBcXHgwMFxceDAwXFx4M0MJW2ZpZD0wMDAwMDAwMDctRjMtMDAwMFhNTDtleHQ9eG1sO21pbWU9dGV4dC94bWw7XUV4dGVuc2libGUgTWFya3VwIGxhbmd1YWdlIChYTUwpIGZpbGUsIFVURi0zMkJFIGVuY29kZWQNCiY4CWJlbG9uZwkweDAwMDAwMDNGCQ0KJjEyCWJlbG9uZwkweDAwMDAwMDc4CQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTE3IGJ5IENhcmwNCjAJc3RyaW5nCVxceDAwXFx4M0NcXHgwMFxceDNGXFx4MDBcXHg3OFxceDAwXFx4NkRcXHgwMFxceDZjCVtmaWQ9MDAwMDAwMDA3LUYzLTAwMDBYTUw7ZXh0PXhtbDttaW1lPXRleHQveG1sO11FeHRlbnNpYmxlIE1hcmt1cCBsYW5ndWFnZSAoWE1MKSBmaWxlLCBVVEYtMTZCRSBlbmNvZGVkDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMTcgYnkgQ2FybA0KMAlzdHJpbmcJXFx4M0NcXHgwMFxceDAwXFx4MDBcXHgzRlxceDAwXFx4MDBcXHgwMAlbZmlkPTAwMDAwMDAwNy1GMy0wMDAwWE1MO2V4dD14bWw7bWltZT10ZXh0L3htbDtdRXh0ZW5zaWJsZSBNYXJrdXAgbGFuZ3VhZ2UgKFhNTCkgZmlsZSwgVVRGLTMyTEUgZW5jb2RlZA0KJjgJYmVzaG9ydAkweDAwMDAwMDc4CQ0KJjEyCWJlc2hvcnQJMHgwMDAwMDA2ZAkNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNS0xNyBieSBDYXJsDQowCXN0cmluZwlcXHgzQ1xceDAwXFx4M0ZcXHgwMFxceDc4XFx4MDBcXHg2RFxceDAwXFx4NmNcXHgwMAlbZmlkPTAwMDAwMDAwNy1GMy0wMDAwWE1MO2V4dD14bWw7bWltZT10ZXh0L3htbDtdRXh0ZW5zaWJsZSBNYXJrdXAgbGFuZ3VhZ2UgKFhNTCkgZmlsZSwgVVRGLTE2TEUgZW5jb2RlZA0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTE3IGJ5IENhcmwNCjAJc3RyaW5nCVxceGVmXFx4YmJcXHhiZjw/eG1sCVtmaWQ9MDAwMDAwMDA3LUYzLTAwMDBYTUw7ZXh0PXhtbDttaW1lPXRleHQveG1sO11FeHRlbnNpYmxlIE1hcmt1cCBsYW5ndWFnZSAoWE1MKSBmaWxlLCBVVEYtOCBlbmNvZGVkDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMTcgYnkgQ2FybA0KMAlzdHJpbmcJXFx4ZmVcXHhmZlxceDAwXFx4M0NcXHgwMFxceDNGXFx4MDBcXHg3OFxceDAwXFx4NkQJW2ZpZD0wMDAwMDAwMDctRjMtMDAwMFhNTDtleHQ9eG1sO21pbWU9dGV4dC94bWw7XUV4dGVuc2libGUgTWFya3VwIGxhbmd1YWdlIChYTUwpIGZpbGUsIFVURi0xNkJFIGVuY29kZWQNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNS0xNyBieSBDYXJsDQowCXN0cmluZwlcXHhmZlxceGZlXFx4MDBcXHgwMFxceDNDXFx4MDBcXHgwMFxceDAwCVtmaWQ9MDAwMDAwMDA3LUYzLTAwMDBYTUw7ZXh0PXhtbDttaW1lPXRleHQveG1sO11FeHRlbnNpYmxlIE1hcmt1cCBsYW5ndWFnZSAoWE1MKSBmaWxlLCBVVEYtMzJMRSBlbmNvZGVkDQomOAliZXNob3J0CTB4M0YwMDAwMDAJDQomMTIJYmVzaG9ydAkweDc4MDAwMDAwCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTA1LTE3IGJ5IENhcmwNCjAJc3RyaW5nCVxceGZmXFx4ZmVcXHgzQ1xceDAwXFx4M0ZcXHgwMFxceDc4XFx4MDBcXHg2RFxceDAwCVtmaWQ9MDAwMDAwMDA3LUYzLTAwMDBYTUw7ZXh0PXhtbDttaW1lPXRleHQveG1sO11FeHRlbnNpYmxlIE1hcmt1cCBsYW5ndWFnZSAoWE1MKSBmaWxlLCBVVEYtMTZMRSBlbmNvZGVkDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDUtMTcgYnkgQ2FybA0KMAlzdHJpbmcJPD94bWwJW2ZpZD0wMDAwMDAwMDctRjMtMDAwMFhNTDtleHQ9eG1sO21pbWU9dGV4dC94bWw7XUV4dGVuc2libGUgTWFya3VwIGxhbmd1YWdlIChYTUwpIGZpbGUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wNC0yMCBieSBDYXJsDQowCXN0cmluZwlcXHhkMFxceGNmXFx4MTFcXHhlMFxceGExXFx4YjFcXHgxYVxceGUxCVtmaWQ9MDAwMDAxMDAxLUY0LTAwMDBPTEU7ZXh0PW9sZTttaW1lPTtdTWljcm9zb2Z0IE9MRSBDb21wb3VuZCBmaWxlLCBiaWctZW5kaWFuDQomMHgxQwlsZXNob3J0CSEweEZGRkUJDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMDQtMjAgYnkgQ2FybA0KMAlzdHJpbmcJXFx4ZDBcXHhjZlxceDExXFx4ZTBcXHhhMVxceGIxXFx4MWFcXHhlMQlbZmlkPTAwMDAwMTAwMS1GNC0wMDAwT0xFO2V4dD1vbGU7bWltZT07XU1pY3Jvc29mdCBPTEUgQ29tcG91bmQgZmlsZSwgbGl0dGxlLWVuZGlhbg0KJjB4MUMJbGVzaG9ydAkweEZGRkUJDQo+MHgxQQlsZXNob3J0CXgJLCB2ZXJzaW9uICVkDQo+MHgxOAlsZXNob3J0CXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIEZyZWVwYXNjYWwgY29tcGlsZXIgZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTEwLTI0IGJ5IENhcmwNCjAJc3RyaW5nCVBQVTAJW2ZpZD0wMDAxMDAxMjAtMTEtMDAwMFBQVTtleHQ9cHB1LHBwbCxwcG8scHB3LHBwYSxwcHQ7bWltZT07XUZyZWVwYXNjYWwgdW5pdCBmaWxlDQo+MHgwNAlzdHJpbmcJeAksIHZlcnNpb24gJS4ycw0KDQojIE1hZ2ljIElEIGZvciBTbWFydGNhcmRzIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0xMC0yOSBieSBDYXJsDQowCWJlbG9uZwkweDAwRkFDQURFCVtmaWQ9MDAwMDAxMDExLTEwLTAwMDBFWFA7ZXh0PWV4cDttaW1lPTtdSmF2YWNhcmQgQVBJIGV4cG9ydCBmaWxlDQo+MHgwNQlieXRlCXgJLCB2ZXJzaW9uICVkDQo+NAlieXRlCXgJLiVkDQoNCiMgU3VibWl0dGVkIG9uIDIwMDQtMTAtMjkgYnkgQ2FybA0KMAlzdHJpbmcJLXJvbTFmcy0JW2ZpZD0wMDAxMDAxMjEtMEYtMDAwMElNRztleHQ9aW1nO21pbWU9O11TaW1wbGUgUk9NIGZpbGVzeXN0ZW0gKFJPTUZTKQ0KPjE2CXN0cmluZwl4CVt0aXRsZT0lc10NCg0KIyBNYWdpYyBJRCBmb3IgVmlydHVhbCBQQyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMTAtMjkgYnkgQ2FybA0KMAlzdHJpbmcJY29uZWN0aXgJW2ZpZD0wMDAwMDEwMDEtMEYtMDAwMFZIRDtleHQ9dmhkO21pbWU9O11WaXJ0dWFsIFBDIEhhcmQgZHJpdmUNCg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0xMS0xMiBieSBDYXJsIEVyaWMgQ29kZXJlDQowCXN0cmluZwklIVBTLUFkb2JlLQlbZmlkPTAwMDAwMTAwMy0zMy0wMDAwMFBTO2V4dD1wcyxlcHM7bWltZT1hcHBsaWNhdGlvbi9wb3N0c2NyaXB0O11Qb3N0c2NyaXB0IGZpbGUNCj4xMQlzdHJpbmcJeAksIGxldmVsICUuMXMNCj4xMwlzdHJpbmcJeAkuJS4xcw0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTExLTEyIGJ5IENhcmwgRXJpYyBDb2RlcmUNCjAJbGVsb25nCTB4NTI2ZjZkMmUJW2ZpZD0wMDAwMDEzMzgtMEYtMDAwMFJPTTtleHQ9cm9tLGZzO21pbWU9O11lQ29zIFJPTSBGaWxlc3lzdGVtIGltYWdlIChST01GUykNCj4xNglzdHJpbmcJeAlbdGl0bGU9JS4xNnNdDQoNCiMgTWFnaWMgSUQgZm9yIFBBREdlbiBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMTEtMjYgYnkgQ2FybCBFcmljIENvZGVyZQ0KMHgyOQlzdHJpbmcJPFhNTF9ESVpfSU5GTz4JW2ZpZD0wMDAwMDEzMzktQTAtMDAwMFhNTDtleHQ9eG1sO21pbWU9dGV4dC94bWw7XVBvcnRhYmxlIGFwcGxpY2F0aW9uIGRlc2NyaXB0aW9uIGZpbGUgKFhNTCkNCiYwCXN0cmluZwk8P3htbAkNCg0KIyBNYWdpYyBJRCBmb3IgUEFER2VuIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0xMS0yNiBieSBDYXJsIEVyaWMgQ29kZXJlDQoweDI4CXN0cmluZwk8WE1MX0RJWl9JTkZPPglbZmlkPTAwMDAwMTMzOS1BMC0wMDAwWE1MO2V4dD14bWw7bWltZT10ZXh0L3htbDtdUG9ydGFibGUgYXBwbGljYXRpb24gZGVzY3JpcHRpb24gZmlsZSAoWE1MKQ0KJjAJc3RyaW5nCTw/eG1sCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTExLTI2IGJ5IENhcmwgRXJpYyBDb2RlcmUNCjB4MjkJc3RyaW5nCTx4OnhtcG1ldGFcXCAJW2ZpZD0wMDAwMDEwMDMtQTAtMDAwMFhNUDtleHQ9eG1sLHhtcDttaW1lPXRleHQveG1sO11FeHRlbnNpYmxlIG1ldGFkYXRhIHBsYXRmb3JtIHNpZGVjYXIgZmlsZSAoWE1MKQ0KJjAJc3RyaW5nCTw/eG1sCQ0KDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTExLTI2IGJ5IENhcmwgRXJpYyBDb2RlcmUNCjB4MjgJc3RyaW5nCTx4OnhtcG1ldGFcXCAJW2ZpZD0wMDAwMDEwMDMtQTAtMDAwMFhNUDtleHQ9eG1sLHhtcDttaW1lPXRleHQveG1sO11FeHRlbnNpYmxlIG1ldGFkYXRhIHBsYXRmb3JtIHNpZGVjYXIgZmlsZSAoWE1MKQ0KJjAJc3RyaW5nCTw/eG1sCQ0KDQojIE1hZ2ljIElEIGZvciBUZXhpbmZvIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0xMS0yNiBieSBDYXJsIEVyaWMgQ29kZXJlDQoxCXN0cmluZwlpbnB1dCB0ZXhpbmZvCVtmaWQ9MDAwMDAxMzQwLTAwLTAwMFRFWEk7ZXh0PXRleGk7bWltZT07XVRleGluZm8gc291cmNlIGZpbGUNCg0KIyBNYWdpYyBJRCBmb3IgTVMtRE9TIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0xMS0yNiBieSBDYXJsIEVyaWMgQ29kZXJlDQowCXN0cmluZwlcXHhGRkZPTlQJW2ZpZD0wMDAwMDEwMDEtNzAtMDAwMENQSTtleHQ9Y3BpO21pbWU9O11NUy1ET1MgY29kZSBwYWdlIHJhc3RlciBmb250DQoNCiMgTWFnaWMgSUQgZm9yIFVOSVggZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA0LTExLTI2IGJ5IENhcmwgRXJpYyBDb2RlcmUNCjAJc3RyaW5nCVRaaWYJW2ZpZD0wMDAwMDAwMDAtOTAtMDAwMDAwMDtleHQ9O21pbWU9O11UaW1lem9uZSBpbmZvcm1hdGlvbiBkYXRhYmFzZSBmaWxlIChjb21waWxlZCkNCg0KIyBNYWdpYyBJRCBmb3IgVGVsaXggZmlsZXMuDQojIFN1Ym1pdHRlZCBvbiAyMDA1LTAzLTA0IGJ5IENhcmwgRXJpYyBDb2RlcmUNCjAJbGVsb25nCTB4MmUyYjI5MWEJW2ZpZD0wMDAxMDAxMjYtQjAtMDAwMEZPTjtleHQ9Zm9uO21pbWU9O11UZWxpeCBwaG9uZSBib29rDQomNAlsZXNob3J0CTEJDQoNCiMgTWFnaWMgSUQgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNS0wMy0wNCBieSBDYXJsIEVyaWMgQ29kZXJlDQowCXN0cmluZwlWQ1BDSDBcXHgwMFxceDAwCVtmaWQ9MDAwMDAxMDAxLTkwLTAwMDBQQ0g7ZXh0PXBjaDttaW1lPTtdTWljcm9zb2Z0IFZpc3VhbCBDKysgcHJlLWNvbXBpbGVkIGhlYWRlcihzKQ0KDQojIE1hZ2ljIElEIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDUtMDMtMDQgYnkgQ2FybCBFcmljIENvZGVyZQ0KMAlzdHJpbmcJTWljcm9zb2Z0XFwgQy9DKytcXCBwcm9ncmFtXFwgZGF0YWJhc2UJW2ZpZD0wMDAwMDEwMDEtOTAtMDAwMFBEQjtleHQ9cGRiO21pbWU9O11NaWNyb3NvZnQgVmlzdWFsIEMrKyBkZWJ1ZyBpbmZvcm1hdGlvbiBkYXRhYmFzZQ0KJjB4MjUJc3RyaW5nCVxceDBEXFx4MEFcXHgxQQkNCiYweDI4CXN0cmluZwlKR1xceDAwCQ0KDQojIE1hZ2ljIElEIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDUtMDMtMDQgYnkgQ2FybCBFcmljIENvZGVyZQ0KMAlzdHJpbmcJTWljcm9zb2Z0XFwgTGlua2VyXFwgRGF0YWJhc2VcXHgwQVxceDA3XFx4MUEJW2ZpZD0wMDAwMDEwMDEtOTAtMDAwMElMSztleHQ9aWxrO21pbWU9O11NaWNyb3NvZnQgVmlzdWFsIEMrKyBsaW5rZXIgZGF0YWJhc2UNCg0KDQojIENSQzMyOjhCQzNCQTQ2DQo='
);
-
/**
* Returns the test data for a given key
*
diff --git a/cake/tests/cases/libs/model/behavior.test.php b/cake/tests/cases/libs/model/behavior.test.php
index 628397fa3..9b3760259 100644
--- a/cake/tests/cases/libs/model/behavior.test.php
+++ b/cake/tests/cases/libs/model/behavior.test.php
@@ -1,7 +1,7 @@
assertIdentical($Apple->beforeTestResult, $expected);
}
-
/**
* Test attach and detaching
*
+ * @access public
* @return void
**/
function testBehaviorAttachAndDetach() {
@@ -954,19 +960,8 @@ class BehaviorTest extends CakeTestCase {
$Sample->Behaviors->init($Sample->alias, $Sample->actsAs);
$Sample->Behaviors->attach('Test2');
$Sample->Behaviors->detach('Test3');
-
+
$Sample->Behaviors->trigger($Sample, 'beforeTest');
}
-
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- ClassRegistry::flush();
- }
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/behaviors/acl.test.php b/cake/tests/cases/libs/model/behaviors/acl.test.php
index 47ffc4a79..3ca1974e3 100644
--- a/cake/tests/cases/libs/model/behaviors/acl.test.php
+++ b/cake/tests/cases/libs/model/behaviors/acl.test.php
@@ -1,7 +1,7 @@
'mother_id'
)
);
-
/**
- * ParentNode
+ * parentNode method
*
* @return void
- **/
+ * @access public
+ */
function parentNode() {
if (!$this->id && empty($this->data)) {
return null;
@@ -99,13 +98,11 @@ class AclPerson extends CakeTestModel {
return array('AclPerson' => array('id' => $data['AclPerson']['mother_id']));
}
}
-
}
-
/**
-* Acl Test User
+* AclUser class
*
-* @package cake.tests
+* @package cake
* @subpackage cake.tests.cases.libs.model.behaviors
*/
class AclUser extends CakeTestModel {
@@ -139,11 +136,10 @@ class AclUser extends CakeTestModel {
return null;
}
}
-
/**
-* Acl Test User
+* AclPost class
*
-* @package cake.tests
+* @package cake
* @subpackage cake.tests.cases.libs.model.behaviors
*/
class AclPost extends CakeTestModel {
@@ -177,33 +173,62 @@ class AclPost extends CakeTestModel {
return null;
}
}
-
/**
-* ACL behavior test class
+* AclBehaviorTest class
*
-* @package cake.tests
+* @package cake
* @subpackage cake.tests.cases.libs.controller.components
*/
class AclBehaviorTestCase extends CakeTestCase {
+/**
+ * Aco property
+ *
+ * @var Aco
+ * @access public
+ */
+ var $Aco;
+/**
+ * Aro property
+ *
+ * @var Aro
+ * @access public
+ */
+ var $Aro;
+/**
+ * fixtures property
+ *
+ * @var array
+ * @access public
+ */
var $fixtures = array('core.person', 'core.user', 'core.post', 'core.aco', 'core.aro', 'core.aros_aco');
-
/**
* Set up the test
*
* @return void
- **/
+ * @access public
+ */
function startTest() {
Configure::write('Acl.database', 'test_suite');
$this->Aco =& new Aco();
$this->Aro =& new Aro();
}
-
+/**
+ * tearDown method
+ *
+ * @return void
+ * @access public
+ */
+ function tearDown() {
+ ClassRegistry::flush();
+ unset($this->Aro, $this->Aco);
+ }
/**
* Test Setup of AclBehavior
*
* @return void
- **/
+ * @access public
+ */
function testSetup() {
$User =& new AclUser();
$this->assertTrue(isset($User->Behaviors->Acl->settings['User']));
@@ -215,12 +240,12 @@ class AclBehaviorTestCase extends CakeTestCase {
$this->assertEqual($Post->Behaviors->Acl->settings['Post']['type'], 'controlled');
$this->assertTrue(is_object($Post->Aco));
}
-
/**
* test After Save
*
* @return void
- **/
+ * @access public
+ */
function testAfterSave() {
$Post =& new AclPost();
$data = array(
@@ -264,12 +289,12 @@ class AclBehaviorTestCase extends CakeTestCase {
$this->assertEqual($node[0]['Aro']['parent_id'], 5);
$this->assertEqual($node[1]['Aro']['parent_id'], null);
}
-
/**
* Test After Delete
*
* @return void
- **/
+ * @access public
+ */
function testAfterDelete() {
$aroData = array(
'Aro' => array(
@@ -317,12 +342,12 @@ class AclBehaviorTestCase extends CakeTestCase {
$this->assertTrue(empty($result));
}
-
/**
* Test Node()
*
* @return void
- **/
+ * @access public
+ */
function testNode() {
$Person =& new AclPerson();
$aroData = array(
@@ -339,16 +364,5 @@ class AclBehaviorTestCase extends CakeTestCase {
$this->assertTrue(is_array($result));
$this->assertEqual(sizeof($result), 1);
}
-
-/**
- * tear down test
- *
- * @return void
- **/
- function tearDown() {
- ClassRegistry::flush();
- unset($this->Aro, $this->Aco);
- }
-
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/behaviors/containable.test.php b/cake/tests/cases/libs/model/behaviors/containable.test.php
index 9a7a2f4e1..b5f801df8 100644
--- a/cake/tests/cases/libs/model/behaviors/containable.test.php
+++ b/cake/tests/cases/libs/model/behaviors/containable.test.php
@@ -1,7 +1,7 @@
+?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/behaviors/translate.test.php b/cake/tests/cases/libs/model/behaviors/translate.test.php
index 4c0393df7..20eb3651c 100644
--- a/cake/tests/cases/libs/model/behaviors/translate.test.php
+++ b/cake/tests/cases/libs/model/behaviors/translate.test.php
@@ -1,7 +1,7 @@
simulated[count($this->simulated) - 1];
}
}
-
/**
- * Short description for class.
+ * AdodbTestModel
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources
*/
class AdodbTestModel extends CakeTestModel {
@@ -152,7 +149,6 @@ class AdodbTestModel extends CakeTestModel {
);
}
}
-
if (!class_exists('Article')) {
/**
* Article class
@@ -171,11 +167,10 @@ if (!class_exists('Article')) {
}
}
-
/**
- * The test class for the DboAdobd
+ * DboAdodbTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources.dbo
*/
class DboAdodbTest extends CakeTestCase {
@@ -186,14 +181,13 @@ class DboAdodbTest extends CakeTestCase {
* @access public
*/
var $db = null;
-
/**
- * undocumented class variable
+ * fixtures property
*
* @var string
+ * @access public
**/
var $fixtures = array('core.article');
-
/**
* Skip if cannot connect to AdoDb
*
@@ -280,6 +274,5 @@ class DboAdodbTest extends CakeTestCase {
function testColumns() {
}
-
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
index cc8448a3e..ab5592200 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
@@ -1,7 +1,7 @@
connected = true;
return true;
}
- function lastError() {}
+/**
+ * lastError method
+ *
+ * @return void
+ * @access public
+ */
+ function lastError() {
+ }
/**
* simulated property
*
@@ -104,11 +121,10 @@ class DboMssqlTestDb extends DboMssql {
return $this->simulated[count($this->simulated) - 1];
}
}
-
/**
- * Short description for class.
+ * MssqlTestModel class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources
*/
class MssqlTestModel extends Model {
@@ -183,9 +199,9 @@ class MssqlTestModel extends Model {
}
}
/**
- * The test class for the DboMssql
+ * DboMssqlTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources.dbo
*/
class DboMssqlTest extends CakeTestCase {
@@ -215,6 +231,16 @@ class DboMssqlTest extends CakeTestCase {
$this->db = new DboMssqlTestDb($db->config);
$this->model = new MssqlTestModel();
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->model);
+ }
+
/**
* testQuoting method
*
@@ -314,7 +340,12 @@ class DboMssqlTest extends CakeTestCase {
);
$this->assertEqual($result, $expected);
}
-
+/**
+ * testUpdateAllSyntax method
+ *
+ * @return void
+ * @access public
+ */
function testUpdateAllSyntax() {
$model = ClassRegistry::init('MssqlTestModel');
$fields = array('MssqlTestModel.client_id' => '[MssqlTestModel].[client_id] + 1');
@@ -326,15 +357,5 @@ class DboMssqlTest extends CakeTestCase {
$this->assertPattern('/^UPDATE \[mssql_test_models\]/', $result);
$this->assertPattern('/SET \[client_id\] = \[client_id\] \+ 1/', $result);
}
-
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->model);
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mysql.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mysql.test.php
index dda8322cf..3d94dc6af 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mysql.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mysql.test.php
@@ -1,7 +1,7 @@
db->query($this->db->dropSchema($schema1));
}
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mysqli.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mysqli.test.php
index 38ab1b891..9031164dd 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mysqli.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mysqli.test.php
@@ -1,7 +1,7 @@
assertEqual($result, $expected);
}
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_oracle.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_oracle.test.php
index 0cacb783c..314fcfce8 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_oracle.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_oracle.test.php
@@ -1,7 +1,7 @@
db->config['password'] = $old_pw;
$this->db->connect();
}
-
/**
* testName method
*
@@ -131,10 +128,5 @@ class DboOracleTest extends CakeTestCase {
$this->assertEqual($e, $r);
}
-
-
-
-
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_postgres.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_postgres.test.php
index c6ff8a5f0..bae7ad584 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_postgres.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_postgres.test.php
@@ -1,7 +1,7 @@
assertEqual($this->db->buildColumn($result), $expected);
}
-
/**
* Tests that binary data is escaped/unescaped properly on reads and writes
*
@@ -409,7 +406,6 @@ class DboPostgresTest extends CakeTestCase {
$result = $model->find('first');
$this->assertEqual($result['BinaryTest']['data'], $data);
}
-
/**
* Tests the syntax of generated schema indexes
*
@@ -479,7 +475,6 @@ class DboPostgresTest extends CakeTestCase {
$db1->query('DROP TABLE ' . $db1->fullTableName('datatypes'));
}
-
/**
* Test index generation from table info.
*
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php
index a22cc7721..adfad9dbc 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php
@@ -1,7 +1,7 @@
assertEqual($expected, $result);
$this->db->query('DROP TABLE ' . $name);
}
-
/**
* Tests that cached table descriptions are saved under the sanitized key name
*
@@ -207,5 +205,4 @@ class DboSqliteTest extends CakeTestCase {
Configure::write('Cache.disable', true);
}
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/datasources/dbo_source.test.php b/cake/tests/cases/libs/model/datasources/dbo_source.test.php
index 54375cf7e..cb10ebc46 100644
--- a/cake/tests/cases/libs/model/datasources/dbo_source.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo_source.test.php
@@ -1,7 +1,7 @@
_schema;
}
}
+/**
+ * TestModel4TestModel7 class
+ *
+ * @package cake
+ * @subpackage cake.tests.cases.libs.model.datasources
+ */
class TestModel4TestModel7 extends CakeTestModel {
/**
* name property
@@ -271,9 +276,9 @@ class TestModel4TestModel7 extends CakeTestModel {
}
}
/**
- * Short description for class.
+ * TestModel5 class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources
*/
class TestModel5 extends CakeTestModel {
@@ -338,9 +343,9 @@ class TestModel5 extends CakeTestModel {
}
}
/**
- * Short description for class.
+ * TestModel6 class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources
*/
class TestModel6 extends CakeTestModel {
@@ -395,9 +400,9 @@ class TestModel6 extends CakeTestModel {
}
}
/**
- * Short description for class.
+ * TestModel7 class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources
*/
class TestModel7 extends CakeTestModel {
@@ -441,9 +446,9 @@ class TestModel7 extends CakeTestModel {
}
}
/**
- * Short description for class.
+ * TestModel8 class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources
*/
class TestModel8 extends CakeTestModel {
@@ -501,9 +506,9 @@ class TestModel8 extends CakeTestModel {
}
}
/**
- * Short description for class.
+ * TestModel9 class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources
*/
class TestModel9 extends CakeTestModel {
@@ -1136,11 +1141,10 @@ class ArticleFeatured2 extends CakeTestModel {
return $this->_schema;
}
}
-
/**
- * Short description for class.
+ * DboSourceTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.model.datasources
*/
class DboSourceTest extends CakeTestCase {
@@ -3135,7 +3139,7 @@ class DboSourceTest extends CakeTestCase {
'fields' => null, 'order' => null, 'recursive' => null
));
$this->assertEqual($result, $expected);
-
+
$result = $this->testDb->query('findByFindBy', array('value'), $this->Model);
$expected = array('first', array(
'conditions' => array('TestModel.find_by' => 'value'),
@@ -3806,5 +3810,4 @@ class DboSourceTest extends CakeTestCase {
$this->assertNoPattern('/Took:/s', $contents);
}
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/db_acl.test.php b/cake/tests/cases/libs/model/db_acl.test.php
index dc8fd24be..82d4d15ad 100644
--- a/cake/tests/cases/libs/model/db_acl.test.php
+++ b/cake/tests/cases/libs/model/db_acl.test.php
@@ -1,7 +1,7 @@
array('with' => 'DbPermissionTest'));
}
-
/**
-* Aco Test Wrapper
-*
-* @package cake.tests
-* @subpackage cake.tests.cases.libs.controller.components
-*/
+ * Aco Test Wrapper
+ *
+ * @package cake
+ * @subpackage cake.tests.cases.libs.controller.components
+ */
class DbAcoTest extends DbAclNodeTestBase {
/**
* name property
@@ -113,13 +109,12 @@ class DbAcoTest extends DbAclNodeTestBase {
*/
var $hasAndBelongsToMany = array('DbAroTest' => array('with' => 'DbPermissionTest'));
}
-
/**
-* Permission Test Wrapper
-*
-* @package cake.tests
-* @subpackage cake.tests.cases.libs.controller.components
-*/
+ * Permission Test Wrapper
+ *
+ * @package cake
+ * @subpackage cake.tests.cases.libs.controller.components
+ */
class DbPermissionTest extends CakeTestModel {
/**
* name property
@@ -151,11 +146,11 @@ class DbPermissionTest extends CakeTestModel {
var $belongsTo = array('DbAroTest' => array('foreignKey' => 'aro_id'), 'DbAcoTest' => array('foreignKey' => 'aco_id'));
}
/**
-* Short description for class.
-*
-* @package cake.tests
-* @subpackage cake.tests.cases.libs.controller.components
-*/
+ * DboActionTest class
+ *
+ * @package cake
+ * @subpackage cake.tests.cases.libs.controller.components
+ */
class DbAcoActionTest extends CakeTestModel {
/**
* name property
@@ -180,11 +175,11 @@ class DbAcoActionTest extends CakeTestModel {
var $belongsTo = array('DbAcoTest' => array('foreignKey' => 'aco_id'));
}
/**
-* Short description for class.
-*
-* @package cake.tests
-* @subpackage cake.tests.cases.libs.controller.components
-*/
+ * DbAroUserTest class
+ *
+ * @package cake
+ * @subpackage cake.tests.cases.libs.controller.components
+ */
class DbAroUserTest extends CakeTestModel {
/**
* name property
@@ -215,13 +210,12 @@ class DbAroUserTest extends CakeTestModel {
}
}
}
-
/**
-* Short description for class.
-*
-* @package cake.tests
-* @subpackage cake.tests.cases.libs.controller.components
-*/
+ * DbAclTest class
+ *
+ * @package cake
+ * @subpackage cake.tests.cases.libs.controller.components
+ */
class DbAclTest extends DbAcl {
/**
* construct method
@@ -237,9 +231,9 @@ class DbAclTest extends DbAcl {
}
}
/**
- * Short description for class.
+ * AclNodeTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.controller.components.dbacl.models
*/
class AclNodeTest extends CakeTestCase {
diff --git a/cake/tests/cases/libs/model/model.test.php b/cake/tests/cases/libs/model/model.test.php
index 6c9760b81..a4845b77f 100644
--- a/cake/tests/cases/libs/model/model.test.php
+++ b/cake/tests/cases/libs/model/model.test.php
@@ -1,7 +1,7 @@
debug);
}
+/**
+ * endTest method
+ *
+ * @access public
+ * @return void
+ */
+ function endTest() {
+ ClassRegistry::flush();
+ }
/**
* testAutoConstructAssociations method
*
@@ -956,7 +963,6 @@ class ModelTest extends CakeTestCase {
$result = $Article->read(null, 2);
$this->assertEqual($result['Article']['title'], 'Staying alive');
}
-
/**
* testCreationOfEmptyRecord method
*
@@ -3182,7 +3188,6 @@ class ModelTest extends CakeTestCase {
Configure::write('Cache.check', $_back['check']);
Configure::write('Cache.disable', $_back['disable']);
}
-
/**
* testSaveAll method
*
@@ -3248,12 +3253,12 @@ class ModelTest extends CakeTestCase {
$expected = array('id' => '2', 'comment_id' => '7', 'attachment' => 'some_file.tgz', 'created' => $ts, 'updated' => $ts);
$this->assertEqual($result[6]['Attachment'], $expected);
}
-
/**
* Test SaveAll with Habtm relations
*
+ * @access public
* @return void
- **/
+ */
function testSaveAllHabtm() {
$this->loadFixtures('Article', 'Tag', 'Comment', 'User');
$data = array(
@@ -3279,7 +3284,12 @@ class ModelTest extends CakeTestCase {
$this->assertEqual(count($result['Comment']), 1);
$this->assertEqual(count($result['Comment'][0]['comment']['Article comment']), 1);
}
-
+/**
+ * Test SaveAll with Habtm relations and extra join table fields
+ *
+ * @access public
+ * @return void
+ */
function testSaveAllHabtmWithExtraJoinTableFields() {
$this->loadFixtures('Something', 'SomethingElse', 'JoinThing');
@@ -3753,7 +3763,6 @@ class ModelTest extends CakeTestCase {
);
$this->assertEqual($TestModel->validationErrors, $expected);
}
-
/**
* testSaveAllValidateFirst method
*
@@ -3929,7 +3938,6 @@ class ModelTest extends CakeTestCase {
$expected = array_fill(0, 1, 1);
$this->assertEqual($result, $expected);
}
-
/**
* testSaveWithCounterCacheScope method
*
@@ -4786,7 +4794,6 @@ class ModelTest extends CakeTestCase {
$expected = $TestModel->save($data);
$this->assertFalse($expected);
}
-
// function testBasicValidation() {
// $TestModel =& new ValidationTest();
// $TestModel->testing = true;
@@ -5537,7 +5544,6 @@ class ModelTest extends CakeTestCase {
$this->assertIdentical($result['DataTest']['count'], '0');
$this->assertIdentical($result['DataTest']['float'], '0');
}
-
/**
* testNonNumericHabtmJoinKey method
*
@@ -5827,7 +5833,6 @@ class ModelTest extends CakeTestCase {
$this->assertEqual($db2->fullTableName($TestModel, false), 'apples');
$this->assertEqual($db1->fullTableName($TestModel, false), 'apples');
}
-
/**
* testDynamicBehaviorAttachment method
*
@@ -5858,7 +5863,6 @@ class ModelTest extends CakeTestCase {
$this->assertEqual($TestModel->Behaviors->attached(), array());
$this->assertFalse(isset($TestModel->Behaviors->Tree));
}
-
/**
* Tests cross database joins. Requires $test and $test2 to both be set in DATABASE_CONFIG
* NOTE: When testing on MySQL, you must set 'persistent' => false on *both* database connections,
@@ -6477,7 +6481,12 @@ class ModelTest extends CakeTestCase {
$result = $Portfolio->ItemsPortfolio->find('all', array('conditions' => array('ItemsPortfolio.portfolio_id' => 1)));
$this->assertFalse($result);
}
-
+/**
+ * testDeleteArticleBLinks method
+ *
+ * @access public
+ * @return void
+ */
function testDeleteArticleBLinks() {
$this->loadFixtures('Article', 'ArticlesTag', 'Tag');
$TestModel =& new ArticleB();
@@ -6500,21 +6509,16 @@ class ModelTest extends CakeTestCase {
);
$this->assertEqual($result, $expected);
}
-
+/**
+ * testPkInHAbtmLinkModelArticleB
+ *
+ * @access public
+ * @return void
+ */
function testPkInHabtmLinkModelArticleB() {
$this->loadFixtures('Article', 'Tag');
$TestModel2 =& new ArticleB();
$this->assertEqual($TestModel2->ArticlesTag->primaryKey, 'article_id');
}
-/**
- * endTest method
- *
- * @access public
- * @return void
- */
- function endTest() {
- ClassRegistry::flush();
- }
}
-
-?>
+?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/models.php b/cake/tests/cases/libs/model/models.php
index 95170c748..8f1423e9c 100644
--- a/cake/tests/cases/libs/model/models.php
+++ b/cake/tests/cases/libs/model/models.php
@@ -1,7 +1,7 @@
Schema = new TestAppSchema();
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->Schema);
+ }
/**
* testSchemaName method
*
@@ -471,7 +479,7 @@ class CakeSchemaTest extends CakeTestCase {
function testSchemaCreateTable() {
$db =& ConnectionManager::getDataSource('test_suite');
$db->cacheSources = false;
-
+
$Schema =& new CakeSchema(array(
'connection' => 'test_suite',
'testdescribes' => array(
@@ -481,25 +489,16 @@ class CakeSchemaTest extends CakeTestCase {
),
));
$sql = $db->createSchema($Schema);
-
+
$col = $Schema->tables['testdescribes']['int_null'];
$col['name'] = 'int_null';
$column = $this->db->buildColumn($col);
$this->assertPattern('/' . preg_quote($column, '/') . '/', $sql);
-
+
$col = $Schema->tables['testdescribes']['int_not_null'];
$col['name'] = 'int_not_null';
$column = $this->db->buildColumn($col);
$this->assertPattern('/' . preg_quote($column, '/') . '/', $sql);
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->Schema);
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/multibyte.test.php b/cake/tests/cases/libs/multibyte.test.php
index c97c40efc..68950cc78 100644
--- a/cake/tests/cases/libs/multibyte.test.php
+++ b/cake/tests/cases/libs/multibyte.test.php
@@ -1,7 +1,7 @@
methodCalls[] = array('methodWithOptionalParam' => array($param));
}
-
/**
* testPersist
*
@@ -250,24 +249,20 @@ class TestObject extends Object {
return $this->_persist($name, $return, $object, $type);
}
}
-
-
/**
- * ObjectTestModel
+ * ObjectTestModel class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs
*/
class ObjectTestModel extends CakeTestModel {
var $useTable = false;
var $name = 'ObjectTestModel';
}
-
-
/**
- * Object Test Class
+ * Object Test class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs
*/
class ObjectTest extends CakeTestCase {
@@ -286,6 +281,15 @@ class ObjectTest extends CakeTestCase {
function setUp() {
$this->object = new TestObject();
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->object);
+ }
/**
* testLog method
*
@@ -593,7 +597,6 @@ class ObjectTest extends CakeTestCase {
$_POST = $_tmp;
}
-
/**
* testCakeError
*
@@ -602,14 +605,5 @@ class ObjectTest extends CakeTestCase {
function testCakeError() {
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->object);
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/overloadable.test.php b/cake/tests/cases/libs/overloadable.test.php
index 8e1d24b4f..5c0363ad5 100644
--- a/cake/tests/cases/libs/overloadable.test.php
+++ b/cake/tests/cases/libs/overloadable.test.php
@@ -1,7 +1,7 @@
skipif (true, 'OverloadableTest not implemented');
+ $this->skipif(true, 'OverloadableTest not implemented');
}
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/router.test.php b/cake/tests/cases/libs/router.test.php
index 0af3648d9..7cbc98161 100644
--- a/cake/tests/cases/libs/router.test.php
+++ b/cake/tests/cases/libs/router.test.php
@@ -1,7 +1,7 @@
array(), 'named' => array(), 'plugin' => null, 'controller' => 'posts', 'action' => 'index');
$this->assertEqual($result, $expected);
}
-
/**
* Tests URL generation with flags and prefixes in and out of context
*
diff --git a/cake/tests/cases/libs/sanitize.test.php b/cake/tests/cases/libs/sanitize.test.php
index 31101445e..e564f9a92 100644
--- a/cake/tests/cases/libs/sanitize.test.php
+++ b/cake/tests/cases/libs/sanitize.test.php
@@ -1,7 +1,7 @@
assertEqual($result, $expected);
}
}
-
-?>
+?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/security.test.php b/cake/tests/cases/libs/security.test.php
index a04da4a44..4c2e97019 100644
--- a/cake/tests/cases/libs/security.test.php
+++ b/cake/tests/cases/libs/security.test.php
@@ -1,7 +1,7 @@
'hi');
$this->assertFalse(Set::check($set, 'a.b'));
}
-
/**
* Tests Set::flatten
*
@@ -2612,5 +2610,4 @@ class SetTest extends CakeTestCase {
$this->assertEqual($result, $expected);
}
}
-
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/socket.test.php b/cake/tests/cases/libs/socket.test.php
index c409b1664..31ce57873 100644
--- a/cake/tests/cases/libs/socket.test.php
+++ b/cake/tests/cases/libs/socket.test.php
@@ -1,7 +1,7 @@
Socket = new CakeSocket();
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->Socket);
+ }
/**
* testConstruct method
*
@@ -165,14 +174,5 @@ class SocketTest extends CakeTestCase {
$anotherSocket->reset();
$this->assertEqual(array(), $anotherSocket->config);
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->Socket);
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/string.test.php b/cake/tests/cases/libs/string.test.php
index eacdd181e..0bb0460ab 100644
--- a/cake/tests/cases/libs/string.test.php
+++ b/cake/tests/cases/libs/string.test.php
@@ -1,7 +1,7 @@
Reporter =& new CakeHtmlReporter();
}
/**
- * undocumented function
+ * testRunAllTests method
*
* @return void
* @access public
@@ -55,7 +61,7 @@ class TestManagerTest extends CakeTestCase {
$this->assertEqual(count($out), count($list));
}
/**
- * undocumented function
+ * testRunTestCase method
*
* @return void
* @access public
@@ -71,49 +77,44 @@ class TestManagerTest extends CakeTestCase {
$this->assertTrue($result);
}
/**
- * undocumented function
+ * testRunGroupTest method
*
* @return void
* @access public
*/
function testRunGroupTest() {
-
}
/**
- * undocumented function
+ * testAddTestCasesFromDirectory method
*
* @return void
* @access public
*/
function testAddTestCasesFromDirectory() {
-
}
/**
- * undocumented function
+ * testAddTestFile method
*
* @return void
* @access public
*/
function testAddTestFile() {
-
}
/**
- * undocumented function
+ * testGetTestCaseList method
*
* @return void
* @access public
*/
function testGetTestCaseList() {
-
}
/**
- * undocumented function
+ * testGetGroupTestList method
*
* @return void
* @access public
*/
function testGetGroupTestList() {
-
}
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/validation.test.php b/cake/tests/cases/libs/validation.test.php
index 310b7a8ae..60b6a187b 100644
--- a/cake/tests/cases/libs/validation.test.php
+++ b/cake/tests/cases/libs/validation.test.php
@@ -1,7 +1,7 @@
Validation =& Validation::getInstance();
}
/**
@@ -1975,4 +1974,4 @@ class ValidationTestCase extends CakeTestCase {
// $this->assertTrue(Validation::file(TEST_CAKE_CORE_INCLUDE_PATH. 'VERSION.txt'));
// }
}
-?>
+?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/view/helper.test.php b/cake/tests/cases/libs/view/helper.test.php
index 7c3d7ea23..8cc1b811b 100644
--- a/cake/tests/cases/libs/view/helper.test.php
+++ b/cake/tests/cases/libs/view/helper.test.php
@@ -1,7 +1,7 @@
array('with' => 'HelperTestPostsTag'));
}
-
/**
* HelperTestComment class
*
@@ -156,11 +155,10 @@ class HelperTestPostsTag extends Model {
return $this->_schema;
}
}
-
/**
- * Short description for class.
+ * HelperTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs
*/
class HelperTest extends CakeTestCase {
@@ -180,6 +178,16 @@ class HelperTest extends CakeTestCase {
ClassRegistry::addObject('HelperTestComment', new HelperTestComment());
ClassRegistry::addObject('HelperTestTag', new HelperTestTag());
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->Helper, $this->View);
+ ClassRegistry::flush();
+ }
/**
* testFormFieldNameParsing method
*
@@ -355,22 +363,22 @@ class HelperTest extends CakeTestCase {
function testUrlConversion() {
$result = $this->Helper->url('/controller/action/1');
$this->assertEqual($result, '/controller/action/1');
-
+
$result = $this->Helper->url('/controller/action/1?one=1&two=2');
$this->assertEqual($result, '/controller/action/1?one=1&two=2');
-
+
$result = $this->Helper->url(array('controller' => 'posts', 'action' => 'index', 'page' => '1" onclick="alert(\'XSS\');"'));
$this->assertEqual($result, "/posts/index/page:1" onclick="alert('XSS');"");
-
+
$result = $this->Helper->url('/controller/action/1/param:this+one+more');
$this->assertEqual($result, '/controller/action/1/param:this+one+more');
-
+
$result = $this->Helper->url('/controller/action/1/param:this%20one%20more');
$this->assertEqual($result, '/controller/action/1/param:this%20one%20more');
-
+
$result = $this->Helper->url('/controller/action/1/param:%7Baround%20here%7D%5Bthings%5D%5Bare%5D%24%24');
$this->assertEqual($result, '/controller/action/1/param:%7Baround%20here%7D%5Bthings%5D%5Bare%5D%24%24');
-
+
$result = $this->Helper->url(array(
'controller' => 'posts', 'action' => 'index', 'param' => '%7Baround%20here%7D%5Bthings%5D%5Bare%5D%24%24'
));
@@ -518,15 +526,5 @@ class HelperTest extends CakeTestCase {
$result = $this->Helper->clean('<script>alert(document.cookie)</script>');
$this->assertEqual($result, '<script>alert(document.cookie)</script>');
}
-/**
- * tearDown method
- *
- * @access public
- * @return void
- */
- function tearDown() {
- unset($this->Helper, $this->View);
- ClassRegistry::flush();
- }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/view/helpers/ajax.test.php b/cake/tests/cases/libs/view/helpers/ajax.test.php
index 7b9073097..78060a7d8 100644
--- a/cake/tests/cases/libs/view/helpers/ajax.test.php
+++ b/cake/tests/cases/libs/view/helpers/ajax.test.php
@@ -1,7 +1,7 @@
codeBlocks[] = $parameter;
}
}
-
/**
- * Short description for class.
+ * AjaxTest class
*
- * @package cake.tests
+ * @package cake
* @subpackage cake.tests.cases.libs.view.helpers
*/
-class AjaxTest extends CakeTestCase {
+class AjaxHelperTest extends CakeTestCase {
/**
* Regexp for CDATA start block
*
@@ -168,6 +175,16 @@ class AjaxTest extends CakeTestCase {
ClassRegistry::addObject('view', $view);
ClassRegistry::addObject('PostAjaxTest', new PostAjaxTest());
}
+/**
+ * tearDown method
+ *
+ * @access public
+ * @return void
+ */
+ function tearDown() {
+ unset($this->Ajax);
+ ClassRegistry::flush();
+ }
/**
* testEvalScripts method
*
@@ -624,7 +641,6 @@ class AjaxTest extends CakeTestCase {
$this->assertPattern('/^';
$this->assertEqual($result, $expected);
From 377108f93092ef56e98375a73a4365d954e1b4aa Mon Sep 17 00:00:00 2001
From: mark_story
Date: Wed, 15 Apr 2009 02:29:50 +0000
Subject: [PATCH 46/67] Adding tests to show correct usage of form::create()
with querystring params. Closes #6278
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8144 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/tests/cases/libs/view/helper.test.php | 6 +++++
.../cases/libs/view/helpers/form.test.php | 26 +++++++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/cake/tests/cases/libs/view/helper.test.php b/cake/tests/cases/libs/view/helper.test.php
index 8cc1b811b..e380650b9 100644
--- a/cake/tests/cases/libs/view/helper.test.php
+++ b/cake/tests/cases/libs/view/helper.test.php
@@ -383,6 +383,12 @@ class HelperTest extends CakeTestCase {
'controller' => 'posts', 'action' => 'index', 'param' => '%7Baround%20here%7D%5Bthings%5D%5Bare%5D%24%24'
));
$this->assertEqual($result, "/posts/index/param:%7Baround%20here%7D%5Bthings%5D%5Bare%5D%24%24");
+
+ $result = $this->Helper->url(array(
+ 'controller' => 'posts', 'action' => 'index', 'page' => '1',
+ '?' => array('one' => 'value', 'two' => 'value', 'three' => 'purple')
+ ));
+ $this->assertEqual($result, "/posts/index/page:1?one=value&two=value&three=purple");
}
/**
* testFieldsWithSameName method
diff --git a/cake/tests/cases/libs/view/helpers/form.test.php b/cake/tests/cases/libs/view/helpers/form.test.php
index a310b1c57..cb486f694 100644
--- a/cake/tests/cases/libs/view/helpers/form.test.php
+++ b/cake/tests/cases/libs/view/helpers/form.test.php
@@ -4528,6 +4528,32 @@ class FormHelperTest extends CakeTestCase {
);
$this->assertTags($result, $expected);
}
+/**
+ * Test base form url when url param is passed with multiple parameters (&)
+ *
+ */
+ function testFormCreateQuerystringParams() {
+ $result = $this->Form->create('Contact', array(
+ 'type' => 'post',
+ 'escape' => false,
+ 'url' => array(
+ 'controller' => 'controller',
+ 'action' => 'action',
+ '?' => array('param1' => 'value1', 'param2' => 'value2')
+ )
+ ));
+ $expected = array(
+ 'form' => array(
+ 'id' => 'ContactAddForm',
+ 'method' => 'post',
+ 'action' => '/controller/action/?param1=value1¶m2=value2'
+ ),
+ 'fieldset' => array('style' => 'preg:/display\s*\:\s*none;\s*/'),
+ 'input' => array('type' => 'hidden', 'name' => '_method', 'value' => 'POST'),
+ '/fieldset'
+ );
+ $this->assertTags($result, $expected, true);
+ }
/**
* testGetFormCreate method
*
From 8db4fe682bf6f1e406943df9cd5a72582c36e919 Mon Sep 17 00:00:00 2001
From: mark_story
Date: Wed, 15 Apr 2009 17:18:01 +0000
Subject: [PATCH 47/67] Allowing name attribute to pass on to hidden field in
FormHelper::radio(). Fixes inconsistency with checkbox(). Test case added.
Fixes #6260
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8145 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/view/helpers/form.php | 2 +-
.../cases/libs/view/helpers/form.test.php | 20 +++++++++++++++++++
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/cake/libs/view/helpers/form.php b/cake/libs/view/helpers/form.php
index 4ddf2e94c..2a4ff3420 100644
--- a/cake/libs/view/helpers/form.php
+++ b/cake/libs/view/helpers/form.php
@@ -934,7 +934,7 @@ class FormHelper extends AppHelper {
if (!isset($value) || $value === '') {
$hidden = $this->hidden($fieldName, array(
- 'id' => $attributes['id'] . '_', 'value' => ''
+ 'id' => $attributes['id'] . '_', 'value' => '', 'name' => $attributes['name']
));
}
$out = $hidden . join($inbetween, $out);
diff --git a/cake/tests/cases/libs/view/helpers/form.test.php b/cake/tests/cases/libs/view/helpers/form.test.php
index cb486f694..b06f2b7e9 100644
--- a/cake/tests/cases/libs/view/helpers/form.test.php
+++ b/cake/tests/cases/libs/view/helpers/form.test.php
@@ -2553,6 +2553,26 @@ class FormHelperTest extends CakeTestCase {
'/label'
);
$this->assertTags($result, $expected);
+
+
+ $result = $this->Form->radio('Model.field', array('option A', 'option B'), array('name' => 'data[Model][custom]'));
+ $expected = array(
+ 'fieldset' => array(),
+ 'legend' => array(),
+ 'Field',
+ '/legend',
+ 'input' => array('type' => 'hidden', 'name' => 'data[Model][custom]', 'value' => '', 'id' => 'ModelField_'),
+ array('input' => array('type' => 'radio', 'name' => 'data[Model][custom]', 'value' => '0', 'id' => 'ModelField0')),
+ array('label' => array('for' => 'ModelField0')),
+ 'option A',
+ '/label',
+ array('input' => array('type' => 'radio', 'name' => 'data[Model][custom]', 'value' => '1', 'id' => 'ModelField1')),
+ array('label' => array('for' => 'ModelField1')),
+ 'option B',
+ '/label',
+ '/fieldset'
+ );
+ $this->assertTags($result, $expected);
}
/**
* testSelect method
From bd7bd5d8917bc53aa06dae01dc09670f1c770121 Mon Sep 17 00:00:00 2001
From: "renan.saddam"
Date: Thu, 16 Apr 2009 18:12:01 +0000
Subject: [PATCH 48/67] Fixing issue when generating textarea with null value.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8146 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/view/helper.php | 2 +-
cake/tests/cases/libs/view/helpers/form.test.php | 16 ++++++++++++----
2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/cake/libs/view/helper.php b/cake/libs/view/helper.php
index fc12c7ac2..076622c73 100644
--- a/cake/libs/view/helper.php
+++ b/cake/libs/view/helper.php
@@ -591,7 +591,7 @@ class Helper extends Overloadable {
if (is_array($result)) {
$view =& ClassRegistry::getObject('view');
- if (isset($result[$view->fieldSuffix])) {
+ if (array_key_exists($view->fieldSuffix, $result)) {
$result = $result[$view->fieldSuffix];
}
}
diff --git a/cake/tests/cases/libs/view/helpers/form.test.php b/cake/tests/cases/libs/view/helpers/form.test.php
index b06f2b7e9..9358df259 100644
--- a/cake/tests/cases/libs/view/helpers/form.test.php
+++ b/cake/tests/cases/libs/view/helpers/form.test.php
@@ -2553,8 +2553,8 @@ class FormHelperTest extends CakeTestCase {
'/label'
);
$this->assertTags($result, $expected);
-
-
+
+
$result = $this->Form->radio('Model.field', array('option A', 'option B'), array('name' => 'data[Model][custom]'));
$expected = array(
'fieldset' => array(),
@@ -4247,6 +4247,14 @@ class FormHelperTest extends CakeTestCase {
'/textarea',
);
$this->assertTags($result, $expected);
+
+ $this->Form->data['Model']['0']['OtherModel']['field'] = null;
+ $result = $this->Form->textarea('Model.0.OtherModel.field');
+ $expected = array(
+ 'textarea' => array('name' => 'data[Model][0][OtherModel][field]', 'id' => 'Model0OtherModelField'),
+ '/textarea'
+ );
+ $this->assertTags($result, $expected);
}
/**
* testTextAreaWithStupidCharacters method
@@ -4564,8 +4572,8 @@ class FormHelperTest extends CakeTestCase {
));
$expected = array(
'form' => array(
- 'id' => 'ContactAddForm',
- 'method' => 'post',
+ 'id' => 'ContactAddForm',
+ 'method' => 'post',
'action' => '/controller/action/?param1=value1¶m2=value2'
),
'fieldset' => array('style' => 'preg:/display\s*\:\s*none;\s*/'),
From bbfee7ba179a07e1f544d436ab8fa70d3fc599d1 Mon Sep 17 00:00:00 2001
From: davidpersson
Date: Fri, 17 Apr 2009 13:26:07 +0000
Subject: [PATCH 49/67] Updating Xml class to always use #document as the very
root node and to create a node below it if the root option is set. Adding
test. Fixes #6294
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8147 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/xml.php | 12 +++++++++---
cake/tests/cases/libs/xml.test.php | 20 ++++++++++++++++++++
2 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/cake/libs/xml.php b/cake/libs/xml.php
index d7eab9f53..b4edf2fff 100644
--- a/cake/libs/xml.php
+++ b/cake/libs/xml.php
@@ -823,13 +823,19 @@ class Xml extends XmlNode {
$this->{$key} = $options[$key];
}
$this->__tags = $options['tags'];
- parent::__construct($options['root']);
+ parent::__construct('#document');
+
+ if ($options['root'] !== '#document') {
+ $Root = $this->createNode($options['root']);
+ } else {
+ $Root =& $this;
+ }
if (!empty($input)) {
if (is_string($input)) {
- $this->load($input);
+ $Root->load($input);
} elseif (is_array($input) || is_object($input)) {
- $this->append($input, $options);
+ $Root->append($input, $options);
}
}
// if (Configure::read('App.encoding') !== null) {
diff --git a/cake/tests/cases/libs/xml.test.php b/cake/tests/cases/libs/xml.test.php
index 4ee508a68..f452b54df 100644
--- a/cake/tests/cases/libs/xml.test.php
+++ b/cake/tests/cases/libs/xml.test.php
@@ -256,6 +256,26 @@ class XmlTest extends CakeTestCase {
$result = $xml->toString(array('header' => false, 'cdata' => false));
$this->assertEqual($expected, $result);
}
+/**
+ * Prove that serialization with a given root node works
+ * as expected.
+ *
+ * @access public
+ * @return void
+ * @link https://trac.cakephp.org/ticket/6294
+ */
+ function testArraySerializationWithRoot() {
+ $input = array(
+ array('Shirt' => array('id' => 1, 'color' => 'green')),
+ array('Shirt' => array('id' => 2, 'color' => 'blue')),
+ );
+ $expected = '';
+ $expected .= '';
+
+ $Xml = new Xml($input, array('root' => 'collection'));
+ $result = $Xml->toString(array('header' => false));
+ $this->assertEqual($expected, $result);
+ }
/**
* testCloneNode
*
From 6e91ee7ad4897cbcf1a2b65a1c5244953a3c4f8c Mon Sep 17 00:00:00 2001
From: mark_story
Date: Mon, 20 Apr 2009 07:36:26 +0000
Subject: [PATCH 50/67] Adding tests to disprove #6306
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8148 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/tests/cases/libs/router.test.php | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/cake/tests/cases/libs/router.test.php b/cake/tests/cases/libs/router.test.php
index 7cbc98161..f0bfb1441 100644
--- a/cake/tests/cases/libs/router.test.php
+++ b/cake/tests/cases/libs/router.test.php
@@ -1316,9 +1316,18 @@ class RouterTest extends CakeTestCase {
$expected = '/others/edit/1';
$this->assertEqual($result, $expected);
- $result = Router::url(array('controller' => 'others', 'action' => 'edit', 1, 'protected' => true));;
+ $result = Router::url(array('controller' => 'others', 'action' => 'edit', 1, 'protected' => true));
$expected = '/protected/others/edit/1';
$this->assertEqual($result, $expected);
+
+ $result = Router::url(array('controller' => 'others', 'action' => 'edit', 1, 'protected' => true, 'page' => 1));
+ $expected = '/protected/others/edit/1/page:1';
+ $this->assertEqual($result, $expected);
+
+ Router::connectNamed(array('random'));
+ $result = Router::url(array('controller' => 'others', 'action' => 'edit', 1, 'protected' => true, 'random' => 'my-value'));
+ $expected = '/protected/others/edit/1/random:my-value';
+ $this->assertEqual($result, $expected);
}
/**
* testRemoveBase method
From 0cc3d5149f1e9f9442d46a2b37ea99dee9de422f Mon Sep 17 00:00:00 2001
From: gwoo
Date: Wed, 22 Apr 2009 16:05:13 +0000
Subject: [PATCH 51/67] fixes #6277, relaxing character length comparison for
UUID
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8149 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/model/model.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cake/libs/model/model.php b/cake/libs/model/model.php
index 05b655975..0af80bafb 100644
--- a/cake/libs/model/model.php
+++ b/cake/libs/model/model.php
@@ -1210,7 +1210,7 @@ class Model extends Overloadable {
foreach ($this->_schema as $field => $properties) {
if ($this->primaryKey === $field) {
$fInfo = $this->_schema[$field];
- $isUUID = ($fInfo['length'] === 36 &&
+ $isUUID = ($fInfo['length'] == 36 &&
($fInfo['type'] === 'string' || $fInfo['type'] === 'binary')
);
if (empty($this->data[$this->alias][$this->primaryKey]) && $isUUID) {
@@ -1279,7 +1279,7 @@ class Model extends Overloadable {
));
$isUUID = !empty($this->{$join}->primaryKey) && (
- $this->{$join}->_schema[$this->{$join}->primaryKey]['length'] === 36 && (
+ $this->{$join}->_schema[$this->{$join}->primaryKey]['length'] == 36 && (
$this->{$join}->_schema[$this->{$join}->primaryKey]['type'] === 'string' ||
$this->{$join}->_schema[$this->{$join}->primaryKey]['type'] === 'binary'
)
From fd0c39fcc6f57551c6eec75895bb3af87f18af43 Mon Sep 17 00:00:00 2001
From: gwoo
Date: Wed, 22 Apr 2009 16:47:34 +0000
Subject: [PATCH 52/67] fixes #6293, Deleting non-existing record causes save()
to fail. Thanks to msadouni for the patch and test!
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8150 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/model/model.php | 2 +-
cake/tests/cases/libs/model/model.test.php | 42 ++++++++++++++++++----
2 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/cake/libs/model/model.php b/cake/libs/model/model.php
index 0af80bafb..5238bb242 100644
--- a/cake/libs/model/model.php
+++ b/cake/libs/model/model.php
@@ -1853,7 +1853,7 @@ class Model extends Overloadable {
if ($this->getID() === false || $this->useTable === false) {
return false;
}
- if ($this->__exists !== null && $reset !== true) {
+ if (!empty($this->__exists) && $reset !== true) {
return $this->__exists;
}
$conditions = array($this->alias . '.' . $this->primaryKey => $this->getID());
diff --git a/cake/tests/cases/libs/model/model.test.php b/cake/tests/cases/libs/model/model.test.php
index 42170ae0c..595335172 100644
--- a/cake/tests/cases/libs/model/model.test.php
+++ b/cake/tests/cases/libs/model/model.test.php
@@ -63,10 +63,10 @@ class ModelTest extends CakeTestCase {
'core.dependency', 'core.story', 'core.stories_tag', 'core.cd', 'core.book', 'core.basket',
'core.overall_favorite', 'core.account', 'core.content', 'core.content_account',
'core.film_file', 'core.test_plugin_article', 'core.test_plugin_comment', 'core.uuiditem',
- 'core.counter_cache_user', 'core.counter_cache_post',
- 'core.counter_cache_user_nonstandard_primary_key',
- 'core.counter_cache_post_nonstandard_primary_key', 'core.uuidportfolio',
- 'core.uuiditems_uuidportfolio', 'core.uuiditems_uuidportfolio_numericid', 'core.fruit',
+ 'core.counter_cache_user', 'core.counter_cache_post',
+ 'core.counter_cache_user_nonstandard_primary_key',
+ 'core.counter_cache_post_nonstandard_primary_key', 'core.uuidportfolio',
+ 'core.uuiditems_uuidportfolio', 'core.uuiditems_uuidportfolio_numericid', 'core.fruit',
'core.fruits_uuid_tag', 'core.uuid_tag'
);
/**
@@ -3921,7 +3921,7 @@ class ModelTest extends CakeTestCase {
$this->assertEqual($users[1]['User']['post_count'], 2);
}
/**
- * Test counter cache with models that use a non-standard (i.e. not using 'id')
+ * Test counter cache with models that use a non-standard (i.e. not using 'id')
* as their primary key.
*
* @access public
@@ -3929,7 +3929,7 @@ class ModelTest extends CakeTestCase {
*/
function testCounterCacheWithNonstandardPrimaryKey() {
$this->loadFixtures(
- 'CounterCacheUserNonstandardPrimaryKey',
+ 'CounterCacheUserNonstandardPrimaryKey',
'CounterCachePostNonstandardPrimaryKey'
);
@@ -4027,6 +4027,36 @@ class ModelTest extends CakeTestCase {
array('Article' => array('id' => 1, 'title' => 'First Article' ))
);
$this->assertEqual($result, $expected);
+
+
+ // make sure deleting a non-existent record doesn't break save()
+ // ticket #6293
+ $this->loadFixtures('Uuid');
+ $Uuid =& new Uuid();
+ $data = array(
+ 'B607DAB9-88A2-46CF-B57C-842CA9E3B3B3',
+ '52C8865C-10EE-4302-AE6C-6E7D8E12E2C8',
+ '8208C7FE-E89C-47C5-B378-DED6C271F9B8');
+ foreach ($data as $id) {
+ $Uuid->save(array('id' => $id));
+ }
+ $Uuid->del('52C8865C-10EE-4302-AE6C-6E7D8E12E2C8');
+ $Uuid->del('52C8865C-10EE-4302-AE6C-6E7D8E12E2C8');
+ foreach ($data as $id) {
+ $Uuid->save(array('id' => $id));
+ }
+ $result = $Uuid->find('all', array(
+ 'conditions' => array('id' => $data),
+ 'fields' => array('id'),
+ 'order' => 'id'));
+ $expected = array(
+ array('Uuid' => array(
+ 'id' => '52C8865C-10EE-4302-AE6C-6E7D8E12E2C8')),
+ array('Uuid' => array(
+ 'id' => '8208C7FE-E89C-47C5-B378-DED6C271F9B8')),
+ array('Uuid' => array(
+ 'id' => 'B607DAB9-88A2-46CF-B57C-842CA9E3B3B3')));
+ $this->assertEqual($result, $expected);
}
/**
* testDeleteAll method
From 82cb895f505e3f50ef14473bc0d11310eadf0fc0 Mon Sep 17 00:00:00 2001
From: mark_story
Date: Thu, 23 Apr 2009 17:26:56 +0000
Subject: [PATCH 53/67] Correcting test case simulation. Closes #6211
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8151 3807eeeb-6ff5-0310-8944-8be069107fe0
---
.../cases/libs/controller/components/auth.test.php | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/cake/tests/cases/libs/controller/components/auth.test.php b/cake/tests/cases/libs/controller/components/auth.test.php
index f10eae7a7..e65ec4c08 100644
--- a/cake/tests/cases/libs/controller/components/auth.test.php
+++ b/cake/tests/cases/libs/controller/components/auth.test.php
@@ -839,16 +839,22 @@ class AuthTest extends CakeTestCase {
$this->assertEqual($expected, $this->Controller->Session->read('Auth.redirect'));
// QueryString parameters
+ $_back = $_GET;
+ $_GET = array(
+ 'url' => '/posts/index/29?print=true&refer=menu',
+ 'print' => 'true',
+ 'refer' => 'menu'
+ );
$this->Controller->Session->del('Auth');
$url = '/posts/index/29?print=true&refer=menu';
- $this->Controller->params = Router::parse($url);
- $this->Controller->params['url']['url'] = Router::normalize($url);
+ $this->Controller->params = Dispatcher::parseParams($url);
$this->Controller->Auth->initialize($this->Controller);
$this->Controller->Auth->loginAction = array('controller' => 'AuthTest', 'action' => 'login');
$this->Controller->Auth->userModel = 'AuthUser';
$this->Controller->Auth->startup($this->Controller);
$expected = Router::normalize('posts/index/29?print=true&refer=menu');
$this->assertEqual($expected, $this->Controller->Session->read('Auth.redirect'));
+ $_GET = $_back;
//external authed action
$_SERVER['HTTP_REFERER'] = 'http://webmail.example.com/view/message';
From 650d1e7c789e6242add3872b6e9966838b6d2091 Mon Sep 17 00:00:00 2001
From: jperras
Date: Fri, 24 Apr 2009 18:20:51 +0000
Subject: [PATCH 54/67] Removing hard coded HELO hostname of 'cake' in
EmailComponent; better compliance with RFC-821 3.5. Test cases added. Fixes
#6264.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8152 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/controller/components/email.php | 8 +-
.../libs/controller/components/email.test.php | 222 +++++++++++-------
2 files changed, 148 insertions(+), 82 deletions(-)
diff --git a/cake/libs/controller/components/email.php b/cake/libs/controller/components/email.php
index c8a368b3d..71b013a14 100644
--- a/cake/libs/controller/components/email.php
+++ b/cake/libs/controller/components/email.php
@@ -673,7 +673,13 @@ class EmailComponent extends Object{
return false;
}
- if (!$this->__smtpSend('HELO cake', '250')) {
+ if (isset($this->smtpOptions['host'])) {
+ $host = $this->smtpOptions['host'];
+ } else {
+ $host = env('HTTP_HOST');
+ }
+
+ if (!$this->__smtpSend("HELO {$host}", '250')) {
return false;
}
diff --git a/cake/tests/cases/libs/controller/components/email.test.php b/cake/tests/cases/libs/controller/components/email.test.php
index cfe806c06..4258c952c 100644
--- a/cake/tests/cases/libs/controller/components/email.test.php
+++ b/cake/tests/cases/libs/controller/components/email.test.php
@@ -25,6 +25,41 @@
* @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
*/
App::import('Component', 'Email');
+/**
+ * EmailTestComponent class
+ *
+ * @package cake
+ * @subpackage cake.tests.cases.libs.controller.components
+ */
+class EmailTestComponent extends EmailComponent {
+/**
+ * smtpSend method override for testing
+ *
+ * @access public
+ * @return mixed
+ */
+ function smtpSend($data, $code = '250') {
+ return parent::__smtpSend($data, $code);
+ }
+/**
+ * Convenience setter method for testing.
+ *
+ * @access public
+ * @return void
+ */
+ function setConnectionSocket(&$socket) {
+ $this->__smtpConnection = $socket;
+ }
+/**
+ * Convenience getter method for testing.
+ *
+ * @access public
+ * @return mixed
+ */
+ function getConnectionSocket() {
+ return $this->__smtpConnection;
+ }
+}
/**
* EmailTestController class
*
@@ -52,7 +87,7 @@ class EmailTestController extends Controller {
* @var array
* @access public
*/
- var $components = array('Email');
+ var $components = array('EmailTest');
/**
* pageTitle property
*
@@ -98,7 +133,7 @@ class EmailComponentTest extends CakeTestCase {
@$this->Controller->Component->init($this->Controller);
set_error_handler('simpleTestErrorHandler');
- $this->Controller->Email->initialize($this->Controller, array());
+ $this->Controller->EmailTest->initialize($this->Controller, array());
ClassRegistry::addObject('view', new View($this->Controller));
$this->_viewPaths = Configure::read('viewPaths');
@@ -125,9 +160,9 @@ class EmailComponentTest extends CakeTestCase {
* @return void
*/
function testBadSmtpSend() {
- $this->Controller->Email->smtpOptions['host'] = 'blah';
- $this->Controller->Email->delivery = 'smtp';
- $this->assertFalse($this->Controller->Email->send('Should not work'));
+ $this->Controller->EmailTest->smtpOptions['host'] = 'blah';
+ $this->Controller->EmailTest->delivery = 'smtp';
+ $this->assertFalse($this->Controller->EmailTest->send('Should not work'));
}
/**
* testSmtpSend method
@@ -139,18 +174,18 @@ class EmailComponentTest extends CakeTestCase {
if (!$this->skipIf(!@fsockopen('localhost', 25), '%s No SMTP server running on localhost')) {
return;
}
- $this->Controller->Email->reset();
- $this->Controller->Email->to = 'postmaster@localhost';
- $this->Controller->Email->from = 'noreply@example.com';
- $this->Controller->Email->subject = 'Cake SMTP test';
- $this->Controller->Email->replyTo = 'noreply@example.com';
- $this->Controller->Email->template = null;
+ $this->Controller->EmailTest->reset();
+ $this->Controller->EmailTest->to = 'postmaster@localhost';
+ $this->Controller->EmailTest->from = 'noreply@example.com';
+ $this->Controller->EmailTest->subject = 'Cake SMTP test';
+ $this->Controller->EmailTest->replyTo = 'noreply@example.com';
+ $this->Controller->EmailTest->template = null;
- $this->Controller->Email->delivery = 'smtp';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->Controller->EmailTest->delivery = 'smtp';
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
- $this->Controller->Email->_debug = true;
- $this->Controller->Email->sendAs = 'text';
+ $this->Controller->EmailTest->_debug = true;
+ $this->Controller->EmailTest->sendAs = 'text';
$expect = <<Host: localhost
Port: 25
@@ -174,7 +209,7 @@ This is the body of the message
TEMPDOC;
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
$this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect));
}
/**
@@ -186,20 +221,22 @@ TEMPDOC;
function testAuthenticatedSmtpSend() {
$this->skipIf(!@fsockopen('localhost', 25), '%s No SMTP server running on localhost');
- $this->Controller->Email->reset();
- $this->Controller->Email->to = 'postmaster@localhost';
- $this->Controller->Email->from = 'noreply@example.com';
- $this->Controller->Email->subject = 'Cake SMTP test';
- $this->Controller->Email->replyTo = 'noreply@example.com';
- $this->Controller->Email->template = null;
- $this->Controller->Email->smtpOptions['username'] = 'test';
- $this->Controller->Email->smtpOptions['password'] = 'testing';
+ $this->Controller->EmailTest->reset();
+ $this->Controller->EmailTest->to = 'postmaster@localhost';
+ $this->Controller->EmailTest->from = 'noreply@example.com';
+ $this->Controller->EmailTest->subject = 'Cake SMTP test';
+ $this->Controller->EmailTest->replyTo = 'noreply@example.com';
+ $this->Controller->EmailTest->template = null;
+ $this->Controller->EmailTest->smtpOptions['username'] = 'test';
+ $this->Controller->EmailTest->smtpOptions['password'] = 'testing';
- $this->Controller->Email->delivery = 'smtp';
- $result = $this->Controller->Email->send('This is the body of the message');
- $code = substr($this->Controller->Email->smtpError, 0, 3);
+ $this->Controller->EmailTest->delivery = 'smtp';
+ $result = $this->Controller->EmailTest->send('This is the body of the message');
+ $code = substr($this->Controller->EmailTest->smtpError, 0, 3);
$this->skipIf(!$code, '%s Authentication not enabled on server');
- $this->assertTrue(!$result && $code == '535');
+
+ $this->assertFalse($result);
+ $this->assertEqual($code, '535');
}
/**
* testSendFormats method
@@ -208,13 +245,13 @@ TEMPDOC;
* @return void
*/
function testSendFormats() {
- $this->Controller->Email->reset();
- $this->Controller->Email->to = 'postmaster@localhost';
- $this->Controller->Email->from = 'noreply@example.com';
- $this->Controller->Email->subject = 'Cake SMTP test';
- $this->Controller->Email->replyTo = 'noreply@example.com';
- $this->Controller->Email->template = null;
- $this->Controller->Email->delivery = 'debug';
+ $this->Controller->EmailTest->reset();
+ $this->Controller->EmailTest->to = 'postmaster@localhost';
+ $this->Controller->EmailTest->from = 'noreply@example.com';
+ $this->Controller->EmailTest->subject = 'Cake SMTP test';
+ $this->Controller->EmailTest->replyTo = 'noreply@example.com';
+ $this->Controller->EmailTest->template = null;
+ $this->Controller->EmailTest->delivery = 'debug';
$message = <<To: postmaster@localhost
@@ -234,20 +271,20 @@ This is the body of the message
MSGBLOC;
- $this->Controller->Email->sendAs = 'text';
+ $this->Controller->EmailTest->sendAs = 'text';
$expect = str_replace('{CONTENTTYPE}', 'text/plain; charset=UTF-8', $message);
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
$this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect));
- $this->Controller->Email->sendAs = 'html';
+ $this->Controller->EmailTest->sendAs = 'html';
$expect = str_replace('{CONTENTTYPE}', 'text/html; charset=UTF-8', $message);
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
$this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect));
// TODO: better test for format of message sent?
- $this->Controller->Email->sendAs = 'both';
+ $this->Controller->EmailTest->sendAs = 'both';
$expect = str_replace('{CONTENTTYPE}', 'multipart/alternative; boundary="alt-"' . "\n", $message);
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
$this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect));
}
/**
@@ -257,13 +294,13 @@ MSGBLOC;
* @return void
*/
function testTemplates() {
- $this->Controller->Email->reset();
- $this->Controller->Email->to = 'postmaster@localhost';
- $this->Controller->Email->from = 'noreply@example.com';
- $this->Controller->Email->subject = 'Cake SMTP test';
- $this->Controller->Email->replyTo = 'noreply@example.com';
+ $this->Controller->EmailTest->reset();
+ $this->Controller->EmailTest->to = 'postmaster@localhost';
+ $this->Controller->EmailTest->from = 'noreply@example.com';
+ $this->Controller->EmailTest->subject = 'Cake SMTP test';
+ $this->Controller->EmailTest->replyTo = 'noreply@example.com';
- $this->Controller->Email->delivery = 'debug';
+ $this->Controller->EmailTest->delivery = 'debug';
$header = <<Controller->Email->layout = 'default';
- $this->Controller->Email->template = 'default';
+ $this->Controller->EmailTest->layout = 'default';
+ $this->Controller->EmailTest->template = 'default';
$text = <<Controller->Email->sendAs = 'text';
+ $this->Controller->EmailTest->sendAs = 'text';
$expect = '' . str_replace('{CONTENTTYPE}', 'text/plain; charset=UTF-8', $header) . $text . "\n" . '
';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
$this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect));
- $this->Controller->Email->sendAs = 'html';
+ $this->Controller->EmailTest->sendAs = 'html';
$expect = '' . str_replace('{CONTENTTYPE}', 'text/html; charset=UTF-8', $header) . $html . "\n" . '
';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
$this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect));
- $this->Controller->Email->sendAs = 'both';
+ $this->Controller->EmailTest->sendAs = 'both';
$expect = str_replace('{CONTENTTYPE}', 'multipart/alternative; boundary="alt-"' . "\n", $header);
$expect .= '--alt-' . "\n" . 'Content-Type: text/plain; charset=UTF-8' . "\n" . 'Content-Transfer-Encoding: 7bit' . "\n\n" . $text . "\n\n";
$expect .= '--alt-' . "\n" . 'Content-Type: text/html; charset=UTF-8' . "\n" . 'Content-Transfer-Encoding: 7bit' . "\n\n" . $html . "\n\n";
$expect = '' . $expect . '--alt---' . "\n\n" . '
';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
$this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect));
$html = <<Controller->Email->sendAs = 'html';
+ $this->Controller->EmailTest->sendAs = 'html';
$expect = '' . str_replace('{CONTENTTYPE}', 'text/html; charset=UTF-8', $header) . $html . "\n" . '
';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message', 'default', 'thin'));
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message', 'default', 'thin'));
$this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect));
return;
@@ -362,11 +399,34 @@ This email was sent using the CakePHP Framework, http://cakephp.org.
TEXTBLOC;
- $this->Controller->Email->sendAs = 'text';
+ $this->Controller->EmailTest->sendAs = 'text';
$expect = '' . str_replace('{CONTENTTYPE}', 'text/plain; charset=UTF-8', $header) . $text . "\n" . '
';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message', 'wide', 'default'));
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message', 'wide', 'default'));
$this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect));
}
+/**
+ * testSmtpSendSocket method
+ *
+ * @access public
+ * @return void
+ */
+ function testSmtpSendSocket() {
+ $this->skipIf(!@fsockopen('localhost', 25), '%s No SMTP server running on localhost');
+
+ $this->Controller->EmailTest->reset();
+ $socket =& new CakeSocket(array_merge(array('protocol'=>'smtp'), $this->Controller->EmailTest->smtpOptions));
+ $this->Controller->EmailTest->setConnectionSocket($socket);
+
+ $this->assertTrue($this->Controller->EmailTest->getConnectionSocket());
+
+ $response = $this->Controller->EmailTest->smtpSend('HELO', '250');
+ $this->assertPattern('/501 Syntax: HELO hostname/', $this->Controller->EmailTest->smtpError);
+
+ $this->Controller->EmailTest->smtpError = null;
+ $response = $this->Controller->EmailTest->smtpSend('HELO somehostname', '250');
+ $this->assertNoPattern('/501 Syntax: HELO hostname/', $this->Controller->EmailTest->smtpError);
+
+ }
/**
* testSendDebug method
*
@@ -374,15 +434,15 @@ TEXTBLOC;
* @return void
*/
function testSendDebug() {
- $this->Controller->Email->reset();
- $this->Controller->Email->to = 'postmaster@localhost';
- $this->Controller->Email->from = 'noreply@example.com';
- $this->Controller->Email->subject = 'Cake SMTP test';
- $this->Controller->Email->replyTo = 'noreply@example.com';
- $this->Controller->Email->template = null;
+ $this->Controller->EmailTest->reset();
+ $this->Controller->EmailTest->to = 'postmaster@localhost';
+ $this->Controller->EmailTest->from = 'noreply@example.com';
+ $this->Controller->EmailTest->subject = 'Cake SMTP test';
+ $this->Controller->EmailTest->replyTo = 'noreply@example.com';
+ $this->Controller->EmailTest->template = null;
- $this->Controller->Email->delivery = 'debug';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->Controller->EmailTest->delivery = 'debug';
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
}
/**
* testContentStripping method
@@ -394,7 +454,7 @@ TEXTBLOC;
$content = "Previous content\n--alt-\nContent-TypeContent-Type:: text/html; charsetcharset==utf-8\nContent-Transfer-Encoding: 7bit";
$content .= "\n\nMy own html content
";
- $result = $this->Controller->Email->__strip($content, true);
+ $result = $this->Controller->EmailTest->__strip($content, true);
$expected = "Previous content\n--alt-\n text/html; utf-8\n 7bit\n\nMy own html content
";
$this->assertEqual($result, $expected);
}
@@ -405,28 +465,28 @@ TEXTBLOC;
* @return void
*/
function testMultibyte() {
- $this->Controller->Email->reset();
- $this->Controller->Email->to = 'postmaster@localhost';
- $this->Controller->Email->from = 'noreply@example.com';
- $this->Controller->Email->subject = 'هذه رسالة بعنوان طويل مرسل للمستلم';
- $this->Controller->Email->replyTo = 'noreply@example.com';
- $this->Controller->Email->template = null;
- $this->Controller->Email->delivery = 'debug';
+ $this->Controller->EmailTest->reset();
+ $this->Controller->EmailTest->to = 'postmaster@localhost';
+ $this->Controller->EmailTest->from = 'noreply@example.com';
+ $this->Controller->EmailTest->subject = 'هذه رسالة بعنوان طويل مرسل للمستلم';
+ $this->Controller->EmailTest->replyTo = 'noreply@example.com';
+ $this->Controller->EmailTest->template = null;
+ $this->Controller->EmailTest->delivery = 'debug';
$subject = '=?UTF-8?B?2YfYsNmHINix2LPYp9mE2Kkg2KjYudmG2YjYp9mGINi32YjZitmEINmF2LE=?=' . "\r\n" . ' =?UTF-8?B?2LPZhCDZhNmE2YXYs9iq2YTZhQ==?=';
- $this->Controller->Email->sendAs = 'text';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->Controller->EmailTest->sendAs = 'text';
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
preg_match('/Subject: (.*)Header:/s', $this->Controller->Session->read('Message.email.message'), $matches);
$this->assertEqual(trim($matches[1]), $subject);
- $this->Controller->Email->sendAs = 'html';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->Controller->EmailTest->sendAs = 'html';
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
preg_match('/Subject: (.*)Header:/s', $this->Controller->Session->read('Message.email.message'), $matches);
$this->assertEqual(trim($matches[1]), $subject);
- $this->Controller->Email->sendAs = 'both';
- $this->assertTrue($this->Controller->Email->send('This is the body of the message'));
+ $this->Controller->EmailTest->sendAs = 'both';
+ $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message'));
preg_match('/Subject: (.*)Header:/s', $this->Controller->Session->read('Message.email.message'), $matches);
$this->assertEqual(trim($matches[1]), $subject);
}
From 97abf8477096fe5afae3319bab0ba5a916be217e Mon Sep 17 00:00:00 2001
From: jperras
Date: Sat, 25 Apr 2009 00:01:57 +0000
Subject: [PATCH 55/67] EmailComponent:: now is set to null after calling
EmailComponent::reset(). Test cases added; fixes #6314.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8153 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/controller/components/email.php | 1 +
.../libs/controller/components/email.test.php | 82 +++++++++++++++++++
2 files changed, 83 insertions(+)
diff --git a/cake/libs/controller/components/email.php b/cake/libs/controller/components/email.php
index 71b013a14..90dc72055 100644
--- a/cake/libs/controller/components/email.php
+++ b/cake/libs/controller/components/email.php
@@ -345,6 +345,7 @@ class EmailComponent extends Object{
$this->bcc = array();
$this->subject = null;
$this->additionalParams = null;
+ $this->smtpError = null;
$this->__header = array();
$this->__boundary = null;
$this->__message = array();
diff --git a/cake/tests/cases/libs/controller/components/email.test.php b/cake/tests/cases/libs/controller/components/email.test.php
index 4258c952c..08f033aac 100644
--- a/cake/tests/cases/libs/controller/components/email.test.php
+++ b/cake/tests/cases/libs/controller/components/email.test.php
@@ -59,6 +59,51 @@ class EmailTestComponent extends EmailComponent {
function getConnectionSocket() {
return $this->__smtpConnection;
}
+/**
+ * Convenience setter for testing.
+ *
+ * @access public
+ * @return void
+ */
+ function setHeaders($headers) {
+ $this->__header += $headers;
+ }
+/**
+ * Convenience getter for testing.
+ *
+ * @access public
+ * @return array
+ */
+ function getHeaders() {
+ return $this->__header;
+ }
+/**
+ * Convenience setter for testing.
+ *
+ * @access public
+ * @return void
+ */
+ function setBoundary() {
+ $this->__createBoundary();
+ }
+/**
+ * Convenience getter for testing.
+ *
+ * @access public
+ * @return string
+ */
+ function getBoundary() {
+ return $this->__boundary;
+ }
+/**
+ * Convenience getter for testing.
+ *
+ * @access public
+ * @return string
+ */
+ function getMessage() {
+ return $this->__message;
+ }
}
/**
* EmailTestController class
@@ -490,6 +535,43 @@ TEXTBLOC;
preg_match('/Subject: (.*)Header:/s', $this->Controller->Session->read('Message.email.message'), $matches);
$this->assertEqual(trim($matches[1]), $subject);
}
+/**
+ * testReset method
+ *
+ * @access public
+ * @return void
+ */
+ function testReset() {
+ $this->Controller->EmailTest->template = 'test_template';
+ $this->Controller->EmailTest->to = 'test.recipient@example.com';
+ $this->Controller->EmailTest->from = 'test.sender@example.com';
+ $this->Controller->EmailTest->replyTo = 'test.replyto@example.com';
+ $this->Controller->EmailTest->return = 'test.return@example.com';
+ $this->Controller->EmailTest->cc = array('cc1@example.com', 'cc2@example.com');
+ $this->Controller->EmailTest->bcc = array('bcc1@example.com', 'bcc2@example.com');
+ $this->Controller->EmailTest->subject = 'Test subject';
+ $this->Controller->EmailTest->additionalParams = 'X-additional-header';
+ $this->Controller->EmailTest->delivery = 'smtp';
+ $this->Controller->EmailTest->smtpOptions['host'] = 'blah';
+
+ $this->assertFalse($this->Controller->EmailTest->send('Should not work'));
+
+ $this->Controller->EmailTest->reset();
+
+ $this->assertNull($this->Controller->EmailTest->template);
+ $this->assertNull($this->Controller->EmailTest->to);
+ $this->assertNull($this->Controller->EmailTest->from);
+ $this->assertNull($this->Controller->EmailTest->replyTo);
+ $this->assertNull($this->Controller->EmailTest->return);
+ $this->assertIdentical($this->Controller->EmailTest->cc, array());
+ $this->assertIdentical($this->Controller->EmailTest->bcc, array());
+ $this->assertNull($this->Controller->EmailTest->subject);
+ $this->assertNull($this->Controller->EmailTest->additionalParams);
+ $this->assertIdentical($this->Controller->EmailTest->getHeaders(), array());
+ $this->assertNull($this->Controller->EmailTest->getBoundary());
+ $this->assertIdentical($this->Controller->EmailTest->getMessage(), array());
+ $this->assertNull($this->Controller->EmailTest->smtpError);
+ }
/**
* osFix method
*
From 9ab6339392d8f08eed150db553d0faaf2f64dd99 Mon Sep 17 00:00:00 2001
From: gwoo
Date: Sat, 25 Apr 2009 01:06:46 +0000
Subject: [PATCH 56/67] fixes #6240, DboOracle: fix cache sources and php
version compatibility
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8154 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/model/datasources/dbo/dbo_oracle.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cake/libs/model/datasources/dbo/dbo_oracle.php b/cake/libs/model/datasources/dbo/dbo_oracle.php
index d35b5900a..f7ec6f06e 100644
--- a/cake/libs/model/datasources/dbo/dbo_oracle.php
+++ b/cake/libs/model/datasources/dbo/dbo_oracle.php
@@ -454,6 +454,7 @@ class DboOracle extends DboSource {
while($r = $this->fetchRow()) {
$sources[] = strtolower($r[0]['name']);
}
+ parent::listSources($sources);
return $sources;
}
/**
@@ -834,8 +835,7 @@ class DboOracle extends DboSource {
switch($column) {
case 'date':
- $date = new DateTime($data);
- $data = $date->format('Y-m-d H:i:s');
+ $data = date('Y-m-d H:i:s', strtotime($data));
$data = "TO_DATE('$data', 'YYYY-MM-DD HH24:MI:SS')";
break;
case 'integer' :
From 8bb11e49d7fb1fb708caba36b3ede5c35e6f424a Mon Sep 17 00:00:00 2001
From: jperras
Date: Sat, 25 Apr 2009 01:17:21 +0000
Subject: [PATCH 57/67] Fixing counterCache behavior when updating an existing
record's counterScope value. Thanks for the patch, mattcurry. Fixes #6270.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8155 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/model/model.php | 17 ++++++++---------
cake/tests/cases/libs/model/model.test.php | 4 ++++
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/cake/libs/model/model.php b/cake/libs/model/model.php
index 5238bb242..1becede48 100644
--- a/cake/libs/model/model.php
+++ b/cake/libs/model/model.php
@@ -1374,16 +1374,15 @@ class Model extends Overloadable {
$conditions = ($recursive == 1) ? (array)$assoc['counterScope'] : array();
if (isset($keys['old'][$foreignKey])) {
- if ($keys['old'][$foreignKey] == $keys[$foreignKey]) {
- continue;
+ if ($keys['old'][$foreignKey] != $keys[$foreignKey]) {
+ $conditions[$fkQuoted] = $keys['old'][$foreignKey];
+ $count = intval($this->find('count', compact('conditions', 'recursive')));
+
+ $this->{$parent}->updateAll(
+ array($assoc['counterCache'] => $count),
+ array($this->{$parent}->escapeField() => $keys['old'][$foreignKey])
+ );
}
- $conditions[$fkQuoted] = $keys['old'][$foreignKey];
- $count = intval($this->find('count', compact('conditions', 'recursive')));
-
- $this->{$parent}->updateAll(
- array($assoc['counterCache'] => $count),
- array($this->{$parent}->escapeField() => $keys['old'][$foreignKey])
- );
}
$conditions[$fkQuoted] = $keys[$foreignKey];
diff --git a/cake/tests/cases/libs/model/model.test.php b/cake/tests/cases/libs/model/model.test.php
index 595335172..77149c1cc 100644
--- a/cake/tests/cases/libs/model/model.test.php
+++ b/cake/tests/cases/libs/model/model.test.php
@@ -3990,6 +3990,10 @@ class ModelTest extends CakeTestCase {
$TestModel2->saveField('published', true);
$result = $TestModel->findById(1);
$this->assertIdentical($result['Syfile']['item_count'], '2');
+
+ $TestModel2->save(array('id' => 1, 'syfile_id' => 1, 'published'=> false));
+ $result = $TestModel->findById(1);
+ $this->assertIdentical($result['Syfile']['item_count'], '1');
}
/**
* testDel method
From b68c78fc0f86f669027dc90cdc09dbde999ba4e3 Mon Sep 17 00:00:00 2001
From: mark_story
Date: Sat, 25 Apr 2009 02:16:05 +0000
Subject: [PATCH 58/67] Fixing lost querystring params when user request
without a session is performed. Test case updated. Fixes #6211
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8156 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/controller/components/auth.php | 5 +++++
cake/tests/cases/libs/controller/components/auth.test.php | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/cake/libs/controller/components/auth.php b/cake/libs/controller/components/auth.php
index d2f2bede9..a8744ce25 100644
--- a/cake/libs/controller/components/auth.php
+++ b/cake/libs/controller/components/auth.php
@@ -337,6 +337,11 @@ class AuthComponent extends Object {
if (!$this->user()) {
if (!$this->RequestHandler->isAjax()) {
$this->Session->setFlash($this->authError, 'default', array(), 'auth');
+ if (!empty($controller->params['url']) && count($controller->params['url']) >= 2) {
+ $query = $controller->params['url'];
+ unset($query['url']);
+ $url .= Router::queryString($query, array());
+ }
$this->Session->write('Auth.redirect', $url);
$controller->redirect($loginAction);
return false;
diff --git a/cake/tests/cases/libs/controller/components/auth.test.php b/cake/tests/cases/libs/controller/components/auth.test.php
index e65ec4c08..3cdb25bb7 100644
--- a/cake/tests/cases/libs/controller/components/auth.test.php
+++ b/cake/tests/cases/libs/controller/components/auth.test.php
@@ -841,7 +841,7 @@ class AuthTest extends CakeTestCase {
// QueryString parameters
$_back = $_GET;
$_GET = array(
- 'url' => '/posts/index/29?print=true&refer=menu',
+ 'url' => '/posts/index/29',
'print' => 'true',
'refer' => 'menu'
);
From c8cf1a2c5bed17c6c24df5484a957abf354bde3a Mon Sep 17 00:00:00 2001
From: mark_story
Date: Tue, 28 Apr 2009 01:32:20 +0000
Subject: [PATCH 59/67] Updating __mergeVars to correctly merge parent and
child component configurations. Applied patch from 'neilcrookes'. Test case
added. Fixes #6325
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8157 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/controller/controller.php | 2 +-
.../cases/libs/controller/controller.test.php | 16 ++++++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/cake/libs/controller/controller.php b/cake/libs/controller/controller.php
index 19a9aef76..5c33e1a49 100644
--- a/cake/libs/controller/controller.php
+++ b/cake/libs/controller/controller.php
@@ -393,7 +393,7 @@ class Controller extends Object {
if ($var === 'components') {
$normal = Set::normalize($this->{$var});
$app = Set::normalize($appVars[$var]);
- $this->{$var} = Set::merge($normal, $app);
+ $this->{$var} = Set::merge($app, $normal);
} else {
$this->{$var} = Set::merge($this->{$var}, array_diff($appVars[$var], $this->{$var}));
}
diff --git a/cake/tests/cases/libs/controller/controller.test.php b/cake/tests/cases/libs/controller/controller.test.php
index 53b1663ed..8c7b3204c 100644
--- a/cake/tests/cases/libs/controller/controller.test.php
+++ b/cake/tests/cases/libs/controller/controller.test.php
@@ -940,6 +940,22 @@ class ControllerTest extends CakeTestCase {
$this->assertTrue(isset($TestController->ControllerPost));
$this->assertTrue(isset($TestController->ControllerComment));
}
+/**
+ * test that options from child classes replace those in the parent classes.
+ *
+ * @access public
+ * @return void
+ **/
+ function testChildComponentOptionsSupercedeParents() {
+ if ($this->skipIf(defined('APP_CONTROLLER_EXISTS'), '%s Need a non-existent AppController')) {
+ return;
+ }
+ $TestController =& new TestController();
+ $expected = array('foo');
+ $TestController->components = array('Cookie' => $expected);
+ $TestController->constructClasses();
+ $this->assertEqual($TestController->components['Cookie'], $expected);
+ }
/**
* Ensure that __mergeVars is not being greedy and merging with
* AppController when you make an instance of Controller
From 9f15226e4605ba4b6c5ba918b64d7209ceb77540 Mon Sep 17 00:00:00 2001
From: nate
Date: Tue, 28 Apr 2009 13:23:37 +0000
Subject: [PATCH 60/67] Fixes #6318: Incorrect whitespace handling/parsing of
XML documents
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8158 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/xml.php | 3 ++-
cake/tests/cases/libs/xml.test.php | 24 ++++++++++++++++++++++++
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/cake/libs/xml.php b/cake/libs/xml.php
index b4edf2fff..845068514 100644
--- a/cake/libs/xml.php
+++ b/cake/libs/xml.php
@@ -880,10 +880,11 @@ class Xml extends XmlNode {
*/
function parse() {
$this->__initParser();
+ $this->__rawData = trim($this->__rawData);
$this->__header = trim(str_replace(
a('<' . '?', '?' . '>'),
a('', ''),
- substr(trim($this->__rawData), 0, strpos($this->__rawData, "\n"))
+ substr($this->__rawData, 0, strpos($this->__rawData, '?' . '>'))
));
xml_parse_into_struct($this->__parser, $this->__rawData, $vals);
diff --git a/cake/tests/cases/libs/xml.test.php b/cake/tests/cases/libs/xml.test.php
index f452b54df..eec558641 100644
--- a/cake/tests/cases/libs/xml.test.php
+++ b/cake/tests/cases/libs/xml.test.php
@@ -389,6 +389,30 @@ class XmlTest extends CakeTestCase {
$result = $node->removeAttribute('missing');
$this->assertFalse($result);
}
+
+ /**
+ * Tests that XML documents with non-standard spacing (i.e. leading whitespace, whole document
+ * on one line) still parse properly.
+ *
+ * @return void
+ */
+ function testParsingWithNonStandardWhitespace() {
+ $raw = '1.0';
+ $array = array('Prices' => array('price' => 1.0));
+
+ $xml = new Xml($raw);
+ $this->assertEqual($xml->toArray(), $array);
+ $this->assertEqual($xml->__header, 'xml version="1.0" encoding="ISO-8859-1"');
+
+ $xml = new Xml(' ' . $raw);
+ $this->assertEqual($xml->toArray(), $array);
+ $this->assertEqual($xml->__header, 'xml version="1.0" encoding="ISO-8859-1"');
+
+ $xml = new Xml("\n" . $raw);
+ $this->assertEqual($xml->toArray(), $array);
+ $this->assertEqual($xml->__header, 'xml version="1.0" encoding="ISO-8859-1"');
+ }
+
/* Not implemented yet */
/* function testChildFilter() {
$input = array(
From 48386b791f61e1ce8f99e1198c09a36de3059635 Mon Sep 17 00:00:00 2001
From: "renan.saddam"
Date: Tue, 28 Apr 2009 22:20:04 +0000
Subject: [PATCH 61/67] Fixing cake_test_fixture and dbo_mssql tests. Refs
#6135.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8159 3807eeeb-6ff5-0310-8944-8be069107fe0
---
.../cases/libs/cake_test_fixture.test.php | 4 +--
.../model/datasources/dbo/dbo_mssql.test.php | 29 +------------------
2 files changed, 3 insertions(+), 30 deletions(-)
diff --git a/cake/tests/cases/libs/cake_test_fixture.test.php b/cake/tests/cases/libs/cake_test_fixture.test.php
index 5e17ed25b..03a712a56 100644
--- a/cake/tests/cases/libs/cake_test_fixture.test.php
+++ b/cake/tests/cases/libs/cake_test_fixture.test.php
@@ -51,8 +51,8 @@ class CakeTestFixtureTestFixture extends CakeTestFixture {
*/
var $fields = array(
'id' => array('type' => 'integer', 'key' => 'primary'),
- 'name' => array('type' => 'text', 'length' => '255'),
- 'created' => array('type' => 'datetime'),
+ 'name' => array('type' => 'string', 'length' => '255'),
+ 'created' => array('type' => 'datetime')
);
/**
* Records property
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
index d2c3411f7..319f2f134 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
@@ -36,32 +36,6 @@ require_once LIBS.'model'.DS.'datasources'.DS.'dbo'.DS.'dbo_mssql.php';
* @subpackage cake.tests.cases.libs.model.datasources.dbo
*/
class DboMssqlTestDb extends DboMssql {
-/**
- * Contructor
- *
- * @return void
- * @access public
- */
- function __construct() {
- }
-/**
- * connect method
- *
- * @return boolean
- * @access public
- */
- function connect() {
- $this->connected = true;
- return true;
- }
-/**
- * lastError method
- *
- * @return void
- * @access public
- */
- function lastError() {
- }
/**
* simulated property
*
@@ -346,10 +320,9 @@ class DboMssqlTest extends CakeTestCase {
* @access public
*/
function testUpdateAllSyntax() {
- $model = ClassRegistry::init('MssqlTestModel');
$fields = array('MssqlTestModel.client_id' => '[MssqlTestModel].[client_id] + 1');
$conditions = array('MssqlTestModel.updated <' => date('2009-01-01 00:00:00'));
- $this->db->update($model, $fields, null, $conditions);
+ $this->db->update($this->model, $fields, null, $conditions);
$result = $this->db->getLastQuery();
$this->assertNoPattern('/MssqlTestModel/', $result);
From 7eaf331213a13f6263d17e45d947dae6adad46e4 Mon Sep 17 00:00:00 2001
From: mark_story
Date: Wed, 29 Apr 2009 12:40:15 +0000
Subject: [PATCH 62/67] Updating doc block for FormHelper::input(). Fixes #6328
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8160 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/view/helpers/form.php | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/cake/libs/view/helpers/form.php b/cake/libs/view/helpers/form.php
index 2a4ff3420..5cff4816d 100644
--- a/cake/libs/view/helpers/form.php
+++ b/cake/libs/view/helpers/form.php
@@ -559,7 +559,8 @@ class FormHelper extends AppHelper {
/**
* Generates a form input element complete with label and wrapper div
*
- * Options - See each field type method for more information.
+ * Options - See each field type method for more information. Any options that are part of
+ * $attributes or $options for the different type methods can be included in $options for input().
*
* - 'type' - Force the type of widget you want. e.g. ```type => 'select'```
* - 'label' - control the label
From 975ddaa4be67da028ea9f34d774852ff2c98cb73 Mon Sep 17 00:00:00 2001
From: "renan.saddam"
Date: Wed, 29 Apr 2009 16:26:03 +0000
Subject: [PATCH 63/67] Fixes #6135: Primary Key detection and load record
fixtures on mssql. Tests added.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8161 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/libs/model/datasources/datasource.php | 9 ++-
cake/libs/model/datasources/dbo/dbo_mssql.php | 60 ++++++++++++--
.../model/datasources/dbo/dbo_mssql.test.php | 79 +++++++++++++------
3 files changed, 114 insertions(+), 34 deletions(-)
diff --git a/cake/libs/model/datasources/datasource.php b/cake/libs/model/datasources/datasource.php
index 6736f62a6..4fa8fba2e 100644
--- a/cake/libs/model/datasources/datasource.php
+++ b/cake/libs/model/datasources/datasource.php
@@ -241,13 +241,14 @@ class DataSource extends Object {
if ($this->cacheSources === false) {
return null;
}
- if (isset($this->__descriptions[$model->tablePrefix . $model->table])) {
- return $this->__descriptions[$model->tablePrefix . $model->table];
+ $table = $this->fullTableName($model, false);
+ if (isset($this->__descriptions[$table])) {
+ return $this->__descriptions[$table];
}
- $cache = $this->__cacheDescription($model->tablePrefix . $model->table);
+ $cache = $this->__cacheDescription($table);
if ($cache !== null) {
- $this->__descriptions[$model->tablePrefix . $model->table] =& $cache;
+ $this->__descriptions[$table] =& $cache;
return $cache;
}
return null;
diff --git a/cake/libs/model/datasources/dbo/dbo_mssql.php b/cake/libs/model/datasources/dbo/dbo_mssql.php
index 88938ba3b..c1bbd9e9c 100644
--- a/cake/libs/model/datasources/dbo/dbo_mssql.php
+++ b/cake/libs/model/datasources/dbo/dbo_mssql.php
@@ -221,7 +221,7 @@ class DboMssql extends DboSource {
'null' => (strtoupper($column[0]['Null']) == 'YES'),
'default' => preg_replace("/^[(]{1,2}'?([^')]*)?'?[)]{1,2}$/", "$1", $column[0]['Default']),
'length' => intval($column[0]['Length']),
- 'key' => ($column[0]['Key'] == '1')
+ 'key' => ($column[0]['Key'] == '1') ? 'primary' : false
);
if ($fields[$field]['default'] === 'null') {
$fields[$field]['default'] = null;
@@ -341,17 +341,18 @@ class DboMssql extends DboSource {
if (!empty($values)) {
$fields = array_combine($fields, $values);
}
+ $primaryKey = $this->_getPrimaryKey($model);
- if (array_key_exists($model->primaryKey, $fields)) {
- if (empty($fields[$model->primaryKey])) {
- unset($fields[$model->primaryKey]);
+ if (array_key_exists($primaryKey, $fields)) {
+ if (empty($fields[$primaryKey])) {
+ unset($fields[$primaryKey]);
} else {
- $this->_execute("SET IDENTITY_INSERT " . $this->fullTableName($model) . " ON");
+ $this->_execute('SET IDENTITY_INSERT ' . $this->fullTableName($model) . ' ON');
}
}
$result = parent::create($model, array_keys($fields), array_values($fields));
- if (array_key_exists($model->primaryKey, $fields) && !empty($fields[$model->primaryKey])) {
- $this->_execute("SET IDENTITY_INSERT " . $this->fullTableName($model) . " OFF");
+ if (array_key_exists($primaryKey, $fields) && !empty($fields[$primaryKey])) {
+ $this->_execute('SET IDENTITY_INSERT ' . $this->fullTableName($model) . ' OFF');
}
return $result;
}
@@ -631,6 +632,29 @@ class DboMssql extends DboSource {
return false;
}
}
+/**
+ * Inserts multiple values into a table
+ *
+ * @param string $table
+ * @param string $fields
+ * @param array $values
+ * @access protected
+ */
+ function insertMulti($table, $fields, $values) {
+ $primaryKey = $this->_getPrimaryKey($table);
+ $hasPrimaryKey = $primaryKey != null && (
+ (is_array($fields) && in_array($primaryKey, $fields)
+ || (is_string($fields) && strpos($fields, $this->startQuote . $primaryKey . $this->endQuote) !== false))
+ );
+
+ if ($hasPrimaryKey) {
+ $this->_execute('SET IDENTITY_INSERT ' . $this->fullTableName($table) . ' ON');
+ }
+ parent::insertMulti($table, $fields, $values);
+ if ($hasPrimaryKey) {
+ $this->_execute('SET IDENTITY_INSERT ' . $this->fullTableName($table) . ' OFF');
+ }
+ }
/**
* Generate a database-native column schema string
*
@@ -680,5 +704,27 @@ class DboMssql extends DboSource {
}
return $join;
}
+/**
+ * Makes sure it will return the primary key
+ *
+ * @param mixed $model
+ * @access protected
+ * @return string
+ */
+ function _getPrimaryKey($model) {
+ if (is_object($model)) {
+ $schema = $model->schema();
+ } else {
+ $schema = $this->describe($model);
+ }
+
+ foreach ($schema as $field => $props) {
+ if (isset($props['key']) && $props['key'] == 'primary') {
+ return $field;
+ }
+ }
+
+ return null;
+ }
}
?>
\ No newline at end of file
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
index 319f2f134..c92a67e9d 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
@@ -94,6 +94,16 @@ class DboMssqlTestDb extends DboMssql {
function getLastQuery() {
return $this->simulated[count($this->simulated) - 1];
}
+/**
+ * getPrimaryKey method
+ *
+ * @param mixed $model
+ * @access public
+ * @return void
+ */
+ function getPrimaryKey($model) {
+ return parent::_getPrimaryKey($model);
+ }
}
/**
* MssqlTestModel class
@@ -116,6 +126,32 @@ class MssqlTestModel extends Model {
* @access public
*/
var $useTable = false;
+/**
+ * _schema property
+ *
+ * @var array
+ * @access protected
+ */
+ var $_schema = array(
+ 'id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8', 'key' => 'primary'),
+ 'client_id' => array('type' => 'integer', 'null' => '', 'default' => '0', 'length' => '11'),
+ 'name' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'),
+ 'login' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'),
+ 'passwd' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '255'),
+ 'addr_1' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '255'),
+ 'addr_2' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '25'),
+ 'zip_code' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
+ 'city' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
+ 'country' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
+ 'phone' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
+ 'fax' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
+ 'url' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '255'),
+ 'email' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
+ 'comments' => array('type' => 'text', 'null' => '1', 'default' => '', 'length' => ''),
+ 'last_login'=> array('type' => 'datetime', 'null' => '1', 'default' => '', 'length' => ''),
+ 'created' => array('type' => 'date', 'null' => '1', 'default' => '', 'length' => ''),
+ 'updated' => array('type' => 'datetime', 'null' => '1', 'default' => '', 'length' => null)
+ );
/**
* find method
*
@@ -143,33 +179,14 @@ class MssqlTestModel extends Model {
return $conditions;
}
/**
- * schema method
+ * setSchema method
*
+ * @param array $schema
* @access public
* @return void
*/
- function schema() {
- $this->_schema = array(
- 'id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'),
- 'client_id' => array('type' => 'integer', 'null' => '', 'default' => '0', 'length' => '11'),
- 'name' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'),
- 'login' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'),
- 'passwd' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '255'),
- 'addr_1' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '255'),
- 'addr_2' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '25'),
- 'zip_code' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
- 'city' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
- 'country' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
- 'phone' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
- 'fax' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
- 'url' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '255'),
- 'email' => array('type' => 'string', 'null' => '1', 'default' => '', 'length' => '155'),
- 'comments' => array('type' => 'text', 'null' => '1', 'default' => '', 'length' => ''),
- 'last_login'=> array('type' => 'datetime', 'null' => '1', 'default' => '', 'length' => ''),
- 'created' => array('type' => 'date', 'null' => '1', 'default' => '', 'length' => ''),
- 'updated' => array('type' => 'datetime', 'null' => '1', 'default' => '', 'length' => null)
- );
- return $this->_schema;
+ function setSchema($schema) {
+ $this->_schema = $schema;
}
}
/**
@@ -329,5 +346,21 @@ class DboMssqlTest extends CakeTestCase {
$this->assertPattern('/^UPDATE \[mssql_test_models\]/', $result);
$this->assertPattern('/SET \[client_id\] = \[client_id\] \+ 1/', $result);
}
+/**
+ * testGetPrimaryKey method
+ *
+ * @return void
+ * @access public
+ */
+ function testGetPrimaryKey() {
+ $result = $this->db->getPrimaryKey($this->model);
+ $this->assertEqual($result, 'id');
+
+ $schema = $this->model->schema();
+ unset($schema['id']['key']);
+ $this->model->setSchema($schema);
+ $result = $this->db->getPrimaryKey($this->model);
+ $this->assertNull($result);
+ }
}
?>
\ No newline at end of file
From f25cf632066cc840cabf6e915258e0e040285bef Mon Sep 17 00:00:00 2001
From: "renan.saddam"
Date: Wed, 29 Apr 2009 16:39:42 +0000
Subject: [PATCH 64/67] Adding missing test from last commit.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8162 3807eeeb-6ff5-0310-8944-8be069107fe0
---
.../model/datasources/dbo/dbo_mssql.test.php | 31 +++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
index c92a67e9d..1cd3268fa 100644
--- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
+++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php
@@ -362,5 +362,36 @@ class DboMssqlTest extends CakeTestCase {
$result = $this->db->getPrimaryKey($this->model);
$this->assertNull($result);
}
+/**
+ * testInsertMulti
+ *
+ * @return void
+ * @access public
+ */
+ function testInsertMulti() {
+ $fields = array('id', 'name', 'login');
+ $values = array('(1, \'Larry\', \'PhpNut\')', '(2, \'Renan\', \'renan.saddam\')');
+ $this->db->simulated = array();
+ $this->db->insertMulti($this->model, $fields, $values);
+ $result = $this->db->simulated;
+ $expected = array(
+ 'SET IDENTITY_INSERT [mssql_test_models] ON',
+ 'INSERT INTO [mssql_test_models] ([id], [name], [login]) VALUES (1, \'Larry\', \'PhpNut\')',
+ 'INSERT INTO [mssql_test_models] ([id], [name], [login]) VALUES (2, \'Renan\', \'renan.saddam\')',
+ 'SET IDENTITY_INSERT [mssql_test_models] OFF'
+ );
+ $this->assertEqual($result, $expected);
+
+ $fields = array('name', 'login');
+ $values = array('(\'Larry\', \'PhpNut\')', '(\'Renan\', \'renan.saddam\')');
+ $this->db->simulated = array();
+ $this->db->insertMulti($this->model, $fields, $values);
+ $result = $this->db->simulated;
+ $expected = array(
+ 'INSERT INTO [mssql_test_models] ([name], [login]) VALUES (\'Larry\', \'PhpNut\')',
+ 'INSERT INTO [mssql_test_models] ([name], [login]) VALUES (\'Renan\', \'renan.saddam\')'
+ );
+ $this->assertEqual($result, $expected);
+ }
}
?>
\ No newline at end of file
From cf3f92c402a79baa04e831fa83a84871745f05d5 Mon Sep 17 00:00:00 2001
From: mark_story
Date: Thu, 30 Apr 2009 23:38:14 +0000
Subject: [PATCH 65/67] Updating testsuite console to search $pluginPaths for
plugins. Fixing readability of help in 80 col displays. Fixes #6329.
git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8163 3807eeeb-6ff5-0310-8944-8be069107fe0
---
cake/console/libs/testsuite.php | 50 +++++++++++++++++++--------------
1 file changed, 29 insertions(+), 21 deletions(-)
diff --git a/cake/console/libs/testsuite.php b/cake/console/libs/testsuite.php
index 72cefbcc2..b11a7ea11 100644
--- a/cake/console/libs/testsuite.php
+++ b/cake/console/libs/testsuite.php
@@ -156,30 +156,30 @@ class TestSuiteShell extends Shell {
function help() {
$this->out('Usage: ');
$this->out("\tcake testsuite category test_type file");
- $this->out("\t\t - category - \"app\", \"core\" or name of a plugin");
- $this->out("\t\t - test_type - \"case\", \"group\" or \"all\"");
- $this->out("\t\t - test_file - file name with folder prefix and without the (test|group).php suffix");
+ $this->out("\t\t- category - \"app\", \"core\" or name of a plugin");
+ $this->out("\t\t- test_type - \"case\", \"group\" or \"all\"");
+ $this->out("\t\t- test_file - file name with folder prefix and without the (test|group).php suffix");
$this->out('');
$this->out('Examples: ');
- $this->out("\t\t cake testsuite app all");
- $this->out("\t\t cake testsuite core all");
+ $this->out("\t\tcake testsuite app all");
+ $this->out("\t\tcake testsuite core all");
$this->out('');
- $this->out("\t\t cake testsuite app case behaviors/debuggable");
- $this->out("\t\t cake testsuite app case models/my_model");
- $this->out("\t\t cake testsuite app case controllers/my_controller");
+ $this->out("\t\tcake testsuite app case behaviors/debuggable");
+ $this->out("\t\tcake testsuite app case models/my_model");
+ $this->out("\t\tcake testsuite app case controllers/my_controller");
$this->out('');
- $this->out("\t\t cake testsuite core case file");
- $this->out("\t\t cake testsuite core case router");
- $this->out("\t\t cake testsuite core case set");
+ $this->out("\t\tcake testsuite core case file");
+ $this->out("\t\tcake testsuite core case router");
+ $this->out("\t\tcake testsuite core case set");
$this->out('');
- $this->out("\t\t cake testsuite app group mygroup");
- $this->out("\t\t cake testsuite core group acl");
- $this->out("\t\t cake testsuite core group socket");
+ $this->out("\t\tcake testsuite app group mygroup");
+ $this->out("\t\tcake testsuite core group acl");
+ $this->out("\t\tcake testsuite core group socket");
$this->out('');
- $this->out("\t\t cake testsuite bugs case models/bug // for the plugin 'bugs' and its test case 'bug'");
- $this->out("\t\t cake testsuite bugs group bug // for the plugin bugs and its test group 'bug'");
- $this->out("\t\t cake testsuite bugs_me case models/bug // for the plugin 'bugs_me' and its test case 'bug'");
- $this->out("\t\t cake testsuite bugs_me group bug // for the plugin bugs_me and its test group 'bug'");
+ $this->out("\t\tcake testsuite bugs case models/bug");
+ $this->out("\t\t // for the plugin 'bugs' and its test case 'models/bug'");
+ $this->out("\t\tcake testsuite bugs group bug");
+ $this->out("\t\t // for the plugin bugs and its test group 'bug'");
$this->out('');
$this->out('Code Coverage Analysis: ');
$this->out("\n\nAppend 'cov' to any of the above in order to enable code coverage analysis");
@@ -312,11 +312,19 @@ class TestSuiteShell extends Shell {
);
if (array_key_exists($category, $paths)) {
- $folder = $paths[$category];
+ $folder = $paths[$category] . 'tests';
} else {
- $folder = APP.'plugins'.DS.Inflector::underscore($category).DS;
+ $scoredCategory = Inflector::underscore($category);
+ $folder = APP . 'plugins' . DS . $scoredCategory . DS;
+ $pluginPaths = Configure::read('pluginPaths');
+ foreach ($pluginPaths as $path) {
+ if (file_exists($path . $scoredCategory . DS . 'tests')) {
+ $folder = $path . $scoredCategory . DS . 'tests';
+ break;
+ }
+ }
}
- return $folder.'tests';
+ return $folder;
}
/**
* Sets some get vars needed for TestManager
From 38b7a34a8e74aeb7324febde4d10a9b87854bb83 Mon Sep 17 00:00:00 2001
From: gwoo
Date: Fri, 1 May 2009 08:24:24 -0700
Subject: [PATCH 66/67] adding gitignore with "vendors"
---
.gitignore | 1 +
1 file changed, 1 insertion(+)
create mode 100644 .gitignore
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..1562dcf95
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+vendors
\ No newline at end of file
From 5cf96a077a6b0e85969d71ebbd19f9d1414e3eb5 Mon Sep 17 00:00:00 2001
From: gwoo
Date: Fri, 1 May 2009 10:52:14 -0700
Subject: [PATCH 67/67] adding app/tmp to gitignore
---
.gitignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.gitignore b/.gitignore
index 1562dcf95..cfc5c7a4b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
+app/tmp
vendors
\ No newline at end of file